Создание сборки
Управляемые объекты базы данных, например хранимые процедуры или триггеры, компилируются и развертываются в единицах, называемых сборками. Управляемые 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 в коде сборки выполняются определенные проверки, в результате которых сборка может быть не зарегистрирована на сервере. Дополнительные сведения см. в образце Impersonation на сайте CodePlex и в разделе Образцы компонента SQL Server Database Engine.
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, необходимо, чтобы выполнялось одно из двух следующих условий.
Сборка должна иметь строгое имя, подписанное обычной подписью или кодом Authenticode с сертификатом. Это строгое имя (или удостоверение) создается в SQL Server как ассиметричный ключ (или сертификат) и имеет соответствующую учетную запись с разрешением EXTERNAL ACCESS ASSEMBLY (для сборок внешнего доступа) или UNSAFE ASSEMBLY (для небезопасных сборок).
Владелец базы данных (DBO) имеет разрешение EXTERNAL ACCESS ASSEMBLY (для сборок EXTERNAL ACCESS) или UNSAFE ASSEMBLY (для сборок UNSAFE), а свойство базы данных Свойство базы данных TRUSTWORTHY имеет значение ON.
Два приведенных выше условия также проверяются при загрузке сборки (которая включает выполнение). Чтобы загрузить сборку, должно выполняться хотя бы одно условие.
В базе данных для свойства Свойство базы данных TRUSTWORTHY не рекомендуется устанавливать значение ON только для того, чтобы выполнить код сборки в среде CLR в качестве процесса на сервере. Вместо этого рекомендуется создать асимметричный ключ из файла сборки в главной базе данных. Необходимо создать имя входа, сопоставляемое с этим асимметричным ключом, которому будет предоставлено разрешение EXTERNAL ACCESS ASSEMBLY или UNSAFE ASSEMBLY.
Следующие инструкции Transact-SQL выполняют шаги, необходимые для создания асимметричного ключа, сопоставления с ним имени входа и предоставления разрешения EXTERNAL_ACCESS. Эти инструкции Transact-SQL необходимо выполнить перед выполнением инструкции CREATE ASSEMBLY.
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. Эти инструкции Transact-SQL необходимо выполнить перед выполнением инструкции CREATE ASSEMBLY.
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.