Создание сборки
Область применения: 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, необходимо выполнить одно из следующих двух условий:
Сборка должна иметь строгое имя, подписанное обычной подписью или кодом Authenticode с сертификатом. Это строгое имя (или сертификат) создается внутри SQL Server как асимметричный ключ (или сертификат) и имеет соответствующее имя входа с разрешением EXTERNAL ACCESS ASSEMBLY (для сборок внешнего доступа) или разрешением UNSAFE ASSEMBLY (для небезопасных сборок).
Владелец базы данных (DBO) имеет разрешение EXTERNAL ACCESS ASSEMBLY (для сборок EXTERNAL ACCESS) или UNSAFE ASSEMBLY (для сборок UNSAFE), а база данных имеет свойство DATABASE TRUSTWORTHY, заданное в on.
Два приведенных выше условия также проверяются при загрузке сборки (которая включает выполнение). Чтобы загрузить сборку, должно выполняться хотя бы одно условие.
Рекомендуется, чтобы свойство БАЗЫ данных TRUSTWORTHY в базе данных не было задано только для запуска кода среды 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