当我尝试在2008年从SQL .NET程序集(.NET 3.5)创建组件我收到以下错误,错误说我必须设置或者下面的性质为真,我该怎么办呢?
数据库所有者(DBO)具有为TRUE外部ACCESS ASSEMBLY权限
该数据库对TRUSTWORTHY数据库属性
该组件与证书或具有与外部访问ASSEMBLY权限的相应登录的非对称密钥签署。
完整的错误是下面,
CREATE ASSEMBLY装配 'SQLLogger' 失败,因为程序集 'SQLLogger' 未被授权PERMISSION_SET = EXTERNAL_ACCESS。 该组件被授权时下面的任一为真:数据库所有者(DBO)具有EXTERNAL ACCESS ASSEMBLY权限和数据库对TRUSTWORTHY数据库属性; 或组件与证书或具有与外部访问ASSEMBLY权限的相应登录的非对称密钥签署。
提前致谢!
您必须在项目文件中设置这些设置! 当你右击你的项目,从项目配置单击数据库设置,然后选择其他选项卡。 您应该看到类似的东西是什么我这里有:
这是同样的问题: 错误运行CLR存储过程
这为我工作:
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
请不要设置TRUSTWORTHY ON
,除非绝对必要! 和加载,你没有建立,不能续约的大会时,它应该只能是“必要的”。 和装载在SQL Server的CLR主机不是“支持”,因此尚不.NET框架库时,大多情况。 这些情况之外,你不应该设置数据库,以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
),并允许进行更精细的控制哪些组件,甚至允许设置为EXTERNAL_ACCESS
和/或UNSAFE
(因为你可以单独通过使用不同的密钥签约和登录基于这些不同的密钥)。
但是,如果你必须使用TRUSTWORTHY ON
方法,则数据库所有者不需要为sa
。 的要求仅仅是登记作为数据库所有者登录已被授予任EXTERNAL ACCESS ASSEMBLY
或UNSAFE ASSEMBLY
(上述用于非对称基于密钥的登录所示相同的两个权限)。
有关这些安全选项更详细的步行通过,请参见下面的文章,我对SQL Server的中央写道: 阶梯SQLCLR等级4:安全(外部和不安全的程序集) (需要免费注册)。
有关如何通过这个Visual Studio中/ SSDT自动化详细的步行通过,请参阅下面的3篇文章(3部分组成的系列),也对SQL Server的中央:
- 阶梯SQLCLR 6级:开发工具介绍
- 阶梯SQLCLR 7级:发展与安全
- 阶梯SQLCLR 8级:使用Visual Studio解决SSDT
此外,由于这些写3篇文章,我已经想出了使用T4模板更简单的方法,但还没有来得及写了没有。 当我这样做,我会更新这个答案有一个链接到该文章。
UPDATE
SQL服务器2017年命名为“CLR严格的安全”服务器级配置选项的形式引入了新的复杂性。 它是默认启用的,并要求所有的组件,甚至是那些标记为SAFE
,可以用一个证书或非对称密钥签署的,已在相关的登录, 而登录有UNSAFE ASSEMBLY
授予的权限(不够好授予EXTERNAL ACCESS ASSEMBLY
)。 请参阅我的回答对这个新的“功能”的详细信息如下SO问题:
SQL服务器2017年的CLR严格的安全
下面的代码为我工作集成的安全:
ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO
ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO
这就是我如何设法使其工作:
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
这适用于:
- 的Visual Studio 2015年更新2。
- 的Visual Studio 2017年。
在项目设置,选择“外部访问”:
上发布,该错误消息说,它不能接受“EXTERNAL_ACCESS”除非组件设置为“值得信赖”。
因此,在项目设置上,大会设置为“守合同重信用”:
这意味着我能够运行所列出的本地硬盘上的文件样本用户定义的函数 。
如果安全仍然是过于严格,属性添加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];
- 在运行任何程序(如Visual Studio或C#实用工具)
Administrator
模式给予他们足够的权限来发布UNSAFE
组件。
如果实在不行,可以尝试使用用户名连接sa
和管理员密码。 这将始终工作,无论Visual Studio中是否在运行的Administrator
模式或没有。
这一条线上解决了这个问题对我来说
use master;
grant external access assembly to [domain\username]
文章来源: How to grant the database owner (DBO) the EXTERNAL ACCESS ASSEMBLY permission?