2011-03-18 67 views

回答

9

正確答案是,存儲過程無權寫入表中。然而大多數用戶感知它,不正確,因爲由於Ownership Chains YES:

當多個數據庫對象訪問 彼此順序,序列 被稱爲鏈。雖然這樣的鏈不獨立存在,但當SQL Server遍歷鏈中的鏈接時,SQL Server將對構成對象 評估 的權限,與分別訪問對象的 不同。 這些差異對於管理安全性具有重要的意義 。 所有權鏈接允許通過對一個對象(例如 視圖)設置 權限來管理 多個對象的訪問權限,例如 多個表。

因此,一個程序就可以寫入到該用戶沒有權限寫入如果他們形成所有權鏈表。這意味着如果包含該表的模式的所有者與包含該過程的模式的所有者相同,則會形成所有權鏈,並允許該過程寫入表中。由於實踐中部署的絕大多數對象屬於dbo模式,所有權鏈幾乎總是形成。

瞭解這些細節非常重要,因此您可以排查問題並瞭解爲什麼是允許寫入表格的過程。 Erland Sommarskog在這個主題上有一個很好的綜合報道:Giving Permissions through Stored Procedures。本文詳細解釋了所有可用的選項。您的最佳選擇,比所有權鏈接更好,是code signing

瞭解這種工作原理還有助於理解爲什麼動態SQL似乎'破壞':運行動態SQL是所有權鏈中的一個自動中斷,導致所有'魔法'消失。這也有助於理解爲什麼這個'魔術'似乎不在數據庫之外工作:cross db ownership chaining Option默認值爲0.

+0

不能滿足這個足夠!只是測試了這一點,這是真的。現在我必須改變我的一些模式的所有權.... – DForck42 2011-03-18 18:51:36

0

是,如果用戶被授予對SP EXEC權限,它需要(即數據庫內)的任何動作都是允許的。

轉到另一個數據庫將需要對要檢查的基礎用戶的權限。

此外,SP中構建的動態SQL將要求底層用戶擁有權限。

+0

謝謝。正是我想知道的。乾杯。 – koumides 2011-03-18 17:32:01

+1

如果在proc中使用動態SQL,則會出現異常。然後,權限必須在表格或視圖級別。 – HLGEM 2011-03-18 17:41:27

+0

@HLGEM - 是的,這也是事實,動態SQL將在主叫用戶的上下文中執行 – 2011-03-18 17:44:16

0

總之,是的。

這種情況下的主要限制是用戶是否可以執行存儲過程。


創建存儲過程,它需要一個登錄/用戶已在問題表中必要的寫訪問完成。