2009-02-06 14 views
3

我有兩個Microsoft SQL Server 2000數據庫,一個存儲過程試圖從另一個數據庫讀取數據。這用於正常工作,但由於我變得注重安全性並將登錄(SQL用戶)從「db owner」更改爲「denydatareader」,調用失敗。爲什麼存儲過程無法從另一個數據庫讀取表(我必須錯誤地使用GRANT和DENY)

如果我使用「datareader」組,可以使事情正常工作,但由於我不希望此登錄對用戶表具有讀訪問權限(ASP僅使用特效),所以我認爲這是不明智的。如果我將用戶從所有組中取出,它也可以工作!這個可以嗎?


一個數據庫被稱爲'內部',並有一個名爲'東西'的表。 另一個名爲'WebFacing',並有一個名爲'Get_Some_Data'的存儲過程,它從'Internal..Stuff'中進行選擇。

我的內部數據庫上運行此命令:
GRANT SELECT ON Stuff TO magnus

我跑這一個面向捲筒紙數據庫:
GRANT EXECUTE ON Get_Some_Data TO magnus

我的ASP使用的SQL登錄「馬格努斯」,並連接到' WebFacing'數據庫。 當它試圖Exec中的程序,它用錯誤:
SELECT permission denied on object 'Stuff', database 'Internal', owner 'dbo'.


(道歉,如果這是一個愚蠢的問題,但我已經在深水的一端被推倒,只有瞭解了授予和拒絕昨天。我嘗試過使用谷歌搜索...)

+0

我想我是問我的登錄/用戶應該在一個組中,還是可以成爲「公共」的成員? – 2009-02-06 15:00:28

+0

您的數據庫是否在SQL Server的同一實例上運行,或者它們在不同的實例/服務器上運行? – Eppz 2009-02-06 19:05:26

+0

相同的服務器,相同的實例 – 2009-02-10 11:15:47

回答

3

將SQL登錄與組/角色(或不是)關聯起來對於需要跟蹤數據庫權限的人來說更方便。由於您對所有這些都是陌生的,因此在擔心通過組/角色管理權限之前,我會首先專注於獲取特定登錄的權限。

當我第一次開始使用SQL Server權限時,給了我的東西之一就是理解用於執行存儲過程的權限是否是用於調用過程的SQL登錄名的權限,或SQL登錄與創建proc本身相關聯。這個術語(該組證書和相關權限用於執行proc代碼)被稱爲存儲過程所運行的「安全上下文」。我最近一直在使用MySQL,但是如果我沒有記錯的話,用於在SQL Server上執行存儲過程的默認安全上下文就是CALLER而不是proc所有者。這總是讓我感到違反直覺,因爲在我看來,使用存儲過程的一個關鍵優勢應該是隻能授予對CALLER登錄的特定過程的EXEC權限。但是當我試圖這樣做時,我不可避免地會獲得權限錯誤,因爲我用來調用proc的憑據將不具備完成存儲過程中包含的一個或多個操作所需的權限。

如果您正在使用SQL Server 2005並希望只能授予CALLER憑證的EXEC權限,那麼this文章可能會幫助您瞭解如何實現這一點。在我看來,這是「正確」的做事方式,儘管我確信也許有人可能會不同意(儘管我可能會堅持我的觀點)。

無論如何,我不知道我已透過這篇文章澄清了這個問題。當你首先研究整個問題時,SQL Server權限管理確實有點深刻。這不會讓你更容易處理跨多個數據庫的設置問題。

0

當您轉到同一實例上的其他數據庫時,在允許運行之前,每個「commmand」對同一上下文中由目標數據庫評估的表和視圖擁有權限。

這與完全位於與SP完全相同的數據庫中不同,其中SP對於您具有EXEC權限的表中所引用的表不需要SELECT表。

您可以使用EXECUTE AS作爲擁有權限的人來執行,或者另一種選擇是在僅返回所需列的第二個數據庫中創建VIEW,或者在表上設置列級權限,或者創建一個SP並調用它(你將不得不將結果插入臨時表中,所以效率不是很高)。

+0

EXECUTE AS僅適用於SQL2005我認爲?我應該說我正在使用SQL2000。但謝謝你澄清第一點。 – 2009-02-11 13:44:10

1

您可以啓用Croos數據庫的所有權,而無需在您的存儲過程正在調用的表上給予選擇權限。但使用風險自負。我用它爲你所描述的scenraio:

ALTER DATABASE DBNAME集db_chaining上

0

連接字符串的用戶!

絕對是一個權限問題,但是誰?

對我來說,調用存儲過程(試圖)訪問不同數據庫中的表, 這是連接字符串中的用戶必須具有GRANT權限。

相關問題