Sql-Server

SQL Server 鏈權限

  • September 18, 2018

我們有 2 個數據庫。

  • 報告
  • 人力資源

有一些使用者想要從 HR 數據庫中提取數據。但是我們不想直接訪問那個 HR 數據庫。

因此,我們在 Reporting 數據庫中創建了特殊視圖,並且使用者擁有該 Reporting 數據庫的dbowner權限。

但是,當他們嘗試執行查詢時,會顯示錯誤消息…

The server principal "test" is not able to access the database "HR" under the current security context. 

當我授予他們作為 HR 數據庫的db_datareader閱讀器時,一切都很好,他們可以執行查詢。但它破壞了安全性,我們不希望他們直接訪問 HR 數據庫。這就是我們在報告數據庫中製作特殊視圖的原因。

如何讓這些使用者在不直接訪問 HR 數據庫的情況下執行視圖/查詢?

除非您啟用了跨數據庫所有權連結(預設關閉)並且在兩個數據庫中具有相同的使用者,否則授予對一個數據庫中的對象的訪問權限並不意味著對其他數據庫有任何權限。當然,我不建議啟用跨數據庫所有權連結,Microsoft 也不建議啟用。

相反,您應該創建一個可用於簽署模組並充當數據庫之間權限代理的證書。問題是它們適用於儲存過程、函式(非內聯 TVF)、程序集和触發器。但是這種方法允許那些不應該訪問[HR]數據庫的使用者實際上沒有任何訪問權限:它是具有訪問權限的程式碼(即模組)。

基本概念:

  • 在中創建證書[Reporting]
  • 在中創建儲存過程[Reporting](直接從表中選擇[HR]
  • 用於使用ADD SIGNATURE證書對新儲存過程進行簽名
  • 將證書備份到文件
  • 在您剛剛創建的備份文件中創建證書[HR](證書需要在兩個地方都相同!)
  • [HR]在FROM 證書中創建使用者
  • GRANT SELECT對新的基於證書的使用者的適當表[HR](即新儲存過程中的引用)的權限[Reporting]
  • 回家享受剩下的一天:)

一些資源:

或者,如果您更喜歡使用視圖的簡單性,那麼您的視圖位於錯誤的數據庫中。您需要改為:

  • 將適當的使用者添加到$$ HR $$數據庫,以便有基本訪問權限,但不授予任何表的任何權限(希望沒有組或角色成員資格會暗示此類權限)
  • 在$$ HR $$數據庫
  • GRANT SELECT僅對這些視圖,而不是對其他任何東西,對這些使用者

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