如何授予数据库所有者(DBO)EXTERNAL ACCESS ASSEMBLY权限?

时间:2013-03-26 14:11:33

标签: sql sql-server sql-server-2008 sqlclr

当我尝试从.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权限的相应登录的证书或非对称密钥对程序集进行签名。

提前致谢!

7 个答案:

答案 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。要求仅仅是注册为数据库所有者的登录已被授予saEXTERNAL 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;:

CLR Strict Security on SQL Server 2017

答案 2 :(得分:12)

您必须在项目文件中设置这些设置!右键单击项目后,从项目配置中单击“数据库设置”,然后选择“其他”选项卡。你应该看到类似于我在这里的东西:Project Settings

这是与Error Running CLR Stored Proc

相同的问题

答案 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)

这适用于:

  • Visual Studio 2015 Update 2。
  • Visual Studio 2017。

在项目设置中,选择“外部访问”:

enter image description here

在发布时,错误消息表明它不能接受“EXTERNAL_ACCESS”,除非程序集设置为“Trustworthy”。

因此,在项目设置中,将程序集设置为“Trustworthy”:

enter image description here

这意味着我能够运行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")]

更新2017-07-02

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]