Sql-Server

將選擇授予 dbo 視圖,而不在非 dbo 表上選擇

  • December 3, 2021

SQL Server 2008 R2

我們有一個名為“JoeBlogs”的登錄和使用者,這個使用者有它自己的預設schemaJoeBlogs——它Public只能訪問數據庫。

SELECT然後,我們在一個視圖上授予它dbo- 但是該視圖從屬於非 dbodbo模式的基礎表中選擇數據- 所以我們從視圖中選擇時收到一個錯誤,表示對基礎表的訪問被拒絕。

如何配置使用者選擇訪問dbo視圖而不是底層的非 dbo表?

這甚至可能嗎?

喬丹

在繼續解決方案之前,您必須了解問題。

當您從視圖中選擇時,SQL Server 系統會檢查兩次權限:

一次是從視圖中選擇,另一次是視圖引用基礎表時。

顯然,如果使用者對基礎表沒有權限,則第二次檢查將失敗。

Microsoft 已通過“所有權連結”(稱為 OC)解決了這個問題。

OC 將繞過視圖引用表時進行的權限檢查,

當視圖的所有者與表的所有者相同時。

問題是,OC 完全繞過了權限檢查,這意味著它也可以繞過拒絕……

例如,如果“JoeBlogs”擁有create view權限,他可以創建一個可以訪問整個表的新視圖。

我建議您在決定行動方案之前閱讀所有權連結。

網上書籍

msdn部落格

詳細範例,使用儲存過程代替視圖

話雖如此,第一個直覺的解決方案是在與基礎表相同的非 dbo模式下創建視圖(或與****非 dbo模式相同的使用者擁有的模式)。

但是,如果您發現該解決方案風險太大,還有另一個(甚至更好)選項:

您始終可以使用帶有EXECUTE AS子句的函式(多語句表值函式):

創建函式語法

執行 as 子句

此方法將允許您execute在函式屬於 時從函式中選擇(函式的權限) dbo。子句中指定的使用者execute as必須對基礎表具有權限。

引用自:https://dba.stackexchange.com/questions/27229