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

5n0oy7gb  于 2022-12-28  发布在  其他
关注(0)|答案(7)|浏览(155)

当我尝试在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权限的相应登录名。

6yt4nkrj

6yt4nkrj1#

这对我很有效:

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
oiopk7p5

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
相反,
最好做以下几点:

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示例执行一次;程序集和包含这些程序集的数据库的数量无关紧要。或者,如果使用证书签名,则只需在上面显示的示例代码中将ASYMMETRIC KEY替换为CERTIFICATE
此方法允许您保持数据库的更好安全性(通过将TRUSTWORTHY设置为OFF),并允许对哪些程序集甚至允许设置为EXTERNAL_ACCESS和/或UNSAFE进行更细粒度的控制(因为您可以通过使用不同的签名密钥和基于这些不同密钥的登录名进行区分)。
但是,如果您 * 必须 * 使用TRUSTWORTHY ON方法,则***数据库所有者不必是sa***。要求仅是注册为数据库所有者的登录已被授予EXTERNAL ACCESS ASSEMBLYUNSAFE ASSEMBLY(与上面显示的基于非对称密钥的登录相同的两种权限)。含义:

USE [master];
GRANT UNSAFE ASSEMBLY TO [{Login-that-is-dbo-for-DB-containing-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

dy2hfwbg

dy2hfwbg3#

您必须在项目文件中设置这些设置!当您右键单击您的项目时,从项目配置中单击数据库设置并选择杂项选项卡。您应该会看到类似于我在这里看到的内容:

这是同一个问题:Error Running CLR Stored Proc

juzqafwq

juzqafwq4#

以下代码适用于我的集成安全性:

ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO

ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO
oipij1gg

oipij1gg5#

这适用于:

  • Visual Studio 2015更新2.
  • Visual Studio 2017.
  • Visual Studio 2017和SQL Server 2019(感谢拉姆库马尔·桑班达姆)。

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

发布时,错误消息指出它无法接受“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")]

更新日期: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组合列表。

ztmd8pv5

ztmd8pv56#

我是这样做到的:

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
mjqavswn

mjqavswn7#

这一行就解决了我的问题

use master;
grant external access assembly to [domain\username]

相关问题