Поделиться через


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

Область применения:SQL Server

Управляемые объекты базы данных, например хранимые процедуры или триггеры, компилируются и развертываются в единицах, называемых сборками. Управляемые сборки DLL должны быть зарегистрированы в 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 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 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 базы данных значение ON.

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

Рекомендуется, чтобы свойство базы данных TRUSTWORTHY в базе данных не ON только для выполнения кода среды CLR в процессе сервера. Вместо этого рекомендуется создать асимметричный ключ из файла сборки в базе данных master. Затем необходимо создать имя входа, сопоставленное с этим асимметричным ключом, и имя входа должно быть предоставлено 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.