Dev*_*Dev 32 sql sql-server sqlclr sql-server-2008
当我尝试从.Net程序集(.Net 3.5)在SQL 2008中创建程序集时,我收到以下错误,错误说我必须将以下任一属性设置为true,我该怎么做?
数据库所有者(DBO)具有EXTERNAL ACCESS ASSEMBLY权限为TRUE
该数据库具有TRUSTWORTHY数据库属性
程序集使用证书或非对称密钥签名,该密钥具有相应的登录权限,具有EXTERNAL ACCESS ASSEMBLY权限.
完整的错误如下,
程序集"SQLLogger"的CREATE ASSEMBLY失败,因为程序集"SQLLogger"未获得PERMISSION_SET = EXTERNAL_ACCESS的授权.如果满足以下任一条件,则授权程序集:数据库所有者(DBO)具有EXTERNAL ACCESS ASSEMBLY权限,并且数据库具有TRUSTWORTHY数据库属性; 或者使用具有EXTERNAL ACCESS ASSEMBLY权限的相应登录的证书或非对称密钥对程序集进行签名.
提前致谢!
hog*_*gar 38
这对我有用:
EXEC sp_changedbowner 'sa'
ALTER DATABASE [dbase] SET trustworthy ON
Run Code Online (Sandbox Code Playgroud)
我也这样做了:
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
Run Code Online (Sandbox Code Playgroud)
Sol*_*zky 25
请不要不设置TRUSTWORTHY ON除非绝对必要!并且只有在加载您没有构建且无法重新签名的程序集时才应该"必要".这主要发生在加载不受"支持"且因此不在SQL Server的CLR主机中的.NET Framework库时.在这些情况之外,您不应该将数据库设置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"
Run Code Online (Sandbox Code Playgroud)
每个实例,每个密钥只需要执行上面一次.因此,如果对所有程序集使用相同的snk/ pfx文件,则上面显示的步骤只需要为每个SQL Server实例执行一次; 包含这些程序集的程序集和数据库的数量无关紧要.
这种方法允许您在数据库上保持更好的安全性(通过保持TRUSTWORTHY设置OFF)并允许更精细地控制甚至允许将哪些程序集设置为EXTERNAL_ACCESS和/或UNSAFE(因为您可以通过使用不同的密钥进行签名和基于登录来分离在那些不同的键上).
但是,如果必须使用该TRUSTWORTHY ON方法,则不需要数据库所有者sa.要求仅仅是已注册为数据库所有者的登录名已被授予EXTERNAL ACCESS ASSEMBLY或UNSAFE ASSEMBLY(上面显示的基于非对称密钥登录的相同两个权限).
有关安全选项的更详细介绍,请参阅我在SQL Server Central上编写的以下文章:SQLCLR级别4的阶梯:安全性(外部和UNSAFE程序集)(需要免费注册).
有关如何通过Visual Studio/SSDT自动执行此操作的详细介绍,请参阅以下3篇文章(3部分系列),同样在SQL Server Central上:
另外,自从撰写这三篇文章以来,我已经提出了一种使用T4模板的简单方法,但还没有时间编写它.当我这样做时,我将通过该文章的链接更新此答案.
SQL Server 2017以名为"CLR strict security"的服务器级配置选项的形式引入了一个新的复杂功能.默认情况下启用它,并要求所有程序集(甚至是标记为的程序集SAFE)都使用证书或非对称密钥签名,具有关联的登录,并且登录具有已UNSAFE ASSEMBLY授予的权限(不足以授予权限EXTERNAL ACCESS ASSEMBLY).有关此新功能的更多详细信息,请参阅我对以下SO问题的回答:
ble*_*ter 13
您必须在项目文件中设置这些设置!右键单击项目后,单击项目配置中的"数据库设置",然后选择"其他"选项卡.你应该看到类似于我在这里的东西:
这与以下问题相同:运行CLR存储过程时出错
以下代码为我的集成安全性工作:
ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO
ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO
Run Code Online (Sandbox Code Playgroud)
这适用于:
在您的项目设置中,选择“外部访问”:
在发布时,错误消息说它不能接受“EXTERNAL_ACCESS”,除非程序集设置为“可信”。
因此,在项目设置中,将程序集设置为“可信”:
这意味着我能够运行一个示例用户定义函数来列出本地硬盘驱动器上的文件。
如果安全性仍然过于严格,请将属性添加DataAccess = DataAccessKind.Read到您的 UDF,例如:
[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FindFiles", DataAccess = DataAccessKind.Read, TableDefinition = "FileName nvarchar(500), FileSize bigint, CreationTime datetime")]
Run Code Online (Sandbox Code Playgroud)
在SQL Server 2016+ 上Visual Studio 2015,您可能还必须执行以下操作:
use master;grant unsafe assembly to [Domain\Username];Administrator模式下运行任何程序(例如 Visual Studio 或任何 C# 实用程序),以授予它们足够的权限来发布UNSAFE程序集。如果没有任何效果,请尝试使用用户名sa和管理员密码进行连接。这将始终有效,无论 Visual Studio 是否在Administrator模式下运行。
更新了兼容 VS + SQL Server 组合的列表。
| 归档时间: |
|
| 查看次数: |
70409 次 |
| 最近记录: |