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.dll
System.Xml.dll
Microsoft.VisualC.dll
System.dll
System.Data.dll
System.Web.Services.dll
System.Data.SqlXml.dll
System.Security.dll
System.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;