Sql-Server
將選擇授予 dbo 視圖,而不在非 dbo 表上選擇
SQL Server 2008 R2
我們有一個名為“JoeBlogs”的登錄和使用者,這個使用者有它自己的預設
schema
JoeBlogs——它Public
只能訪問數據庫。
SELECT
然後,我們在一個視圖上授予它dbo
- 但是該視圖從屬於非 dbodbo
模式的基礎表中選擇數據- 所以我們從視圖中選擇時收到一個錯誤,表示對基礎表的訪問被拒絕。如何配置使用者選擇訪問
dbo
視圖而不是底層的非 dbo表?這甚至可能嗎?
喬丹
在繼續解決方案之前,您必須了解問題。
當您從視圖中選擇時,SQL Server 系統會檢查兩次權限:
一次是從視圖中選擇,另一次是視圖引用基礎表時。
顯然,如果使用者對基礎表沒有權限,則第二次檢查將失敗。
Microsoft 已通過“所有權連結”(稱為 OC)解決了這個問題。
OC 將繞過視圖引用表時進行的權限檢查,
僅當視圖的所有者與表的所有者相同時。
問題是,OC 完全繞過了權限檢查,這意味著它也可以繞過拒絕……
例如,如果“JoeBlogs”擁有
create view
權限,他可以創建一個可以訪問整個表的新視圖。我建議您在決定行動方案之前閱讀所有權連結。
話雖如此,第一個直覺的解決方案是在與基礎表相同的非 dbo模式下創建視圖(或與****非 dbo模式相同的使用者擁有的模式)。
但是,如果您發現該解決方案風險太大,還有另一個(甚至更好)選項:
您始終可以使用帶有
EXECUTE AS
子句的函式(多語句表值函式):此方法將允許您
execute
在函式屬於 時從函式中選擇(函式的權限)dbo
。子句中指定的使用者execute as
必須對基礎表具有權限。