共用方式為


使用 SQL Server 中的模擬來自訂權限 (ADO.NET)

更新: November 2007

許多應用程式會使用預存程序 (Stored Procedure) 來存取資料,並仰賴擁有權鏈結來限制基底資料表的存取。您可以授與預存程序的 EXECUTE 權限,並撤銷或拒絕基底資料表的權限。如果預存程序和資料表具有相同的擁有者,SQL Server 就不會檢查呼叫端的權限。不過,如果物件具有不同的擁有者或在動態 SQL 的情況中,擁有權鏈結便沒有作用。

從 SQL Server 2005 開始,當呼叫端沒有所參考資料庫物件的權限時,您就可以在預存程序中使用 EXECUTE AS 子句。EXECUTE AS 子句的作用是將執行內容切換至 Proxy 使用者。所有程式碼以及巢狀預存程序或觸發程序 (Trigger) 的任何呼叫都會在 Proxy 使用者的安全性內容底下執行。只有在執行此程序之後,或發出 REVERT 陳述式時,執行內容才會還原成原始呼叫端。

使用 EXECUTE AS 陳述式來切換內容

Transact-SQL EXECUTE AS 陳述式可讓您透過模擬另一個登入或資料庫使用者,切換陳述式的執行內容。以另一個使用者的身分測試查詢和程序時,這是很有用的技巧。

EXECUTE AS LOGIN = 'loginName';
EXECUTE AS USER = 'userName';

您必須擁有要模擬之登入或使用的 IMPERSONATE 權限。對於所有資料庫的 sysadmin 以及擁有資料庫的 db_owner 角色成員而言,這個權限是隱含的。

使用 EXECUTE AS 子句來授與權限

您可以在預存程序、觸發程序或使用者定義函式 (內嵌 (Inline) 資料表值函式除外) 的定義標頭中使用 EXECUTE AS 子句。這樣做會導致此程序在 EXECUTE AS 子句中指定之使用者名稱或關鍵字的內容中執行。您可以在資料庫中建立沒有對應至登入的 Proxy 使用者,並僅授與此程序所存取之物件的必要權限給該位使用者。只有 EXECUTE AS 子句中指定的 Proxy 使用者必須擁有此模組所存取之所有物件的權限。

注意事項:

某些動作 (例如 TRUNCATE TABLE) 沒有可授與的權限。您可以在程序中併入陳述式並指定擁有 ALTER TABLE 權限的 Proxy 使用者,藉以針對僅擁有程序之 EXECUTE 權限的呼叫端擴充截斷資料表的權限。

EXECUTE AS 子句中指定的內容在此程序的持續期間內有效,包括巢狀程序和觸發程序。當執行完成或發出 REVERT 陳述式時,內容就會還原成呼叫端。

在程序中使用 EXECUTE AS 子句包含三個步驟。

  1. 在資料庫中建立沒有對應至登入的 Proxy 使用者。雖然這並非必要條件,但是在管理權限時很有用。
CREATE USER proxyUser WITHOUT LOGIN
  1. 將必要權限授與 Proxy 使用者。

  2. 將 EXECUTE AS 子句加入至預存程序或使用者定義函式。

CREATE PROCEDURE [procName] WITH EXECUTE AS 'proxyUser' AS ...
注意事項:

需要稽核的應用程式可能會中斷,因為系統沒有保留呼叫端的原始安全性內容。傳回目前使用者之識別 (例如 SESSION_USER、USER 或 USER_NAME) 的內建函式會傳回與 EXECUTE AS 子句相關聯的使用者,而非原始呼叫端。

使用 EXECUTE AS 搭配 REVERT

您可以使用 Transact-SQL REVERT 陳述式來還原成原始執行內容。

如果 @variableName 變數包含正確的值,選擇性 (Optional) 子句 WITH NO REVERT COOKIE = @variableName 可讓您將執行內容切換回呼叫端。這樣可讓您在使用連接共用 (Connection Pooling) 的環境中,將執行內容切換回呼叫端。由於只有 EXECUTE AS 陳述式的呼叫端知道 @variableName 的值,因此該呼叫端可以保證叫用 (Invoke) 應用程式的使用者無法變更執行內容。關閉連接時,它就會傳回集區。如需 ADO.NET 中連接共用的詳細資訊,請參閱 SQL Server 連接共用 (ADO.NET)

指定執行內容

除了指定使用者以外,您也可以使用 EXECUTE AS 搭配下列任何關鍵字。

  • CALLER:以 CALLER 的身分執行是預設值。如果沒有指定任何其他選項,此程序就會在呼叫端的安全性內容中執行。

  • OWNER:以 OWNER 的身分執行會在程序擁有者的內容中執行此程序。如果此程序建立於 dbo 或資料庫擁有者所擁有的結構描述中,此程序將以不受限制的權限執行。

  • SELF:以 SELF 的身分執行會在預存程序之建立者的安全性內容中執行。這相當於以指定之使用者的身分執行,而該指定的使用者是建立或更改程序的人員。

外部資源

如需詳細資訊,請參閱下列資源。

資源

描述

內容切換 (英文),《SQL Server 2008 線上叢書》

包含說明如何使用 EXECUTE AS 子句之主題的連結。

使用 EXECUTE AS 建立自訂權限集在模組中使用 EXECUTE AS,《SQL Server 2005 線上叢書》

說明如何使用 EXECUTE AS 子句的主題。

請參閱

概念

SQL Server 中的應用程式安全性案例 (ADO.NET)

在 SQL Server 中使用預存程序管理權限 (ADO.NET)

在 SQL Server 中撰寫安全的動態 SQL (ADO.NET)

在 SQL Server 中簽署預存程序 (ADO.NET)

使用預存程序修改資料 (ADO.NET)

其他資源

保護 ADO.NET 應用程式的安全

SQL Server 安全性的概觀 (ADO.NET)