数据库的TRUSTWORTHY
属性(当设置为 时ON
)本质上向 SQL Server 声明,包含在该数据库中并在模拟上下文中执行的代码应该被允许到达该数据库之外,同时维护该模拟安全上下文。它还允许将该数据库中的所有SQLCLR 程序集设置为EXTERNAL_ACCESS
和UNSAFE
,无论该代码是否到达服务器外部(外部含义:网络访问、文件系统访问、注册表访问、环境访问等)。
这是一种相当通用的方法,因为它涵盖了数据库中的所有代码。使用证书和/或非对称密钥对模块(过程和/或程序集)进行签名可以更精细地控制哪些代码具有哪些权限。
将数据库设置为TRUSTWORTHY
还允许在此数据库中启动的任何进程达到服务器级别和/或跨越其他数据库。通常,一个进程被限制/隔离到它启动的数据库中。如果数据库由“sa”登录拥有,那么在该数据库中启动并以“dbo”身份运行的任何进程都将有效地拥有“sa”权限(哎呀!)。
与其试图在这里描述,不如在完全传达有关模拟的细节、扩展所述模拟、签署模块等所需的详细信息方面,我建议仔细阅读有关此主题的以下资源:
您应该避免将数据库设置TRUSTWORTHY
为尽可能多。如果您确实必须进行多线程/异步调用并且如果您有源代码并且正在编译程序集,那么我想不出使用该SET TRUSTWORTHY ON
选项的理由。相反,您应该使用密码对程序集进行签名,并使用以下命令设置允许EXTERNAL_ACCESS
和UNSAFE
程序集的首选方法:
USE [master];
CREATE ASYMMETRIC KEY [ClrPermissionsKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\my\assembly.dll';
CREATE LOGIN [ClrPermissionsLogin]
FROM ASYMMETRIC KEY [ClrPermissionsKey];
GRANT UNSAFE ASSEMBLY TO [ClrPermissionsLogin];
一旦到位,您可以转到已加载并运行程序集的数据库:
ALTER ASSEMBLY [MyAssembly] WITH PERMISSION_SET = UNSAFE;
或者您可以在命令WITH PERMISSION_SET = UNSAFE
末尾包含。CREATE ASSEMBLY