6

我剛剛從SQL2000遷移到SQL2008,並且我開始在使用sp_OACreate的存儲過程中獲取執行權限問題。Sql server執行權限;未能應用權限

系統的其餘部分可以正常工作,並且已經建立並添加到數據庫中。

我已經試過:

USE master 
GO 
GRANT EXEC ON sp_OACreate TO [dbuser] 
GO 

但這種失敗,出現以下錯誤:

Msg 15151, Level 16, State 1, Line 1 Cannot find the user 'dbuser', because it does not exist or you do not have permission.

我登錄到服務器SA具有完全權限。我可以執行類似的sql語句並將權限應用於服務器角色,但不是登錄名/用戶。

如何將更改應用於特定用戶/登錄?

我可以將權限應用到公共角色,它可以解決我的問題;然而,這似乎是我的一個安全問題,我不想將它應用到實時服務器上。

回答

5

從John的回答引出我檢查了Master數據庫上的用戶列表,並且我的用戶不在那裏。它是否被刪除或丟失了一些我不知道的東西。將dbs遷移到新的服務器實例可能會引發一些瘋狂的事情。

無論如何;重新創建用戶並將其關聯到特定登錄使我能夠在master數據庫上運行以下語句以允許執行存儲的特效。

USE MASTER 
GO 

GRANT EXECUTE ON [sys].[sp_OADestroy] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OACreate] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OAMethod] TO [dbuser] 
GO 
GRANT EXECUTE ON [sys].[sp_OASetProperty] TO [dbuser] 
GO 

感謝您的幫助和指點。希望這有助於未來的其他人。

+0

你是如何遷移你的數據庫的?如果您還沒有恢復主數據庫,那麼用戶「dbuser」將不會存在,因此也不會映射。 – 2010-06-15 10:48:43

+0

@John - 你是對的。 Master數據庫的恢復還沒有完成,這是因爲我們希望在遷移過程中擺脫一些歷史的壞點和波動。不幸的是,我們也失去了現在重新創建並映射到登錄的用戶:-) – WestDiscGolf 2010-06-15 11:04:42

1

檢查您的用戶是否具有您使用的數據庫的權限。您可以通過Security -> Logins -> Select User執行此操作並打開屬性窗口。然後從右側菜單中選擇"User Mapping"。現在檢查您希望給定用戶有權訪問的數據庫。之後,從窗口的底部選擇「數據庫角色成員資格」並檢查"db_owner"。現在用戶將成爲數據庫的所有者,並能夠執行查詢,存儲過程等。

UPDATE:
選擇你的數據庫的數據庫添加用戶 - >安全 - >用戶 - >右鍵單擊"New User"
或者您可以使用此查詢

CREATE LOGIN AbolrousHazem 
    WITH PASSWORD = '340$Uuxwp7Mcxo7Khy'; 
USE AdventureWorks2008R2; 
CREATE USER AbolrousHazem FOR LOGIN AbolrousHazem; 
GO 

這裏有更多的細節http://msdn.microsoft.com/en-us/library/ms173463.aspx

+0

感謝您的回覆。數據庫上設置用戶的db_owner角色。我試圖將特定的執行權限添加到db_owner角色,並收到以下錯誤消息:「無法授予,拒絕或撤銷對特殊角色或從特殊角色的權限」。 – WestDiscGolf 2010-06-15 09:33:19

+0

檢查您是否有用戶連接到您的數據庫。看起來你只有登錄而不是用戶。 – Thea 2010-06-15 10:08:24

+0

這似乎確實如此;我已經添加了解決問題的答案。感謝您的幫助:-) – WestDiscGolf 2010-06-15 10:44:30

2

您的問題可能與孤兒用戶有關。

嘗試

USE MASTER 
GO 
EXEC sp_change_users_login 'Report' 

這將返回每個孤立的用戶名一行。然後,

EXEC sp_change_users_login 'Update_One', 'dbuser', 'dbuser' 
+0

感謝您的回覆。我已經在服務器上運行了第一個命令,查詢沒有返回任何記錄。 – WestDiscGolf 2010-06-15 09:55:02

+0

感謝您在正確方向的幫助。 +1 :-) – WestDiscGolf 2010-06-15 10:46:22

4

錯誤表明用戶「dbuser」在主數據庫中不存在。

我假設用戶存在於主數據庫中?

您可以使用下面的T-SQL

USE MASTER; 
GO 

SELECT * 
FROM sys.sysusers 
WHERE name = 'dbuser' 

如果用戶原來不存在檢查,只需使用CREATE USER語句,並創建一個名爲「dbuser的」用戶。用戶將自動映射到同名的登錄名(如果存在)。

+0

感謝您的回覆。不,它不存在於sysusers表中。如何重新添加? – WestDiscGolf 2010-06-15 10:14:21

+0

好吧,重新添加用戶並將其與dbuser登錄關聯。然後,我將授予權限應用於用戶。 :-) – WestDiscGolf 2010-06-15 10:37:36

+0

@WestDiscGolf:好消息,很高興幫助。 – 2010-06-15 10:42:48

2

下面是一些代碼,我使用的驗證(當前用戶)對等由sp_OACreate EXECUTE權限:

use master; 
select state_desc,name from 
sys.database_permissions a 
left join 
sys.all_objects b 
on a.major_id = b.object_id 
where name like 'sp_OA%'; 

正如指出的@約翰桑塞姆和@WestDiscGolf的用戶在存在主數據庫和執行權限必須授予主數據庫,因此需要use Master。如果用戶具有執行權限,則上述查詢將返回記錄,如果用戶沒有執行權限,則返回記錄。 (在用戶數據庫中的執行也將返回空集。)

我找不出一種方式檢查這些權限使用fn_my_permissions,這應該是這樣的工作的正確工具。