在模組中使用 EXECUTE AS

EXECUTE AS 可用來定義下列使用者自訂模組的執行內容:函數、程序、佇列和觸發程序。例如,執行內容可以從模組的呼叫者切換到模組的擁有者,或切換到指定的使用者。在舊版的 SQL Server 中,這些模組一律在模組呼叫者的內容中執行。

您可以指定執行模組的內容來控制 Database Engine 是使用哪一個使用者帳戶,以驗證該模組參考之任何物件的權限。此舉可以在使用者自訂模組以及其所參考物件之間的物件鏈結管理權限時,提供更大的彈性和控制權。模組的使用者只需要執行模組本身的權限;不需要對所參考物件有明確權限。只有作為模組執行身分的使用者,才需要對該模組存取的物件具有權限。

EXECUTE AS CALLER

EXECUTE AS CALLER 指定在模組呼叫者的內容中執行模組內的陳述式。

在下列狀況中使用 EXECUTE AS CALLER:

  • 您想要模組的陳述式以呼叫使用者的身分執行。

  • 您想要將模組中陳述式針對呼叫使用者的權限檢查作為基礎,且僅依賴擁有權鏈結來略過基礎物件的權限檢查。請記住,擁有權鏈結只適用 DML 陳述式。如需有關擁有權鏈結的詳細資訊,請參閱<擁有權鏈結>。

  • 應用程式不需要對使用者隱藏基礎參考物件,或者,您只參考相同擁有權的物件,因此可依賴擁有權鏈結來隱藏結構描述。

  • 您想要保留 SQL Server 2000 的行為。

EXECUTE AS CALLER 案例

Mary 建立了預存程序,來參考不是她所擁有但具有 SELECT 權限的資料表。她在 CREATE PROCEDURE 陳述式中指定 EXECUTE AS CALLER,如這個範例所示:

CREATE PROCEDURE AccessTable
WITH EXECUTE AS CALLER
AS SELECT * FROM dbo.SomeTable;

然後 Mary 將預存程序的 EXECUTE 權限授與 Scott。當 Scott 執行預存程序時,Database Engine 會驗證他 (呼叫者) 是否有權限執行預存程序。Scott 有 EXECUTE 權限,但因為 Mary 並不是所參考資料表的擁有者,所以 Database Engine 會檢查 Scott 對該資料表是否具有權限。如果 Scott 沒有權限,預存程序陳述式會失敗。

EXECUTE AS user_name

EXECUTE AS user_name 指定模組中的陳述式會在 user_name 指定的使用者內容中執行。

在下列狀況中使用 EXECUTE AS user_name:

  • 您想要模組的陳述式在所指定使用者的內容中執行。

  • 您不能依賴擁有權鏈結 (例如,模組會存取具有不同擁有權的物件) 來隱藏基礎結構描述,而且您想要避免授與那些所參考物件的權限。

  • 您想要建立一個自訂權限集合。例如,要提供 DDL 作業的權限 (通常不對這類作業授與特定權限)。如需詳細資訊,請參閱<使用 EXECUTE AS 建立自訂權限集>。

    [!附註]

    指定為模組執行內容的使用者,要等到該模組的執行內容變更之後,才可予以卸除。

EXECUTE AS user_name 案例

Mary 建立了預存程序,來參考不是她所擁有但具有 SELECT 權限的資料表。她在 CREATE PROCEDURE 陳述式中指定 EXECUTE AS 'Mary',如這個範例所示:

CREATE PROCEDURE AccessMyTable
WITH EXECUTE AS 'Mary'
AS SELECT * FROM dbo.MyTable;

Mary 將預存程序的 EXECUTE 權限授與 Scott。當 Scott 執行預存程序時,Database Engine 會驗證他是否有執行此預存程序的權限;但參考資料表權限的檢查對象卻是 Mary。在此案例中,即使 Scott 並未直接擁有資料表的 SELECT 權限,他還是可以透過此程序存取資料,因為 Mary (程序是在她的內容中執行) 擁有存取資料表資料的權限。

EXECUTE AS SELF

EXECUTE AS SELF 相當於 EXECUTE AS user_name,其中指定的使用者就是建立或修改模組的人。

在下列狀況中使用 EXECUTE AS SELF:

  • 您想要一個將自己指定為使用者的捷徑,且您要在其內容下執行自己建立之模組、或修改為模組的陳述式。

  • 您有一個應用程式,它會建立模組以讓使用者能夠呼叫,且您希望建立那些模組時使用那些使用者作為執行內容。在此案例中,在設計階段您還不知道呼叫使用者的名稱。

EXECUTE AS OWNER

EXECUTE AS OWNER 指定模組內的陳述式在模組目前擁有者的內容中執行。如果該模組沒有指定的擁有者,則會採用該模組的結構描述擁有者。

在下列狀況中使用 EXECUTE AS OWNER:

  • 您想要能夠變更模組的擁有者,而不必修改模組本身。也就是說,在執行階段,OWNER 會自動對應到模組的目前擁有者。

OWNER 是模組的明確擁有者,或如果沒有明確擁有者,則為執行模組時模組結構描述的擁有者。OWNER 必須是單一帳戶,而不是群組或角色。當模組指定 EXECUTE AS OWNER 而且有明確擁有者時,模組的擁有權不能變更為群組或角色。如果結構描述包含的模組指定了 EXECUTE AS OWNER 且模組沒有明確擁有者,則結構描述的擁有權不能變更為角色或群組。

EXECUTE AS OWNER 案例

Mary 建立了預存程序來參考她擁有的資料表。她在 CREATE PROCEDURE 陳述式中指定 EXECUTE AS OWNER,如這個範例所示:

CREATE PROCEDURE Mary.AccessMyTable
WITH EXECUTE AS OWNER
AS SELECT * FROM Mary.MyTable;

Mary 將預存程序的 EXECUTE 權限授與 Scott。當 Scott 執行預存程序時,Database Engine 會驗證他有執行此預存程序的權限;不過,會檢查 Mary 對於所參考資料表的權限,因為她是目前的程序擁有者。Mary 決定離開公司,並將程序和資料表的擁有權變更為 Tom。在擁有權變更之後,當 Scott 要執行預存程序時,他仍然可以透過此程序存取資料,因為 OWNER 會自動對應到 Tom。