CREATE ASSEMBLY (Transact-SQL)

Применимо к:SQL Server Управляемый экземпляр SQL Azure

Создает модуль управляемого приложения, содержащий метаданные класса и управляемый код в качестве объекта в экземпляре SQL Server. Ссылаясь на этот модуль, в базе данных можно создать функции среды CLR, хранимые процедуры CLR, триггеры CLR, определяемые пользователем статистические вычисления и типы.

Предупреждение

Среда CLR использует управление доступом для кода (CAS) в .NET Framework, которое больше не поддерживается в качестве границы безопасности. Сборки среды CLR, созданные с помощью PERMISSION_SET = SAFE, могут получать доступ к внешним системным ресурсам, вызывать неуправляемый код и получать права системного администратора. Начиная с SQL Server 2017 (14.x), sp_configure вызывается clr strict security параметр для повышения безопасности сборок СРЕДЫ CLR. clr strict security включен по умолчанию и рассматривает сборки SAFE и EXTERNAL_ACCESS, как если бы они были помечены UNSAFE. Параметр clr strict security можно отключить для обеспечения обратной совместимости, но это делать не рекомендуется. Корпорация Майкрософт рекомендует подписывать все сборки с помощью сертификата или асимметричного ключа с соответствующим именем входа, которому предоставлено разрешение UNSAFE ASSEMBLY в базе данных master. Дополнительные сведения см. в статье о параметре clr strict security.

Соглашения о синтаксисе Transact-SQL

Синтаксис

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 завершается неудачно. Если зависимые сборки уже загружены в текущую базу данных, владелец этих сборок должен быть тот же, что и у только что созданной сборки.

Важно!

База данных SQL Azure и Управляемый экземпляр SQL Azure не поддерживают создание сборки из файла.

<client_assembly_specifier> не может быть задано, если пользователь, совершивший вход, олицетворяется.

<assembly_bits>
Список двоичных значений, которые составляют сборку и ее зависимые сборки. Первое значение в списке считается сборкой корневого уровня. Значения, соответствующие зависимым сборкам, могут быть заданы в любом порядке. Любые значения, которые не соответствует зависимостям корневой сборки, не учитываются.

Примечание.

Этот параметр недоступен в автономной базе данных.

varbinary_literal
Литерал varbinary.

varbinary_expression
Выражение типа varbinary.

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }

Важно!

На параметр PERMISSION_SET влияет параметр clr strict security, описанный в начальном предупреждении. Когда clr strict security включено, все сборки считаются 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.

Если параметр PERMISSION_SET включен, операторы CREATE ASSEMBLY и ALTER ASSEMBLY игнорируются во время выполнения, а параметры PERMISSION_SET сохраняются в метаданных. Игнорирование параметра минимизирует сбои в выполнении имеющихся в коде операторов.

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 ASSE МБ LY возвращает ошибку.

Если какая-либо зависимая сборка, на которую ссылается корневая сборка, еще не находится в базе данных и косвенно загружена вместе с корневой сборкой, она будет иметь тот же набор разрешений, что и сборка корневого уровня. Если зависимая сборка должна быть создана с набором разрешений, отличным от набора разрешений сборки корневого уровня, она должна быть передана напрямую перед корневой сборкой с необходимым набором разрешений.

Проверка сборки

SQL Server выполняет проверка в двоичных файлах сборки, отправленных инструкцией CREATE ASSE МБ LY, чтобы гарантировать следующее:

  • Двоичный файл сборки является верным с правильными метаданными и сегментами кода, и сегменты кода содержат правильные инструкции промежуточного языка корпорации Майкрософт (MSIL).

  • Набор системных сборок, на которые он ссылается, является одним из следующих поддерживаемых сборок в SQL Server: Microsoft.Visualbasic.dll, Mscorlib.dll, System.Data.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, требуется разрешение EXTERNAL ACCESS ASSE МБ LY на сервере. Если указано PERMISSION_SET = UNSAFE, требуется разрешение UNSAFE ASSEMBLY на сервере.

Пользователь должен быть владельцем любой сборки, на которую ссылается загружаемая сборка, если сборка уже существует в базе данных. Чтобы передать сборку, используя путь к файлу, текущий пользователь должен иметь проверенное на подлинность имя входа Windows или быть членом предопределенной роли сервера sysadmin. Имя входа Windows пользователя, который выполняет CREATE ASSEMBLY, должно иметь разрешение чтения общего ресурса и файлов, загружаемых посредством инструкции.

Разрешения со строгой безопасностью среды CLR

Для создания сборки среды CLR при включении CLR strict security требуются следующие разрешения:

  • Пользователь должен иметь разрешение CREATE ASSEMBLY.
  • И одно из следующих условий также должно быть верным:
    • Сборка должна была подписана сертификатом или асимметричным ключом, имеющим соответствующее имя входа с разрешением UNSAFE ASSEMBLY на сервере. Рекомендуется использовать подпись сборки.
    • База данных имеет TRUSTWORTHY свойство со значением ON и базы данных, принадлежащие имени входа, имеющем разрешение UNSAFE ASSEMBLY на сервере. Использовать этот параметр не рекомендуется.

Дополнительные сведения о наборах разрешений сборки см. в разделе Проектирование сборок.

Примеры

Пример А. Создание сборки из библиотеки dll

Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

В следующем примере предполагается, что примеры SQL Server ядро СУБД установлены в расположении по умолчанию локального компьютера, а пример приложения HelloWorld.csproj компилируется. Дополнительные сведения см. в разделе Образец "Hello World".

CREATE ASSEMBLY HelloWorld   
FROM '<system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'  
WITH PERMISSION_SET = SAFE;  

Важно!

База данных SQL Azure не поддерживает создание сборки на основе файла.

Пример Б. Создание сборки из битов сборки

Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

Замените примеры битов (которые не являются полными или допустимыми) на ваши биты сборки.

CREATE ASSEMBLY HelloWorld  
    FROM 0x4D5A900000000000  
WITH PERMISSION_SET = SAFE;  

См. также

ALTER ASSE МБ LY (Transact-SQL)
DROP ASSE МБ LY (Transact-SQL)
CREATE FUNCTION (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
CREATE TYPE (Transact-SQL)
CREATE AGGREGATE (Transact-SQL)
EVENTDATA (Transact-SQL)
Сценарии использования и примеры интеграции со средой CLR