擁有權鏈結

當多個資料庫物件依序存取彼此時,此順序即稱為「鏈結」。雖然此類鏈結不會獨立存在,當 SQL Server 周遊鏈結中的連結時,SQL Server 評估要素物件權限的方式,與單獨存取物件時不同。這些差異在管理安全性時具有重要的影響。

您可以透過擁有權鏈結,在一個物件 (例如:檢視) 上設定權限,而管理多個物件的存取 (例如:多個資料表)。在允許略過權限檢查的情況中,擁有權鏈結也能提供好一點的效能。

如何檢查鏈結中的權限

透過鏈結存取物件時,SQL Server 會先比較被呼叫物件的擁有者與呼叫物件的擁有者。這是鏈結中的上衣個連結。若兩個物件的擁有者相同,則不會評估被參考之物件上的權限。

擁有權鏈結範例

在下圖中,July2003 檢視的擁有者是 Mary。她已相檢視上的權限授與 Alex。他在此執行個體的資料庫物件沒有其他權限。當 Alex 選取該檢視時會發生什麼事?

擁有權鏈結的圖表

  1. Alex 在 July2003 檢視上執行 SELECT *。SQL Server 會檢查檢視上的權限,並確認 Alex 在該檢視上有選取的權限。

  2. July2003 檢視需要來自 SalesXZ 檢視的資訊。SQL Server 會檢查 SalesXZ 檢視的擁有權。因為此檢視與呼叫此檢視之檢視具有相同的擁有者 (Mary),所以不會檢查 SalesXZ 上的權限。會傳回要求的資訊。

  3. SalesXZ 檢視需要來自 InvoicesXZ 檢視的資訊。SQL Server 會檢查 InvoicesXZ 檢視的擁有權。因為此檢視與上一個物件具有相同的擁有者,所以不會檢查 InvoicesXZ 上的權限。會傳回要求的資訊。此時,順序中的所有項目都只有一個擁有者 (Mary)。這就稱為「接續擁有權鏈結」。

  4. InvoicesXZ 檢視需要來自 AcctAgeXZ 檢視的資訊。SQL Server 會檢查 AcctAgeXZ 檢視的擁有權。由於這個檢視的擁有者與上一個物件的擁有者不同 (Sam,而不是 Mary),所以系統會擷取有關這個檢視的完整權限資訊。若 AcctAgeXZ 檢視具有可啟用 Alex 存取的權限,則會傳回資訊。

  5. AcctAgeXZ 檢視需要來自 ExpenseXZ 資料表的資訊。SQL Server 會檢查 ExpenseXZ 資料表的擁有權。因為此資料表的擁有者與上一個物件的擁有者不同 (Joe,而非 Sam),所以系統會擷取有關此資料表的完整權限資訊。若 ExpenseXZ 資料表具有可啟用 Alex 存取的權限,則會傳回資訊。

  6. July2003 檢視嘗試從 ProjectionsXZ 資料表擷取資訊時,伺服器會先檢查 Database 1Database 2 之間是否已啟用跨資料庫鏈結。若已啟用跨資料庫鏈結,伺服器會檢查 ProjectionsXZ 資料表的擁有權。因為此資料表與呼叫的檢視具有相同的擁有者 (Mary),所以系統不會檢查此資料表上的權限,而會傳回要求的資訊。

跨資料庫擁有權鏈結

您可以將 SQL Server 設定為允許特定資料庫之間,或單一 SQL Server 執行個體中所有資料庫之間的擁有權鏈結。掛資料庫擁有權鏈結依預設是停用的,除非特別需要,否則不應啟用。

潛在威脅

擁有權鏈結在管理資料庫權限時非常有用,但它並不假設物件擁有者在授與安全性實體的權限時都會考慮到所有可能的結果。在上圖中,Mary 擁有 July 2003 檢視的大部分基礎物件。因為 Mary 可將其擁有之物件的存取權授與其他任何使用者,所以 SQL Server 會假設當 Mary 授與鏈結中第一個檢視的存取權時,她已決定與其他使用者共用該檢視參考的所有檢視與資料表。在現實生活中,這可能不是有效假設。實際執行的資料庫比圖解中的資料庫更為複雜,而規範存取權的權限通常無法完美地對應到使用這些資料庫之組織的行政架構。

您應該了解,具有高度權限的資料庫角色可以使用跨資料庫擁有權鏈結,來存取並非由其擁有之資料庫中的物件。例如,若資料庫 A 與資料庫 B 之間已啟用跨資料庫擁有權鏈結,兩個資料庫的 db_owner 固定資料庫角色的成員都可以存取另一個資料庫。整個程序非常簡單:Diane (資料庫 Adb_owner 成員) 在資料庫 A 中建立使用者 StuartStuart 已經是資料庫 B 中的使用者。接著,Diane 在資料庫 A 中建立一個物件 (由 Stuart 所擁有),此物件呼叫資料庫 BStuart 所擁有的任何物件。因為發出呼叫與被呼叫的物件具有共通的擁有者,當 Diane 透過她建立的物件來存取時,不會檢查資料庫 B 中之物件的權限。

請參閱

概念