Создание сборки

Применимо к:SQL Server

Управляемые объекты базы данных, например хранимые процедуры или триггеры, компилируются и развертываются в единицах, называемых сборками. Управляемые сборки DLL должны быть зарегистрированы в Microsoft SQL Server, прежде чем можно будет использовать функции, которые предоставляет сборка. Чтобы зарегистрировать сборку в базе данных SQL Server, используйте инструкцию CREATE ASSEMBLY. В этом разделе описывается регистрация сборки с помощью инструкции CREATE ASSEMBLY и способы указания параметров безопасности для сборки.

Инструкция CREATE ASSEMBLY

Инструкция CREATE ASSEMBLY используется для создания сборки в базе данных. Вот пример:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

Предложение FROM задает путь к создаваемой сборке. Путь может указываться в формате UNC или быть локальным физическим путем к файлу.

SQL Server не дает возможность регистрировать различные версии сборок с одинаковыми именами, культурой и открытыми ключами.

Можно создавать сборки, ссылающиеся на другие сборки. При создании сборки в SQL Server SQL Server также создает сборки, на которые ссылается сборка корневого уровня, если указанные сборки еще не созданы в базе данных.

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

Сборка может успешно ссылаться на другие сборки только при следующих условиях.

  • Владельцем сборки, которую вызывает или на которую ссылается пользователь или роль, является этот пользователь или роль.

  • Сборка, которая вызывается или на которую указывает ссылка, была создана в этой базе данных.

Уровни безопасности при создании сборки

При создании сборки в базе данных SQL Server можно указать один из трех разных уровней безопасности, в которых может выполняться код: SAFE, EXTERNAL_ACCESS или UNSAFE. При выполнении инструкции CREATE ASSEMBLY в сборке кода выполняются определенные проверки, которые могут привести к сбою регистрации сборки на сервере.

SAFE является набором разрешений по умолчанию и работает в большинстве сценариев. Чтобы задать определенный уровень безопасности, измените синтаксис инструкции CREATE ASSEMBLY следующим образом.

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = SAFE;  

Можно также создать сборку с набором разрешений SAFE , просто опустив третью строку кода выше:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

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

Создание сборок EXTERNAL_ACCESS и UNSAFE

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

Разрешение UNSAFE для кода предназначено для тех ситуаций, когда сборка не является проверяемой или требует дополнительного доступа к ограниченным ресурсам, таким как API Microsoft Win32.

Чтобы создать сборку EXTERNAL_ACCESS или UNSAFE в SQL Server, необходимо выполнить одно из следующих двух условий:

  1. Сборка должна иметь строгое имя, подписанное обычной подписью или кодом Authenticode с сертификатом. Это строгое имя (или сертификат) создается внутри SQL Server в виде асимметричного ключа (или сертификата) и имеет соответствующее имя входа с разрешением EXTERNAL ACCESS ASSEMBLY (для сборок внешнего доступа) или UNSAFE ASSEMBLY (для небезопасных сборок).

  2. Владелец базы данных (DBO) имеет разрешение EXTERNAL ACCESS ASSEMBLY (для сборок EXTERNAL ACCESS ) или UNSAFE ASSEMBLY (для сборок UNSAFE ), а для свойства TRUSTWORTHY Database задано значение ON.

Два приведенных выше условия также проверяются при загрузке сборки (которая включает выполнение). Чтобы загрузить сборку, должно выполняться хотя бы одно условие.

Рекомендуется не устанавливать для свойства TRUSTWORTHY Database в базе данных значение ON только для выполнения кода среды CLR в серверном процессе. Вместо этого рекомендуется создать асимметричный ключ из файла сборки в главной базе данных. Затем необходимо создать имя входа, сопоставленное с этим асимметричным ключом, и ему должно быть предоставлено разрешение EXTERNAL ACCESS ASSEMBLY или UNSAFE ASSEMBLY .

Следующие инструкции Transact-SQL выполняют действия, необходимые для создания асимметричного ключа, сопоставления имени входа с этим ключом, а затем предоставления имени входа EXTERNAL_ACCESS разрешения. Перед выполнением инструкции CREATE ASSEMBLY необходимо выполнить следующие инструкции Transact-SQL.

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey     
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;   
GO   

Примечание

Необходимо создать новое имя входа для сопоставления с асимметричным ключом. Это имя входа используется только для предоставления разрешений и не должно сопоставляться с пользователем или использоваться в приложении.

Чтобы создать сборку EXTERNAL ACCESS , создатель должен иметь разрешение EXTERNAL ACCESS . Оно задается при создании сборки.

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;  

Следующие инструкции Transact-SQL выполняют действия, необходимые для создания асимметричного ключа, сопоставления имени входа с этим ключом, а затем предоставления ему разрешения UNSAFE . Перед выполнением инструкции CREATE ASSEMBLY необходимо выполнить следующие инструкции Transact-SQL.

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey ;    
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin ;  
GO  

Чтобы указать, что сборка загружается с разрешением UNSAFE , укажите набор разрешений UNSAFE при загрузке сборки на сервер:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = UNSAFE;  

Дополнительные сведения о разрешениях для каждого из параметров см. в разделе Безопасность интеграции со средой CLR.

См. также:

Управление сборками интеграции со средой CLR
Изменение сборки
Удаление сборки
Управление доступом для кода на основе интеграции со средой CLR
Свойство базы данных TRUSTWORTHY