CREATE ASSEMBLY (Transact-SQL)
Создает управляемый модуль приложений, содержащий метаданные класса и управляемый код, например объект в экземпляре SQL Server. Ссылаясь на этот модуль, в базе данных можно создать функции среды CLR, хранимые процедуры CLR, триггеры CLR, пользовательские статистические вычисления и пользовательские типы.
Синтаксис
CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ ,...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> :: =
'[\\computer_name\]share_name\[path\]manifest_file_name'
| '[local_path\]manifest_file_name'
<assembly_bits> :: =
{ varbinary_literal | varbinary_expression }
Аргументы
assembly_name
Имя сборки. Имя должно быть уникально в базе данных и являться правильным идентификатором.AUTHORIZATION owner_name
Указывает имя пользователя или роли в качестве владельца сборки. Аргумент owner_name должен быть либо именем роли, членом которой является текущий пользователь, либо текущий пользователь должен иметь разрешение на IMPERSONATE пользователя owner_name. Если атрибут не указан, владельцем становится текущий пользователь.<client_assembly_specifier>
Задает локальный путь или местоположение в сети, где расположена передаваемая сборка, а также имя файла манифеста, соответствующее сборке. <client_assembly_specifier> может быть задано в виде фиксированной строки или выражения с переменными, в результате подстановки значений которых получается фиксированная строка. CREATE ASSEMBLY не поддерживает передачу многомодульных сборок. SQL Server также ищет любые зависимые сборки данной сборки в том же месте и передает их с тем же владельцем в качестве сборки корневого уровня. Если зависимые сборки не найдены и если они уже не загружены в текущую базу данных, CREATE ASSEMBLY завершается неудачно. Если зависимые сборки уже загружены в текущую базу данных, владелец этих сборок должен быть тот же, что и у только что созданной сборки.<client_assembly_specifier> не может быть задано, если у пользователя, совершившего вход, заимствуются права.
<assembly_bits>
Список двоичных значений, которые составляют сборку и ее зависимые сборки. Первое значение в списке считается сборкой корневого уровня. Значения, соответствующие зависимым сборкам, могут быть заданы в любом порядке. Любые значения, которые не соответствует зависимостям корневой сборки, не учитываются.varbinary_literal
Литерал varbinary.varbinary_expression
Выражение типа varbinary.PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }
Указывает набор разрешений доступа к коду, которые предоставляются сборке при доступе к ней SQL Server. Если этот аргумент не задан, по умолчанию применяется SAFE.Мы рекомендуем использовать SAFE. SAFE является наиболее ограниченным набором разрешений. Код, исполняемый с разрешениями SAFE, не может получить доступ к внешним системным ресурсам, таким как файлы, сеть, переменные окружения или реестр.
EXTERNAL_ACCESS позволяет сборкам получать доступ к внешним системным ресурсам, таким как файлы, сети, переменные окружения и реестр.
UNSAFE предоставляет сборкам неограниченный доступ к ресурсам как внутри, так и вне экземпляра SQL Server. Код, исполняемый из сборки с набором прав UNSAFE, может вызывать неуправляемый код.
Примечание по безопасности SAFE является рекомендованной установкой разрешений для сборок, которые выполняют задачи вычисления и управления данными без доступа к ресурсам вне SQL Server.
Мы рекомендуем использовать EXTERNAL_ACCESS для сборок, которым необходим доступ к ресурсам вне экземпляра SQL Server. Сборки с набором прав EXTERNAL_ACCESS включают надежность и гибкость сборок с набором прав SAFE, но с точки зрения безопасности похожи на сборки с набором прав UNSAFE, потому как сборки с набором прав EXTERNAL_ACCESS запускаются по умолчанию из-под учетной записи службы SQL Server и получают доступ к внешним ресурсам из-под этой учетной записи, если только код явно не олицетворяет разрешения вызывающего. Поэтому разрешения на создание сборок EXTERNAL_ACCESS должны быть предоставлены только именам входа, которым разрешено выполнение кода из-под учетной записи службы SQL Server. Дополнительные сведения о заимствовании прав см. в разделе Безопасность интеграции со средой CLR.
Задание UNSAFE предоставляет коду в сборке полную свободу выполнять операции в операционном пространстве SQL Server, что потенциально может нанести вред надежности SQL Server. Сборки UNSAFE потенциально могут подвергнуть опасности систему безопасности SQL Server или среды CLR. Разрешения UNSAFE должны предоставляться только высоконадежным сборкам. Только члены предопределенной роли сервера sysadmin могут создавать и изменять сборки с набором разрешений UNSAFE.
Дополнительные сведения о наборах разрешений сборки см. в разделе Конструирование сборок.
Замечания
CREATE ASSEMBLY передает сборку, предварительно скомпилированную в виде файла DLL из управляемого кода для использования внутри экземпляра SQL Server.
SQL Server не дает возможность регистрировать различные версии сборок с одинаковыми именами, культурой и открытыми ключами.
При попытке доступа к сборке, указанной в <client_assembly_specifier>, SQL Server олицетворяет разрешения контекста безопасности текущего имени входа Windows. Если <client_assembly_specifier> задает сетевое местоположение (UNC-путь), олицетворение текущего имени входа не распространяется на сетевое местоположение из-за ограничений передачи прав. В этом случае доступ осуществляется при помощи контекста безопасности учетной записи службы SQL Server. Дополнительные сведения см. в разделе Учетные данные (компонент Database Engine).
Кроме корневой сборки, указанной в аргументе assembly_name, SQL Server пытается загрузить сборки, на которые ссылается передаваемая корневая сборка. Если сборка, на которую ссылаются, уже передана в базу данных в ходе предыдущих выполнений инструкций CREATE ASSEMBLY, эта сборка не передается, но становится доступной для корневой сборки. Если зависимая сборка не была предварительно передана, но SQL Server не может обнаружить файл манифеста в исходном каталоге, CREATE ASSEMBLY возвращает ошибку.
Если какая-либо зависимая сборка, на которую ссылается корневая сборка, еще не находится в базе данных и косвенно загружена вместе с корневой сборкой, она будет иметь тот же набор разрешений, что и сборка корневого уровня. Если зависимая сборка должна быть создана с набором разрешений, отличным от набора разрешений сборки корневого уровня, она должна быть передана напрямую перед корневой сборкой с необходимым набором разрешений.
Проверка сборки
SQL Server выполняет проверки двоичных файлов сборки, переданных посредством инструкции CREATE ASSEMBLY для обеспечения следующего.
Двоичный файл сборки является верным с правильными метаданными и сегментами кода, и сегменты кода содержат правильные инструкции промежуточного языка корпорации Майкрософт (MSIL).
Набор системных сборок, на которые она ссылается, является одной из поддерживаемых сборок в SQL Server: Microsoft.Visualbasic.dll, Mscorlib.dll, System.Data.dll, System.dll, System.Xml.dll, Microsoft.Visualc.dll, Custommarshallers.dll, System.Security.dll, System.Web.Services.dll, System.Data.SqlXml.dll, System.Core.dll и System.Xml.Linq.dll. Другие системные сборки могут быть вызваны, но должны быть явно зарегистрированы в базе данных.
Для сборок, созданных с наборами разрешений SAFE или EXTERNAL ACCESS должны быть соблюдены следующие условия.
Код сборки должен быть типизированным. Типовая безопасность устанавливается путем запуска верификатора общеязыковой среды исполнения для сборки.
Сборка не должна содержать элементы статических данных в своих предложениях, только если они не помечены как доступные только для чтения.
Классы в сборке не могут содержать методов финализации.
Классы или методы сборки должны быть аннотированы только разрешенными атрибутами кода. Дополнительные сведения см. в разделе Пользовательские атрибуты для процедур CLR.
Кроме предварительных проверок, которые выполняются при выполнении CREATE ASSEMBLY, существуют дополнительные проверки, которые выполняются во время выполнения кода сборки.
Вызов определенных API-функций Microsoft.NET Framework, которые требуют наличия определенных прав доступа к коду, может завершиться неудачно, если набор прав сборки не включает такого права.
Для сборок SAFE и EXTERNAL_ACCESS любая попытка вызова API-функций .NET Framework, которые аннотированы определенным HostProtectionAttributes, завершится неудачно.
Дополнительные сведения см. в разделе Конструирование сборок.
Разрешения
Требуется наличие разрешения на CREATE ASSEMBLY.
Если указано PERMISSION_SET = EXTERNAL_ACCESS, имя входа SQL Server должен иметь разрешение EXTERNAL ACCESS ASSEMBLY на сервере. Если указано PERMISSION_SET = UNSAFE, необходимо быть членом предопределенной роли сервера sysadmin.
Пользователь должен быть владельцем любой сборки, на которую ссылается загружаемая сборка, если сборка уже существует в базе данных. Чтобы передать сборку, используя путь к файлу, текущий пользователь должен иметь проверенное на подлинность имя входа Windows или быть членом предопределенной роли сервера sysadmin. Имя входа Windows пользователя, который выполняет CREATE ASSEMBLY, должно иметь разрешение чтения общего ресурса и файлов, загружаемых посредством инструкции.
Дополнительные сведения о наборах разрешений сборки см. в разделе Конструирование сборок.
Примеры
Следующий пример предполагает, что компонент SQL Server Database Engine установлен в папку по умолчанию на локальном компьютере и приложение-образец HelloWorld.csproj скомпилировано. Дополнительные сведения см. в разделе Hello World Sample.
DECLARE @SamplesPath nvarchar(1024)
SELECT @SamplesPath = REPLACE(physical_name,
'Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf',
'Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\')
FROM master.sys.database_files
WHERE name = 'master';
CREATE ASSEMBLY HelloWorld
FROM @SamplesPath + 'HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;