CREATE EXTERNAL LIBRARY (Transact-SQL)
Область применения: SQL Server 2017 (14.x) и более поздних версий Управляемый экземпляр SQL Azure
Отправляет файлы пакетов R, Python или Java в базу данных из указанного байтового потока или пути к файлу. Эта инструкция служит универсальным механизмом для администратора базы данных для отправки артефактов, необходимых для всех новых внешних языковых сред и платформ ОС, поддерживаемых SQL Server.
Примечание.
В SQL Server 2017 поддерживаются язык R и платформа Windows. R, Python и внешние языки на платформах Windows и Linux поддерживаются в SQL Server 2019 и более поздних версиях.
Отправляет файлы пакетов R или Python в базу данных из указанного байтового потока или пути к файлу. Эта инструкция служит универсальным механизмом, с помощью которого администратор базы данных может отправлять необходимые артефакты.
Примечание.
В управляемом экземпляре SQL Azure для установки библиотеки можно использовать sqlmlutils. Дополнительные сведения о см. в статьях Установка пакетов Python с помощью sqlmlutils и Установка новых пакетов R с помощью sqlmlutils.
Синтаксис для SQL Server 2019
CREATE EXTERNAL LIBRARY library_name
[ AUTHORIZATION owner_name ]
FROM <file_spec> [ ,...2 ]
WITH ( LANGUAGE = <language> )
[ ; ]
<file_spec> ::=
{
(CONTENT = { <client_library_specifier> | <library_bits> }
[, PLATFORM = <platform> ])
}
<client_library_specifier> :: =
{
'[file_path\]manifest_file_name'
}
<library_bits> :: =
{
varbinary_literal
| varbinary_expression
}
<platform> :: =
{
WINDOWS
| LINUX
}
<language> :: =
{
'R'
| 'Python'
| <external_language>
}
Синтаксис для SQL Server 2017
CREATE EXTERNAL LIBRARY library_name
[ AUTHORIZATION owner_name ]
FROM <file_spec> [ ,...2 ]
WITH ( LANGUAGE = 'R' )
[ ; ]
<file_spec> ::=
{
(CONTENT = { <client_library_specifier> | <library_bits> })
}
<client_library_specifier> :: =
{
'[file_path\]manifest_file_name'
}
<library_bits> :: =
{
varbinary_literal
| varbinary_expression
}
Синтаксис для Управляемого экземпляра SQL Azure
CREATE EXTERNAL LIBRARY library_name
[ AUTHORIZATION owner_name ]
FROM <file_spec> [ ,...2 ]
WITH ( LANGUAGE = <language> )
[ ; ]
<file_spec> ::=
{
(CONTENT = <library_bits>)
}
<library_bits> :: =
{
varbinary_literal
| varbinary_expression
}
<language> :: =
{
'R'
| 'Python'
}
Аргументы
library_name
Библиотеки, загруженные в экземпляр, могут быть открытыми или закрытыми. Если библиотека создается членом dbo
, она является открытой и может использоваться всеми пользователями. В противном случае библиотека является закрытой и доступна только этому пользователю.
Имена библиотек должны быть уникальными в контексте определенного пользователя или владельца. Например, два пользователя RUser1 и RUser2 могут загрузить библиотеку R ggplot2
индивидуально и по отдельности. Но если пользователь RUser1 хочет отправить новую версию ggplot2
, второму экземпляру нужно присвоить другое имя либо он должен заменить существующую библиотеку.
Имена библиотек не могут присваиваться произвольным образом. Имя библиотеки должно быть таким же, как имя, необходимое для загрузки библиотеки из внешнего скрипта.
owner_name
Указывает имя пользователя или роли, которой принадлежит внешняя библиотека. Если атрибут не указан, владельцем становится текущий пользователь.
Библиотеки, принадлежащие владельцу базы данных, считаются глобальными по отношению к базе данных и среде выполнения. Иными словами, владельцы базы данных могут создавать библиотеки, которые содержат общий набор библиотек или пакетов, совместно используемых несколькими пользователями. Если внешнюю библиотеку создает другой пользователь, кроме пользователя dbo
, к этой внешней библиотеке будет иметь доступ только этот пользователь.
Когда пользователь RUser1 выполняет внешний сценарий, значение libPath
может содержать несколько путей. Первый путь всегда является путем к общей библиотеке, созданной владельцем базы данных. Во второй части libPath
указывается путь, содержащий пакеты, загруженные отдельно пользователем RUser1.
file_spec
Указывает содержимое пакета для конкретной платформы. Поддерживается только один файл артефакта на платформу.
Файл можно указать в виде локального или сетевого пути.
При попытке доступа к файлу, указанному в <client_library_specifier>, SQL Server олицетворяет разрешения контекста безопасности текущего имени входа Windows. Если <client_library_specifier> задает расположение в сети (UNC-путь), олицетворение текущего имени входа не распространяется на это расположение в сети из-за ограничений передачи прав. В этом случае доступ осуществляется при помощи контекста безопасности учетной записи службы SQL Server. Дополнительные сведения см. в статье Учетные данные (компонент Database Engine).
При необходимости можно указать платформу операционной системы для файла. Для каждой платформы операционной системы для конкретного языка или среды выполнения разрешен только один артефакт файла или содержимое.
library_bits
Задает содержимое пакета как шестнадцатеричный литерал, аналогично сборкам.
Этот параметр полезен, если необходимо создать библиотеку или изменить существующую библиотеку (и у вас есть необходимые разрешения), но файловая система на сервере ограничена, и не удается скопировать файлы библиотеки в место, доступное для сервера.
PLATFORM
Указывает платформу для содержимого библиотеки. Является значением по умолчанию для платформы узла, на которой выполняется SQL Server. Поэтому пользователю не нужно указывать это значение. Оно необходимо в случае, когда поддерживается несколько платформ или пользователь хочет указать другую платформу. В SQL Server 2019 поддерживаются платформы Windows и Linux.
LANGUAGE = 'R'
Задает язык пакета. Язык R поддерживается в SQL Server 2017.
language
Задает язык пакета. Значение может быть R
или Python
в Управляемом экземпляре SQL Azure.
language
Задает язык пакета. Значением может быть R
, Python
или название внешнего языка (см. раздел CREATE EXTERNAL LANGUAGE).
Замечания
При использовании файла в языке R пакеты должны быть подготовлены в виде сжатых архивных файлов с расширением ZIP для Windows. В SQL Server 2017 поддерживается только платформа Windows.
При использовании файла в языке R пакеты должны быть подготовлены в виде сжатых архивных файлов с расширением ZIP.
Для языка Python необходимо подготовить пакет в WHL- или ZIP-файле в виде файла с ZIP-архивом. Если пакет уже является ZIP-файлом, он должен быть включен в новый ZIP-файл. Отправка пакета в качестве WHL- или ZIP-файла напрямую в настоящее время не поддерживается.
Инструкция CREATE EXTERNAL LIBRARY
загружает биты библиотеки в базу данных. Библиотека устанавливается, когда пользователь запускает внешний скрипт с помощью sp_execute_external_script и вызывает пакет или библиотеку.
Библиотеки, загруженные в экземпляр, могут быть открытыми или закрытыми. Если библиотека создается членом dbo
, она является открытой и может использоваться всеми пользователями. В противном случае библиотека является закрытой и доступна только этому пользователю.
Набор пакетов, называемых системными пакетами, устанавливается в экземпляре SQL предварительно. Пользователь не может добавлять, обновлять и удалять системные пакеты.
Разрешения
Требуется разрешение CREATE EXTERNAL LIBRARY
. По умолчанию любой пользователь с учетной записью dbo, являющийся членом роли db_owner, имеет разрешения на создание внешней библиотеки. Другим пользователям необходимо явным образом предоставить разрешение с помощью инструкции GRANT, указав CREATE EXTERNAL LIBRARY в качестве привилегии.
В SQL Server 2019 в дополнение к разрешению "CREATE EXTERNAL LIBRARY" пользователю также нужно разрешение references для внешнего языка, чтобы создать для этого языка внешние библиотеки.
GRANT REFERENCES ON EXTERNAL LANGUAGE::Java to user
GRANT CREATE EXTERNAL LIBRARY to user
Для изменения любой библиотеки требуется отдельное разрешение ALTER ANY EXTERNAL LIBRARY
.
Чтобы создать внешнюю библиотеку, используя путь к файлу, пользователь должен иметь проверенное на подлинность имя входа Windows или быть членом предопределенной роли сервера sysadmin.
Примеры
Добавление внешней библиотеки в базу данных
В следующем примере внешняя библиотека customPackage
добавляется в базу данных.
CREATE EXTERNAL LIBRARY customPackage
FROM (CONTENT = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\customPackage.zip') WITH (LANGUAGE = 'R');
После успешной загрузки библиотеки в экземпляр пользователь выполняет процедуру sp_execute_external_script
, чтобы установить библиотеку.
EXEC sp_execute_external_script
@language =N'R',
@script=N'library(customPackage)'
В языке Python в SQL Server 2019 пример также выполняется при замене 'R'
на 'Python'
.
Установка пакетов с зависимостями
Если вы хотите установить пакет с зависимостями, нужно обязательно проанализировать зависимости первого и второго уровней и убедиться, что все необходимые пакеты доступны, до установки целевого пакета.
Предположим, вы хотите установить новый пакет packageA
:
packageA
имеет зависимость отpackageB
packageB
имеет зависимость отpackageC
Для успешной установки packageA
необходимо создать библиотеки для packageB
и packageC
одновременно с добавлением packageA
в SQL Server. Не забудьте проверить версии необходимых пакетов.
На практике зависимости популярных пакетов обычно гораздо сложнее, чем в этом простом примере. Например, ggplot2 может требовать более 30 пакетов, а эти пакеты могут требовать дополнительные пакеты, которые недоступны на сервере. Отсутствие пакета или наличие пакета неправильной версии могут привести к сбою установки.
Так как может быть трудно определить все зависимости при просмотре манифеста пакета, рекомендуем использовать такой пакет, как miniCRAN, для поиска всех пакетов, необходимых для успешного завершения установки.
Загрузите целевой пакет и его зависимости. Все файлы должны находиться в папке, доступной на сервере.
CREATE EXTERNAL LIBRARY packageA FROM (CONTENT = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\packageA.zip') WITH (LANGUAGE = 'R'); GO CREATE EXTERNAL LIBRARY packageB FROM (CONTENT = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\packageB.zip') WITH (LANGUAGE = 'R'); GO CREATE EXTERNAL LIBRARY packageC FROM (CONTENT = 'C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\packageC.zip') WITH (LANGUAGE = 'R'); GO
Сначала установите необходимые пакеты.
Если необходимый пакет уже отправлен экземпляру, не нужно добавлять его снова. Просто не забудьте проверить версию существующего пакета.
Необходимые пакеты
packageC
иpackageB
установлены в правильном порядке, когдаsp_execute_external_script
впервые запускается для установки пакетаpackageA
.Но если доступны не все необходимые пакеты, установка целевого пакета
packageA
завершается ошибкой.EXEC sp_execute_external_script @language =N'R', @script=N' # load the desired package packageA library(packageA) '
В языке Python в SQL Server 2019 пример также выполняется при замене 'R'
на 'Python'
.
Создание библиотеки из потока байтов
Если у вас нет возможности сохранить файлы пакета на сервере, вы можете передать содержимое пакетов в переменной. В следующем примере библиотека создается путем передачи битов в виде шестнадцатеричного литерала.
CREATE EXTERNAL LIBRARY customLibrary FROM (CONTENT = 0xABC123...) WITH (LANGUAGE = 'R');
В языке Python в SQL Server 2019 пример также выполняется при замене 'R' на 'Python'.
Примечание.
В этом примере кода показан только синтаксис. Двоичное значение в CONTENT =
было усечено для удобства чтения и не создает рабочую библиотеку. Фактическое содержимое двоичной переменной будет гораздо длиннее.
Изменение существующей библиотеки пакета
Можно использовать инструкцию DDL ALTER EXTERNAL LIBRARY
для добавления нового содержимого библиотеки или изменения существующего содержимого библиотеки. Для изменения существующей библиотеки требуется разрешение ALTER ANY EXTERNAL LIBRARY
.
Дополнительные сведения см. в разделе ALTER EXTERNAL LIBRARY.
Добавьте JAR-файл Java к базе данных
В следующем примере внешний JAR-файл customJar
добавляется в базу данных.
CREATE EXTERNAL LIBRARY customJar
FROM (CONTENT = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\customJar.jar')
WITH (LANGUAGE = 'Java');
После успешной загрузки библиотеки в экземпляр пользователь выполняет процедуру sp_execute_external_script
, чтобы установить библиотеку.
EXEC sp_execute_external_script
@language = N'Java'
, @script = N'customJar.MyCLass.myMethod'
, @input_data_1 = N'SELECT * FROM dbo.MyTable'
WITH RESULT SETS ((column1 int))
Добавление внешнего пакета одновременно для Windows и Linux
Вы можете указать два параметра <file_spec>
: один для Windows, а другой для Linux.
CREATE EXTERNAL LIBRARY lazyeval
FROM (CONTENT = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\packageA.zip', PLATFORM = WINDOWS),
(CONTENT = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\packageA.tar.gz', PLATFORM = LINUX)
WITH (LANGUAGE = 'R')
При установке пакета с помощью процедуры sp_execute_external_script
используется содержимое библиотеки для той платформы, на которой выполняется экземпляр SQL Server.
EXECUTE sp_execute_external_script
@LANGUAGE = N'R',
@SCRIPT = N'
library(packageA)'
См. также
ALTER EXTERNAL LIBRARY (Transact-SQL)
DROP EXTERNAL LIBRARY (Transact-SQL)
sys.external_library_files
sys.external_libraries