消息:6528,在数据库 'XYZ' 的 SQL 目录中找不到程序集 'XYZCLRDatabase'

msg: 6528, Assembly 'XYZCLRDatabase' could not be found in the SQL catalog for database 'XYZ'

我对我的数据库执行了以下命令,它给我消息 命令已成功完成。

USE XYZ
GO
DECLARE @clrName nvarchar(4000) = 'XYZCLRDatabase, ...';
DECLARE @asmBin varbinary(max) = <bindary>;
DECLARE @hash varbinary(64);

SELECT @hash = HASHBYTES('SHA2_512', @asmBin);

EXEC sys.sp_add_trusted_assembly @hash = @hash,
                                @description = @clrName;
GO

也显示相同的记录进入sys.trusted_assembliestable.

但它没有列在程序集文件夹中...

XYZ 数据库 > 可编程性 > 程序集

当我尝试使用以下代码创建存储过程时出现错误。

USE XYZ
GO
CREATE PROCEDURE SPName @sqlXml XML, @flag1 bit, @flag2 bit, @id int null, @flag3 bit
AS
EXTERNAL NAME XYZCLRDatabase.StoredProcedures.MYClrSP

我收到以下错误消息:

Msg 6528, Level 16, State 1, Procedure SPName, Line 1 [Batch Start Line 23]
Assembly 'XYZCLRDatabase' could not be found in the SQL catalog for database 'XYZ'.

出了什么问题....

您缺少 CREATE ASSEMBLY 指令。综上所述,在SQL服务器中添加程序集的步骤是:

  1. 确保 SQL 服务器实例允许 CLR:EXEC sp_configure 'clr enabled', 1; RECONFIGURE;

    这一步 (#1) 应该只需要一次。

  2. 调用sp_add_trusted_assembly存储过程

  3. 调用CREATE ASSEMBLY指令

虽然 bradbury9 认为缺少 CREATE ASSEMBLY 语句是正确的,但 NOT 在中启用 TRUSTWORTHY你的数据库!!!它不仅是不必要的安全风险,而且在使用 "trusted assemblies" 或更喜欢的程序集签名时 绝对没用 。这两种情况("trusted assemblies" 和签署程序集)都存在,因此您 不需要 将数据库设置为 TRUSTWORTHY ON(意思是:要么设置 TRUSTWORTHY ON XOR 对程序集进行签名/将它们添加为 "trusted assemblies";执行后面任一选项意味着您执行 not set TRUSTWORTHY ON)。有关为什么不应启用 TRUSTWORTHY 和首选替代方案(即 Module Signing)的更多信息,请参阅:

PLEASE, Please, please Stop Using Impersonation, TRUSTWORTHY, and Cross-DB Ownership Chaining

此外,"trusted assemblies" 虽然不如 TRUSTWORTHY ON 差,但也不如 there are several problems with that feature 理想。在 SQL 服务器外部(首选)甚至在 SQL 服务器内部对程序集进行签名要好得多。请参阅我对以下问题的回答,也在 S.O 上,以获得最佳选择(请参阅下半部分,在线下方):