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


CREATE ASSEMBLY (Transact-SQL)

Область применения: SQL Server Управляемый экземпляр SQL Azure

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

Соглашения о синтаксисе 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 }

Задает набор разрешений доступа к коду, предоставляемых сборке при доступе к SQL Server. Если значение не указано, SAFE применяется в качестве значения по умолчанию.

Этот PERMISSION_SET параметр зависит от конфигурации сервера: clr strict security option. Когда clr strict security включено, все сборки считаются UNSAFE.

Рекомендуем использовать SAFE. Набор разрешений SAFE является наиболее ограниченным. Код, выполняемый сборкой с SAFE разрешениями, не может получить доступ к ресурсам внешней системы, таким как файлы, сети, переменные среды или реестр.

EXTERNAL_ACCESS позволяет сборкам получать доступ к определенным ресурсам внешней системы, таким как файлы, сети, переменные среды и реестр.

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

SAFE — это рекомендуемый параметр разрешения для сборок, выполняющих задачи вычисления и управления данными без доступа к ресурсам за пределами экземпляра SQL Server.

Примечание.

Параметры EXTERNAL_ACCESS и UNSAFE параметры недоступны в автономной базе данных.

Рекомендуется использовать для сборок, обращаюющихся 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 сборки.

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

Безопасность доступа к коду больше не поддерживается

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

Рекомендуется подписать все сборки сертификатом или асимметричным ключом с соответствующим именем входа, предоставленным UNSAFE ASSEMBLY в master базе данных. Администраторы SQL Server также могут добавлять сборки в список сборок, которым должен доверять ядро СУБД. Дополнительные сведения см. в разделе sys.sp_add_trusted_assembly.

Замечания

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

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

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

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

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

  • Набор системных сборок, на которые он ссылается, является одним из следующих поддерживаемых сборок в SQL Server: Microsoft.VisualBasic.dll, mscorlib.dll, CustomMarshallers.dllSystem.Xml.dllMicrosoft.VisualC.dllSystem.dllSystem.Data.dllSystem.Web.Services.dllSystem.Data.SqlXml.dllSystem.Security.dllSystem.Core.dllи .System.Xml.Linq.dll Можно ссылаться и на другие системные сборки, но они должны быть явно зарегистрированы в базе данных.

  • Для сборок, созданных с помощью SAFE или EXTERNAL ACCESS наборов разрешений:

    • Код сборки должен быть типизированным. Типовая безопасность устанавливается путем запуска верификатора общеязыковой среды исполнения для сборки.

    • Сборка не должна содержать статических элементов данных в своих классах, если они не помечены как доступные только для чтения.

    • Классы в сборке не могут содержать методы завершения.

    • Классы или методы сборки должны быть аннотированы только разрешенными атрибутами кода. Дополнительные сведения см. в разделе интеграции СРЕДЫ CLR: настраиваемые атрибуты для подпрограмм CLR.

Помимо предыдущих проверок, выполняемых при CREATE ASSEMBLY выполнении, существуют дополнительные проверки, выполняемые во время выполнения кода в сборке:

  • Вызов определенных платформа .NET Framework API, требующих определенного разрешения доступа к коду, может завершиться ошибкой, если набор разрешений сборки не включает это разрешение.

  • Для SAFE и EXTERNAL_ACCESS сборок любая попытка вызова платформа .NET Framework API, которые аннотированы с определенными узлами HostProtectionAttributes, завершается сбоем.

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

Разрешения

Требуется разрешение CREATE ASSEMBLY.

Если PERMISSION_SET = EXTERNAL_ACCESS задано, требуется EXTERNAL ACCESS ASSEMBLY разрешение на сервере. Если 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 ядро СУБД установлены в расположении по умолчанию локального компьютера, а 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 не поддерживает создание сборки из файла.

B. Создание сборки из битов сборки

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

CREATE ASSEMBLY HelloWorld
    FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;