使用文件路径在不安全模式下创建程序集不会在数据库中创建函数
CREATE ASSEMBLY in UNSAFE mode with File path does not create Functions in database
我正在尝试使用以下语句在 SQL 服务器中注册 CLR 程序集:
CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 'C:\MyApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
CLR 程序集使用 pfx 密钥签名,我已经创建了一个非对称密钥和一个 SQL 登录名,以允许安装具有 UNSAFE 权限集的特定程序集。
问题是上面的语句在数据库中创建了程序集,但它没有显示我在程序集中创建的任何 sql 服务器函数。
我没有发现我的 CLR 程序集有任何问题,因为当我通过 Visual Studio 中的 SQL 服务器数据库项目发布数据库时,我可以看到在数据库中创建的所有函数。当我查看发布脚本时,我可以看到数据库项目使用程序集的二进制文件。这意味着,它执行类似
CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF000.......
WITH PERMISSION_SET = UNSAFE;
所以我的问题是为什么程序集通过 DLL 二进制文件正确注册,但当我使用 DLL 的路径时却没有?
如有任何帮助,我们将不胜感激。
数据库服务器:SQL Server 2012。数据库项目是在 Visual Studio 2013 年创建的。CLR 程序集是在 Visual Studio 2013 年作为单独的 class 库项目创建的。
Visual Studio 中的发布步骤还包括一个单独的 脚本,用于创建嵌入在 SQLCLR 程序集中的函数和过程。因此,Visual Studio 正在为您完成这两项工作。
CREATE ASSEMBLY 脚本的执行不会创建函数或过程。它只是将程序集公开给 SQLCLR。您必须在以这种方式创建程序集时创建它们 manually/separately。
why the assembly gets registered properly through the DLL binaries, but not when I use DLL's path?
问题不在于程序集的创建(您所说的注册)。如果在 运行 CREATE ASSEMBLY
时没有出现错误,那么它确实创建成功。
但是,程序集本身仅包含 可以 被 T-SQL 包装器对象引用的 .NET 方法,但是创建程序集不会自动创建这些方法T-SQL 包装对象。这些需要明确创建。
SSDT 使用的主要发布脚本是一个差异/增量脚本,用于将目标数据库提升到项目所暗示的状态。如果您希望始终获得 CREATE 语句而不管部署的任何更改,请确保:
一定要勾选项目属性"SQLCLR"选项卡上的"Generate DDL"选项。此选项控制是否生成包装对象 CREATE 语句(即 CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TYPE
、CREATE AGGREGATE
和 CREATE TRIGGER
语句)。
可选择选中项目属性 "Project Settings" 选项卡上的 "Create script (.sql file)" 复选框。选中此项后,每次构建时都会有一个 {Build tab.BuildOutputPath}\{Build tab.BuildOutputFileName}_Create.sql 脚本。 _Create.sql 脚本将始终包含 CREATE ASSEMBLY
语句。
当您进行构建时,总会有一个 obj\Debug\{SQLCLR tab.AssemblyName}.generated.sql 脚本。该脚本将始终包含 CREATE ASSEMBLY
语句。该脚本还将包含 CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TYPE
、CREATE AGGREGATE
和 CREATE TRIGGER
语句,如果您选中了 "Generate DDL" 选项(# 1 以上)。该脚本乱序,因此无法完全运行,但该脚本中的语句用于生成发布和可选的创建脚本。
如果您选中了 "Create script" 选项(上面的#2),那么,假设您也选中了 "Generate DDL" 选项(又是#1),CREATE PROCEDURE
, CREATE FUNCTION
、CREATE TYPE
、CREATE AGGREGATE
和 CREATE TRIGGER
语句也将在 {Build tab.BuildOutputPath}\{Build tab.BuildOutputFileName}_Create.sql 脚本。在此脚本中,语句将按正确顺序排列。
我正在尝试使用以下语句在 SQL 服务器中注册 CLR 程序集:
CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 'C:\MyApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
CLR 程序集使用 pfx 密钥签名,我已经创建了一个非对称密钥和一个 SQL 登录名,以允许安装具有 UNSAFE 权限集的特定程序集。
问题是上面的语句在数据库中创建了程序集,但它没有显示我在程序集中创建的任何 sql 服务器函数。
我没有发现我的 CLR 程序集有任何问题,因为当我通过 Visual Studio 中的 SQL 服务器数据库项目发布数据库时,我可以看到在数据库中创建的所有函数。当我查看发布脚本时,我可以看到数据库项目使用程序集的二进制文件。这意味着,它执行类似
CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF000.......
WITH PERMISSION_SET = UNSAFE;
所以我的问题是为什么程序集通过 DLL 二进制文件正确注册,但当我使用 DLL 的路径时却没有?
如有任何帮助,我们将不胜感激。
数据库服务器:SQL Server 2012。数据库项目是在 Visual Studio 2013 年创建的。CLR 程序集是在 Visual Studio 2013 年作为单独的 class 库项目创建的。
Visual Studio 中的发布步骤还包括一个单独的 脚本,用于创建嵌入在 SQLCLR 程序集中的函数和过程。因此,Visual Studio 正在为您完成这两项工作。
CREATE ASSEMBLY 脚本的执行不会创建函数或过程。它只是将程序集公开给 SQLCLR。您必须在以这种方式创建程序集时创建它们 manually/separately。
why the assembly gets registered properly through the DLL binaries, but not when I use DLL's path?
问题不在于程序集的创建(您所说的注册)。如果在 运行 CREATE ASSEMBLY
时没有出现错误,那么它确实创建成功。
但是,程序集本身仅包含 可以 被 T-SQL 包装器对象引用的 .NET 方法,但是创建程序集不会自动创建这些方法T-SQL 包装对象。这些需要明确创建。
SSDT 使用的主要发布脚本是一个差异/增量脚本,用于将目标数据库提升到项目所暗示的状态。如果您希望始终获得 CREATE 语句而不管部署的任何更改,请确保:
一定要勾选项目属性"SQLCLR"选项卡上的"Generate DDL"选项。此选项控制是否生成包装对象 CREATE 语句(即
CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TYPE
、CREATE AGGREGATE
和CREATE TRIGGER
语句)。可选择选中项目属性 "Project Settings" 选项卡上的 "Create script (.sql file)" 复选框。选中此项后,每次构建时都会有一个 {Build tab.BuildOutputPath}\{Build tab.BuildOutputFileName}_Create.sql 脚本。 _Create.sql 脚本将始终包含
CREATE ASSEMBLY
语句。
当您进行构建时,总会有一个 obj\Debug\{SQLCLR tab.AssemblyName}.generated.sql 脚本。该脚本将始终包含 CREATE ASSEMBLY
语句。该脚本还将包含 CREATE PROCEDURE
、CREATE FUNCTION
、CREATE TYPE
、CREATE AGGREGATE
和 CREATE TRIGGER
语句,如果您选中了 "Generate DDL" 选项(# 1 以上)。该脚本乱序,因此无法完全运行,但该脚本中的语句用于生成发布和可选的创建脚本。
如果您选中了 "Create script" 选项(上面的#2),那么,假设您也选中了 "Generate DDL" 选项(又是#1),CREATE PROCEDURE
, CREATE FUNCTION
、CREATE TYPE
、CREATE AGGREGATE
和 CREATE TRIGGER
语句也将在 {Build tab.BuildOutputPath}\{Build tab.BuildOutputFileName}_Create.sql 脚本。在此脚本中,语句将按正确顺序排列。