我正在尝试使用以下语句在SQL Server中注册CLR程序集:
CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 'C:\MyApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
CLR程序集使用pfx密钥签名,并且我已经创建了一个非对称密钥和SQL登录名,以允许使用UNSAFE权限集安装此特定程序集。
问题是上面的语句在数据库中创建了程序集,但没有显示我在程序集中创建的任何sql server函数。
我看不到CLR程序集的任何问题,因为当我在Visual Studio中通过SQL Server数据库项目发布数据库时,可以看到在数据库中创建了所有函数。当我查看发布脚本时,我可以看到数据库项目使用程序集的Binary。这意味着,它执行类似
CREATE ASSEMBLY SQLCLRTest
AUTHORIZATION [dbo]
FROM 0x4D5A90000300000004000000FFFF000.......
WITH PERMISSION_SET = UNSAFE;
所以我的问题是,为什么程序集通过DLL二进制文件正确注册,而当我使用DLL的路径时却不能注册?
在这方面的任何帮助将不胜感激。
数据库服务器:SQL Server2012。在Visual Studio 2013中创建数据库项目。在Visual Studio 2013中将CLR程序集创建为单独的类库项目。
为什么程序集通过DLL二进制文件正确注册,但是当我使用DLL的路径时却不能注册?
问题不在于程序集的创建(您所指的是注册)。如果运行时未出现错误,CREATE ASSEMBLY
则说明已成功创建。
但是,程序集本身仅包含可以由T-SQL包装对象引用的.NET方法,但是创建程序集并不能自动创建那些T-SQL包装对象。这些需要明确创建。
SSDT使用的主要发布脚本是diff /增量脚本,用于使目标DB达到项目所隐含的状态。如果要始终获取CREATE语句而不管正在部署的任何更改,请确保:
绝对检查“项目属性”的“ SQLCLR”选项卡上的“生成DDL”选项。此选项控制包装对象是否CREATE语句(即CREATE PROCEDURE
,CREATE FUNCTION
,CREATE TYPE
,CREATE AGGREGATE
,和CREATE TRIGGER
语句)被生成。
(可选)在“项目属性”的“项目设置”选项卡上选中“创建脚本(.sql文件)”复选框。选中此复选框后,每次进行构建时,都会有一个{Build tab.BuildOutputPath} \ {Build tab.BuildOutputFileName} _Create.sql脚本。该_Create.sql脚本将始终包含该CREATE ASSEMBLY
语句。
进行构建时,将始终有一个obj \ Debug \ {SQLCLR选项卡。AssemblyName} .generated.sql脚本。该脚本将始终包含该CREATE ASSEMBLY
语句。该脚本也将包含CREATE PROCEDURE
,CREATE FUNCTION
,CREATE TYPE
,CREATE AGGREGATE
,和CREATE TRIGGER
语句,如果你有“生成DDL”选项选中(#1以上)。该脚本不是完全可运行的,因为它顺序混乱,但是该脚本中的语句用于生成Publish和可选的Create脚本。
如果你有“创建脚本”选项选中(上述#2),然后,假设你也有“生成DDL”选项选中(#1再次)中,CREATE PROCEDURE
,CREATE FUNCTION
,CREATE TYPE
,CREATE AGGREGATE
,和CREATE TRIGGER
语句也将在{构建tab.BuildOutputPath} \ {Build tab.BuildOutputFileName} _Create.sql脚本。在此脚本中,语句将以正确的顺序进行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句