2011-05-31 65 views
6

我無法將SQLCLR程序集添加到數據庫中,但我的同事沒有問題。雖然我們有不同的訪問級別,但我們無法弄清楚爲什麼我會收到我收到的錯誤消息。無法將SQLCLR程序集添加到數據庫,Msg 300

這裏是我的代碼:

USE [mydatabase] 
GO 

CREATE ASSEMBLY [My.Assembly] 
AUTHORIZATION [dbo] 
FROM 'C:\Program Files\MyStuff\My.Assembly.dll' 
WITH PERMISSION_SET = UNSAFE 
GO 

這是我的錯誤:

Msg 300, Level 14, State 1, Line 3
UNSAFE ASSEMBLY permission was denied on object 'server', database 'master'.

的思考?

+0

這將表明您正在將Assembly添加到'master'數據庫。它是否正確? – 2011-05-31 16:02:55

+0

您是否使用sysadmin角色的成員登錄? – a1ex07 2011-05-31 16:16:05

+0

@尼爾·奈特:這是問題所在,我不知道爲什麼它說「數據庫'主''。我有'USE [mydatabase]',因爲我試圖將程序集插入'mydatabase' – MStodd 2011-05-31 17:46:14

回答

3

我認爲你有問題,因爲登錄不是sysadmin的成員。 MSDN說:「如果指定了PERMISSION_SET = UNSAFE,則需要sysadmin固定服務器角色的成員資格」

+1

這個答案是相當不正確的,雖然不是你的錯,因爲當時的MSDN文檔是不正確的。有關詳細信息,請參閱我的[answer](http://stackoverflow.com/a/38213540/577765)。請在這個答案的頂部註釋一下,指示人們不要將登錄信息添加到「sysadmin」服務器角色,因爲這是一種安全風險。 – 2016-07-05 22:04:16

0

您是否更改了數據庫屬性以設置值得信賴?

ALTER DATABASE Databasename SET TRUSTWORTHY ON;

來自BOL 由於連接到SQL Server實例的數據庫不能立即受信任,因此數據庫不允許訪問超出數據庫範圍的資源,直到數據庫明確標記爲可信。此外,設計用於訪問數據庫外部資源的模塊以及具有EXTERNAL_ACCESS和UNSAFE權限設置的程序集都具有其他要求,以便成功運行。

+1

'TRUSTWORTHY'與這個錯誤無關。問題中的錯誤消息指出缺少什麼權限。 'TRUSTWORTHY'不應該被設置爲'ON',除非_絕對必要_因爲它是安全風險。 – 2016-07-05 22:02:39

3

請做不是添加一個登錄到sysadmin固定服務器角色爲了克服這個錯誤。這絕對沒有必要!

接受的答案是不正確的,不是因爲它不起作用(它確實),而是因爲沒有必要授予對登錄的完整控制權,而只是爲了做一些具有特定權限的操作。您不會將Windows登錄設置爲域管理員專門用於向他們授予對特定共享或文件夾的刪除權限。

很明顯,這不是海報的錯,因爲他們正確引用了MSDN文檔。問題是CREATE ASSEMBLY的MSDN文檔不正確。不幸的是,documentation for SQL Server 2008 R2確實要求登錄必須位於sysadmin服務器角色中。然而,it has since been corrected國家:

If PERMISSION_SET = UNSAFE is specified, requires UNSAFE ASSEMBLY permission on the server.

此權限,UNSAFE ASSEMBLY,是錯誤消息指出確切的權限:,所有需要

UNSAFE ASSEMBLY permission was denied on object 'server', database 'master'

意思是做到以下幾點(一次性) :

USE [master]; 
GRANT UNSAFE ASSEMBLY TO [AD_domain_name\windows_login_name]; -- for Windows Logins 

或:

USE [master]; 
GRANT UNSAFE ASSEMBLY TO [sql_login_name]; -- for SQL Server Logins 

您需要在[master]數據庫中的原因是,此權限是需要應用於登錄(服務器級別存在)的服務器級權限,而不是數據庫級權限,而不是用戶(它們存在於數據庫級別)。

這就是爲什麼錯誤消息引用object 'server'(因爲它是一個服務器級別的權限)和database 'master'(因爲登錄的[master]數據庫存在,當查詢當前數據庫設置爲[master]纔可以修改) 。

我試圖加載一個標記爲WITH PERMISSION_SET = UNSAFE的程序集時,我用一個登錄測試了這個問題(即Msg 300)中顯示的錯誤信息。然後,我授予UNSAFE ASSEMBLY權限,並且登錄可以加載UNSAFE程序集;沒有sysadmin成員資格是必需的(或甚至企圖)。我對此進行了測試:SQL Server 2005 SP4,SQL Server 2008 R2 RTM和SQL Server 2012 SP3。

相關問題