CREATE EXTERNAL LANGUAGE (Transact-SQL)

适用范围:SQL Server 2019 (15.x) 及更高版本

从指定的文件路径或字节流中注册数据库中的外部语言扩展。 该语句是数据库管理员在 SQL Server 支持的任何操作系统平台上注册新外部语言扩展的通用机制。 有关详细信息,请参阅语言扩展

注意

RPython 是保留名称。 你不能用这些特定名称创建外部语言。 若要详细了解如何使用 R 和 Python ,请参阅 SQL Server 机器学习服务

语法

CREATE EXTERNAL LANGUAGE language_name  
[ AUTHORIZATION owner_name ]  
FROM <file_spec> [ ,...2 ]  
[ ; ]  

<file_spec> ::=  
{
    ( CONTENT = { <external_lang_specifier> | <content_bits> },
    FILE_NAME = <external_lang_file_name>
    [ , PLATFORM = <platform> ]
    [ , PARAMETERS = <external_lang_parameters> ]
    [ , ENVIRONMENT_VARIABLES = <external_lang_env_variables> ] )
}

<external_lang_specifier> :: =  
{
    '[file_path\]os_file_name'  
}

<content_bits> :: =  
{
    varbinary_literal
    | varbinary_expression
}

<external_lang_file_name> :: =  
'extension_file_name'


<platform> :: =
{
    WINDOWS
  | LINUX
}

<external_lang_parameters> :: =  
'extension_specific_parameters'

参数

language_name

语言是数据库范围的对象。 语言名称在数据库中必须唯一。

owner_name

指定拥有外部语言的用户或角色的名称。 如果你不指定某个值,当前用户就会成为所有者。 根据权限不同,其他用户可能需要显式权限才能使用特定语言执行脚本。

file_spec

指定语言扩展的内容。 每个平台对特定语言只允许一个。<file_spec>

external_lang_specifier

包含扩展代码的完整文件路径 .zip 或tar.gz文件。 这些内容可以是 .zip 文件的路径(Windows上)或tar.gz文件(Linux上)。

content_bits

将语言的内容指定为十六进制文字,类似于程序集。

当服务器文件系统受限且无法将库文件复制到服务器能访问的位置时,可以使用这个选项。 您必须拥有创建或修改该语言所需的权限。

external_lang_file_name

扩展 .dll 或 .so 文件的名称。 当 .zip 或tar.gz中存在 <external_lang_specifier> 多个 .dll 或.so文件时,名称用于识别正确的文件。

external_lang_parameters

指定一组参数传递给外部语言运行时。 外部运行时在外部进程启动后接收参数值。 相比之下,环境变量在外部进程开始前就已被语言扩展访问。

external_lang_env_variables

指定一组环境变量,在外部进程开始前向外部语言运行时开放。 例如,设置运行时本身的主目录,例如 JRE_HOME

平台

混合 OS 方案需要此参数。 在混合架构中,你必须在每个平台注册一次语言。 如果你没有指定平台,SQL Server 会假设当前操作系统。

权限

需要 CREATE EXTERNAL LANGUAGE 权限。 默认情况下, db_owner 固定数据库角色的任何成员都有创建外部语言的权限。 对于其他所有用户,你必须通过声明GRANTCREATE EXTERNAL LANGUAGE明确授予权限,指定为该权限。

要修改库,你需要单独的权限,。 ALTER ANY EXTERNAL LANGUAGE

EXECUTE EXTERNAL SCRIPT 权限

使用 EXECUTE EXTERNAL SCRIPT 权限授权对特定语言执行外部脚本。 EXECUTE EXTERNAL SCRIPT 这与 EXECUTE ANY EXTERNAL SCRIPT 数据库权限不同,后者不允许对特定语言授予执行权限。

授予非DBO 用户执行特定语言的权限:

GRANT EXECUTE EXTERNAL SCRIPT ON EXTERNAL LANGUAGE ::language_name
TO database_principal_name;

外部库的引用权限

与assembly类似,外部语言需要引用权限,以确保外部库与外部语言之间有链接。 例如,在你放弃一个外部语言之前,必须先删除所有引用该语言的外部库。 将外部语言视为层级结构中比外部库更高级的对象。

示例

A. 在数据库中创建外部语言

以下示例将一种名为 Java 的外部语言添加到 Windows 上的 SQL Server 的数据库中。

CREATE EXTERNAL LANGUAGE Java 
FROM (CONTENT = N'<path-to-zip>', FILE_NAME = 'javaextension.dll');
GO

B. 同时为 Windows 和 Linux 创建外部语言

最多可以指定两个 <file_spec>,一个用于 Windows,另一个用于 Linux。

CREATE EXTERNAL LANGUAGE Java
FROM
(CONTENT = N'<path-to-zip>', FILE_NAME = 'javaextension.dll', PLATFORM = WINDOWS),
(CONTENT = N'<path-to-tar.gz>', FILE_NAME = 'javaextension.so', PLATFORM = LINUX);
GO

C. 授予执行外部脚本的权限

下面的示例授予 mylogin 主体使用 Java 外部语言执行脚本的权利 。

GRANT EXECUTE EXTERNAL SCRIPT ON EXTERNAL LANGUAGE ::Java 
TO mylogin;