瞭解執行內容

執行內容是由連接到工作階段,或執行 (呼叫) 模組的使用者或登入所決定。它會根據檢查哪些權限可執行陳述式或執行動作的結果來建立身分。執行內容是由一對安全性 Token 來表示:登入 Token 和使用者 Token。Token 可識別必須檢查其權限的主要和次要主體,以及用來驗證 Token 的來源。連接到 SQL Server 執行個體的登入,會有一個登入 Token 與一或多個使用者 Token,視帳戶有存取權的資料庫數目而定。

使用者和登入安全性 Token

使用者或登入的安全性 Token 包含下列各項:

  • 一個作為主要識別的伺服器或資料庫主體

  • 一或多個作為次要識別的主體

  • 零或多個驗證器

  • 主要和次要識別的權限

主體是指可要求 SQL Server 資源的個人、群組和程序。主體是按其影響範圍來分類:Windows 層級、SQL Server 層級或資料庫層級。如需詳細資訊,請參閱<主體 (Database Engine)>。

驗證器是指可保證 Token 真實性的主體、憑證或非對稱金鑰。Token 的驗證器常常是指 SQL Server 的執行個體。如需驗證器的詳細資訊,請參閱<使用 EXECUTE AS 擴充資料庫模擬>。如需憑證和非對稱金鑰的詳細資訊,請參閱<加密階層>。

登入 Token 在整個 SQL Server 的執行個體上都有效。它包含主要和次要識別,系統會檢查這些識別的伺服器層級權限,以及與這些識別相關聯的任何資料庫層級權限。主要的識別是登入本身。次要的識別則包括繼承自角色和群組的權限。

使用者 Token 則只對特定的資料庫有效。它包含主要和次要識別,系統會檢查這些識別的資料庫層級權限。主要的識別是資料庫使用者本身。次要的識別則包括繼承自資料庫角色的權限。使用者 Token 不包含伺服器角色成員資格,也無法實施已授與給該 Token 中識別的伺服器層級權限,包括那些授與給伺服器層級 public 角色的權限。

如果是明確地建立 SQL Server 登入或使用者帳戶,則為該帳戶建立的登入或使用者識別碼,就會作為登入或使用者 Token 中的主要識別。當主體對 SQL Server 的執行個體具有隱含的存取權,或可透過 CONTROL SERVER 權限存取資料庫時,登入 Token 中的主要識別就是預設的 public 角色。使用者 Token 中的主要識別則是 public。

重要注意事項重要事項

系統管理員 (sysadmin) 固定伺服器角色的成員,一律以 dbo 作為其使用者 Token 的主要識別。

登入 Token 範例

Mary 有一個 SQL Server 登入,對應到她的 Windows 帳戶 MyDomain\Mary。若要檢視為 Mary 建立的登入 Token 相關資訊,她要執行下面這個陳述式:

SELECT principal_id, sid, name, type, usage FROM sys.login_token;
GO

結果集看起來會像這樣:

principal_id sid name type usage

------------ ----------- ------------- -------------- -------------

261 0x583EA MyDomain\Mary WINDOWS LOGIN GRANT OR DENY

2 0x02 public SERVER ROLE GRANT OR DENY

(2 row(s) affected)

結果集顯示出 Mary 的 Windows 帳戶,就是她登入 Token 的主要識別。建立登入帳戶時所建立的 principal_id,將作為登入 Token 的主要 principal_id。public 角色列為次要識別,因為 Mary 是該預設角色的成員之一。如果 Mary 是其他伺服器層級角色的成員,則那些角色也會列為次要識別。建立登入時,SQL Server 的執行個體會驗證她的 Windows 帳戶。因此,當 Mary 登入 SQL Server 的執行個體時,該執行個體就是她的登入 Token 的驗證器。因為 SQL Server 執行個體是 Mary 登入 Token 的驗證器,所以不會在查詢中傳回驗證器 (例如主體、憑證或非對稱金鑰)。

使用者 Token 範例

Mary 對於自己可存取的每一個資料庫,都有一個使用者 Token。在第一個範例中,Mary 連接到 master 資料庫。若要檢視在 master 資料庫中為 Mary 建立的使用者 Token 相關資訊,她要執行下面這個陳述式:

SELECT principal_id, sid, name, type, usage FROM sys.user_token;
GO

結果集看起來會像這樣:

principal_id sid name type usage

------------ ----------- ------------- -------------- -------------

2 NULL guest SQL USER GRANT OR DENY

0 NULL public ROLE GRANT OR DENY

(2 row(s) affected)

結果集顯示出 Mary 在 master 資料庫中不是明確的使用者,而是透過 guest 帳戶才具有存取權。其使用者 Token 的主要識別是 guest 使用者。public 角色列為次要識別,因為 guest 是該預設角色的成員之一。在 master 資料庫中,Mary 的使用者 Token 包含 guest 使用者和 public 角色的所有資料庫層級權限。

在下面的範例中,Mary 的明確使用者帳戶已建立在 Sales 資料庫中。另外,她也已加入至該資料庫的 db_ddladmin 固定資料庫角色中。Mary 以 Sales 做為目前的資料庫,再次執行 SELECT * FROM sys.user_token。

結果集看起來會像這樣:

principal_id sid name type usage

------------ ----------- ------------- -------------- -------------

5 0x36CC4BBD1 Mary SQL USER GRANT OR DENY

0 NULL public ROLE GRANT OR DENY

16387 NULL db_ddladmin ROLE GRANT OR DENY

此結果集反映出 Sales 資料庫中為 Mary 建立的使用者 Token。因為 Mary 已明確加入 Sales 資料庫成為使用者之一,所以她已列為主要識別。她是成員之一的兩個角色,則列為次要識別。Mary 的使用者 Token 驗證器是 SQL Server 的執行個體。

切換執行內容

在 SQL Server 中,於 EXECUTE AS 陳述式中指定使用者或登入名稱,可明確地變更工作階段的執行內容。在模組定義的 EXECUTE AS 子句中指定使用者或登入名稱,則可隱含地變更模組 (例如預存程序、觸發程序或使用者自訂函數) 的執行內容。當執行內容切換到另一個使用者或登入時,SQL Server 會檢查該帳戶的登入和使用者 Token 之權限。在本質上,系統是針對工作階段期間或模組執行而模擬該帳戶。如需詳細資訊,請參閱<瞭解內容切換>。