我在 SSDT 中有 CLR 程序集,并且必须对其进行部署。据我了解,有 4 个选项可以做到这一点
第一个选项,使用 TRUSTWORTHY
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
ALTER DATABASE SourceDatabase SET TRUSTWORTHY ON;
第二个选项,禁用严格的安全性
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'clr strict security', 0;
RECONFIGURE;
第三种选择,使用密钥或证书签署程序集
Seems complicated and I was not able to manage that yet. I will appreciate the instructions, because the workflow is not clear here.
第四种选择,使用sp_add_trusted_assembly
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
declare @assembly varbinary(max) = 0x4D5A90000300000004000000FFFF0000... -- I have to manually copy that from the failed SQL publish file.
declare @hash varbinary(64) = HASHBYTES('SHA2_512', @assembly);
EXEC sys.sp_add_trusted_assembly @hash, N'Foo Assembly';
在第四个选项中,我必须手动将程序集注册为受信任,然后才能发布程序集。有可能以某种方式自动化这个过程吗?
我正在考虑创建pre-deployment script
可以运行第 4 个选项代码的程序,但我不知道如何从程序集的文件中填充 @assembly 变量.dll
。
或者,如果可以将程序集部署为不受信任,我可以使用以下代码使其在服务器上受信任(post-deployment script
)
-- Register all database assemblies as trusted
declare @name nvarchar(4000),
@content varbinary(max);
DECLARE appCursor CURSOR FAST_FORWARD FOR
SELECT [name], content
FROM SourceDatabase.sys.assembly_files
OPEN appCursor
FETCH NEXT FROM appCursor INTO @name, @content
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE @hash varbinary(64) = HASHBYTES('SHA2_512', @content);
EXEC sys.sp_add_trusted_assembly @hash, @name;
FETCH NEXT FROM appCursor INTO @name, @content
END
CLOSE appCursor
DEALLOCATE appCursor
GO
任何想法或你的方法是什么?
我的偏好是选项3:使用非对称密钥(即强名称)/证书的内置/“传统”机制。不幸的是,SQL Server 2017 引入了“CLR 严格安全性” ,并且没有内置方法来克服这个特定问题(提前设置安全性)。因此,我想出了可能的方法,既可以使用 Visual Studio / SSDT(或不使用),一种用于非对称密钥(因为这是 Visual Studio 默认的工作方式,尽管比下一个选项稍微复杂一些),以及一种用于证书(需要额外的 EXE 来处理证书,因为 Visual Studio / SSDT 只处理强命名,但总体上更简单):
SQLCLR 与 SQL Server 2017,第 2 部分:“CLR 严格的安全性” - 解决方案 1
SQLCLR 与 SQL Server 2017,第 3 部分:“CLR 严格的安全性”——解决方案 2
“解决方案 1”(即使用非对称密钥)的基本思想是使用与您尝试安装的 DLL 相同的强名称对空程序集进行签名(这只是因为我们仍然不能通过十六进制/
VARBINARY
文字创建一个非对称密钥!!!)。这将被上传到,master
以便我们可以在将真实程序集上传到一个或多个用户数据库之前设置安全性。仅此一项就在 SQL Server 2017 和考虑不周的“CLR 严格安全”之前有效。有了这个新的安全约束,我们就不能再上传未签名的SAFE
程序集(即使用非对称密钥签名的空程序集),所以现在我们还需要使用证书对空程序集进行签名(因为这可以在上传程序集之前通过 hexbytes 创建)。这允许加载空程序集,以便我们可以提取非对称密钥。令人费解的是,但不幸的是,直到可以从十六进制创建非对称密钥为止,这就是我们所处的位置。“解决方案 2”跳过空程序集并简单地使用证书签署预期的自定义程序集。在这种情况下,可以直接将证书加载到
[master]
其中,然后可以导入程序集。但是,由于 Visual Studio / SSDT 不使用证书进行签名,因此您需要手动更新.sqlproj文件以注入一个步骤来处理此问题。