消息: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服务器中添加程序集的步骤是:
确保 SQL 服务器实例允许 CLR:EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
这一步 (#1) 应该只需要一次。
调用sp_add_trusted_assembly存储过程
- 调用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 上,以获得最佳选择(请参阅下半部分,在线下方):
我对我的数据库执行了以下命令,它给我消息 命令已成功完成。
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服务器中添加程序集的步骤是:
确保 SQL 服务器实例允许 CLR:
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
这一步 (#1) 应该只需要一次。
调用sp_add_trusted_assembly存储过程
- 调用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 上,以获得最佳选择(请参阅下半部分,在线下方):