当我尝试在SQL 2008中从.Net assembly(.Net 3.5)创建程序集时,我收到以下错误,错误说我必须将以下属性之一设置为true,我该如何操作?
数据库所有者(DBO)的EXTERNAL ACCESS ASSEMBLY权限为TRUE
数据库的TRUSTWORTHY数据库属性为
程序集是使用证书或非对称密钥签名的,该证书或非对称密钥具有相应的登录名,该登录名具有EXTERNAL ACCESS ASSEMBLY权限。
完整的错误如下,
为程序集“SQLLogger”创建ASSEMBLY失败,因为程序集“SQLLogger”未获得针对PERMISSION_SET = EXTERNAL_ACCESS的授权。当满足以下任一条件时,将授权该程序集:数据库所有者(DBO)具有EXTERNAL ACCESS ASSEMBLY权限,并且数据库具有TRUSTWORTHY数据库属性;或者该程序集是用证书或非对称密钥签名的,该证书或非对称密钥具有带EXTERNAL ACCESS ASSEMBLY权限的相应登录名。
7条答案
按热度按时间6yt4nkrj1#
这对我很有效:
我还做了这个
oiopk7p52#
请不要设置
TRUSTWORTHY ON
......除非绝对必要而且,它应该几乎永远不是"必要的",即使在加载不是您构建的程序集时(您总是可以添加另一个证书,或者最坏的情况是:在加载到SQL Server中的 * 之后加上 * 号),或者在加载不"受支持"的. NET Framework库时,这些库尚未位于SQL Server的CLR主机中(您可以使用use the certificate they are signed with,或者最坏情况:将数据库设置为
TRUSTWORTHY ON
会打开一个安全漏洞,有关详细信息,请参阅:PLEASE, Please, please Stop Using Impersonation, TRUSTWORTHY, and Cross-DB Ownership Chaining
相反,
最好做以下几点:
以上步骤只需要对每个示例、每个键执行一次。因此,如果您对所有程序集使用相同的
snk
/pfx
文件,则上面显示的步骤只需要对每个SQL Server示例执行一次;程序集和包含这些程序集的数据库的数量无关紧要。或者,如果使用证书签名,则只需在上面显示的示例代码中将ASYMMETRIC KEY
替换为CERTIFICATE
。此方法允许您保持数据库的更好安全性(通过将
TRUSTWORTHY
设置为OFF
),并允许对哪些程序集甚至允许设置为EXTERNAL_ACCESS
和/或UNSAFE
进行更细粒度的控制(因为您可以通过使用不同的签名密钥和基于这些不同密钥的登录名进行区分)。但是,如果您 * 必须 * 使用
TRUSTWORTHY ON
方法,则***数据库所有者不必是sa
***。要求仅是注册为数据库所有者的登录已被授予EXTERNAL ACCESS ASSEMBLY
或UNSAFE ASSEMBLY
(与上面显示的基于非对称密钥的登录相同的两种权限)。含义:有关安全选项的更详细的演练,请参阅我在SQL Server Central上撰写的以下文章:Stairway to SQLCLR Level 4: Security (EXTERNAL and UNSAFE Assemblies).
有关如何通过Visual Studio/SSDT自动执行此操作的详细演练,请参阅以下3篇文章(共3部分的系列文章),这些文章也位于SQL Server Central上:
另外,自从写了这3篇文章之后,我已经想出了一个使用T4模板的更简单的方法,但是还没有时间写出来。
更新
SQL Server 2017以名为"CLR严格安全性"的服务器级配置选项的形式引入了一个新的复杂功能。默认情况下,该选项处于启用状态,并要求所有程序集(即使是标记为
SAFE
的程序集)都使用证书或非对称密钥进行签名,具有关联的登录名,* 及 * 该登入已获授予UNSAFE ASSEMBLY
权限(不足以授予EXTERNAL ACCESS ASSEMBLY
)。有关这项新“功能”的详情,请参阅我对以下S.O.问题的答复:CLR Strict Security on SQL Server 2017
dy2hfwbg3#
您必须在项目文件中设置这些设置!当您右键单击您的项目时,从项目配置中单击数据库设置并选择杂项选项卡。您应该会看到类似于我在这里看到的内容:
这是同一个问题:Error Running CLR Stored Proc
juzqafwq4#
以下代码适用于我的集成安全性:
oipij1gg5#
这适用于:
在项目设置中,选择“外部访问”:
发布时,错误消息指出它无法接受“EXTERNAL_ACCESS”,除非程序集设置为“Trustworthy”。
因此,在项目设置中,将程序集设置为“Trustworthy”:
这意味着我能够运行sample user defined function that listed files on the local hard drive。
如果安全性仍然过于严格,请将属性
DataAccess = DataAccessKind.Read
添加到UDF中,例如:更新日期:2017年7月2日
在
SQL Server 2016
+Visual Studio 2015
上,您可能还必须执行以下操作:use master;grant unsafe assembly to [Domain\Username];
Administrator
模式下运行任何程序(如Visual Studio或任何C#实用工具),以给予它们发布UNSAFE
程序集的足够权限。如果不起作用,请尝试使用用户名
sa
和管理员密码进行连接。无论Visual Studio是否在Administrator
模式下运行,此操作始终有效。更新日期2020年1月17日
更新了兼容的VS + SQL Server组合列表。
ztmd8pv56#
我是这样做到的:
mjqavswn7#
这一行就解决了我的问题