当我尝试从.Net程序集(.Net 3.5)在SQL 2008中创建程序集时,我收到以下错误,错误说我必须将以下任一属性设置为true,我该怎么办?< / p>
数据库所有者(DBO)具有EXTERNAL ACCESS ASSEMBLY权限 TRUE
数据库在
上具有TRUSTWORTHY数据库属性使用证书或非对称密钥对程序集进行签名 具有EXTERNAL ACCESS ASSEMBLY权限的相应登录。
完整错误如下,
为程序集“SQLLogger”创建程序集失败,因为程序集“SQLLogger”未获得PERMISSION_SET = EXTERNAL_ACCESS的授权。如果满足以下任一条件,则授权程序集:数据库所有者(DBO)具有EXTERNAL ACCESS ASSEMBLY权限,并且数据库具有TRUSTWORTHY数据库属性;或者使用具有EXTERNAL ACCESS ASSEMBLY权限的相应登录的证书或非对称密钥对程序集进行签名。
提前致谢!
答案 0 :(得分:35)
这对我有用:
EXEC sp_changedbowner 'sa'
ALTER DATABASE [dbase] SET trustworthy ON
我也这样做了:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO
答案 1 :(得分:24)
除非绝对必要,否则请不设置TRUSTWORTHY ON
!它应该只是必要的&#34;加载您未构建且无法重新签名的程序集时。这主要发生在加载不受支持的.NET Framework库时#34;因此还没有在SQL Server的CLR主机中。在这些情况之外,您不应该将数据库设置为TRUSTWORTHY ON
,因为它会打开安全漏洞。
相反,做以下事情要好得多:
USE [master];
CREATE ASYMMETRIC KEY [SomeKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\Some.dll';
CREATE LOGIN [SomeLogin]
FROM ASYMMETRIC KEY [SomeKey];
GRANT EXTERNAL ACCESS ASSEMBLY TO [SomeLogin]; -- or "UNSAFE" instead of "EXTERNAL ACCESS"
以上每个实例仅需要按键完成一次。因此,如果对所有程序集使用相同的snk
/ pfx
文件,那么上面显示的步骤只需要为每个SQL Server实例执行一次;包含这些程序集的程序集和数据库的数量无关紧要。
此方法允许您在数据库上保持更好的安全性(通过将TRUSTWORTHY
设置为OFF
),并允许更精细地控制甚至允许将哪些程序集设置为{{1} }和/或EXTERNAL_ACCESS
(因为您可以使用不同的键进行分离,并根据这些不同的键进行登录)。
但是,如果必须使用UNSAFE
方法,则数据库所有者不需要TRUSTWORTHY ON
。要求仅仅是注册为数据库所有者的登录已被授予sa
或EXTERNAL ACCESS ASSEMBLY
(上面显示的基于非对称密钥登录的相同的两个权限)。
有关安全选项的更详细介绍,请参阅我在SQL Server Central上编写的以下文章:Stairway to SQLCLR Level 4: Security (EXTERNAL and UNSAFE Assemblies)(需要免费注册)。
有关如何通过Visual Studio / SSDT自动执行此操作的详细介绍,请参阅以下3篇文章(3部分系列),同样在SQL Server Central上:
此外,自从撰写这三篇文章以来,我已经提出了一种使用T4模板的简单方法,但还没有时间写这篇文章。当我这样做时,我会用这篇文章的链接更新这个答案。
SQL Server 2017以服务器级配置选项的形式引入了一个新的复杂功能,名为&#34; CLR strict security&#34;。默认情况下启用它并要求所有程序集(即使标记为UNSAFE ASSEMBLY
的程序集)都使用证书或非对称密钥进行签名,并且要求登录名为<{>的和 <{ 1}}授予权限(不足以授予SAFE
)。请参阅我对以下S.O.的回答。有关此新功能的更多详情的问题&#34;:
答案 2 :(得分:12)
您必须在项目文件中设置这些设置!右键单击项目后,从项目配置中单击“数据库设置”,然后选择“其他”选项卡。你应该看到类似于我在这里的东西:
相同的问题答案 3 :(得分:6)
以下代码为我提供了集成安全性:
ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO
ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO
答案 4 :(得分:3)
这就是我设法让它发挥作用的方式:
ALTER DATABASE databasename SET trustworthy ON
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO
/
DROP ASSEMBLY assemblyname
GO
CREATE ASSEMBLY assemblyname
FROM 0x4D5A9000.....
WITH PERMISSION_SET = EXTERNAL_ACCESS
答案 5 :(得分:3)
这适用于:
在项目设置中,选择“外部访问”:
在发布时,错误消息表明它不能接受“EXTERNAL_ACCESS”,除非程序集设置为“Trustworthy”。
因此,在项目设置中,将程序集设置为“Trustworthy”:
这意味着我能够运行sample user defined function that listed files on the local hard drive。
如果安全性仍然过于严格,请将属性DataAccess = DataAccessKind.Read
添加到您的UDF中,例如:
[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FindFiles", DataAccess = DataAccessKind.Read, TableDefinition = "FileName nvarchar(500), FileSize bigint, CreationTime datetime")]
在SQL Server 2016
+ Visual Studio 2015
上,您可能还需要执行以下操作:
use master;grant unsafe assembly to [Domain\Username];
Administrator
模式运行任何程序(例如Visual Studio或任何C#实用程序),以授予他们足够的权限来发布UNSAFE
程序集。如果无效,请尝试使用用户名sa
和管理员密码进行连接。无论Visual Studio是否以Administrator
模式运行,这都将始终有效。
答案 6 :(得分:2)
这一行解决了我的问题
use master;
grant external access assembly to [domain\username]