傳回使用者名稱與使用者識別碼的函數

有幾個系統函數會傳回使用者名稱與使用者識別碼。要瞭解這些函數的參數及輸出,必須先瞭解 SQL Server 中所使用的名稱與識別碼類型。

登入 SQL Server 的每一位使用者,在 SQL Server 中都有兩個層級的名稱,每個名稱都會與唯一識別碼相關聯:

  • 登入名稱

    擁有登入 SQL Server 權限的每一位使用者,都有一個登入名稱可讓他們存取 SQL Server 的執行個體。登入名稱有以下兩種類型:

    • Microsoft Windows 帳戶名稱

      使用 sp_grantlogin系統管理員 (sysadmin)安全性管理員 (securityadmin) 固定伺服器角色的成員即可授權給個人使用者或 Windows 群組的 Windows 帳戶,使其能夠登入 SQL Server 的執行個體。接著,以 Windows 帳戶識別的使用者,或 Windows 群組中的任何人,都可使用 Windows 驗證連接到 SQL Server 的執行個體。每個 Windows 帳戶或群組名稱都會儲存在 sys.server_principals 中。Windows 帳戶或群組的 Windows 安全識別碼會儲存在 sys.server_principals.sid 中。

    • SQL Server 登入名稱

      當使用者使用「SQL Server 驗證」登入時,就會使用這些名稱。SQL Server 登入名稱是由系統管理員 (sysadmin)安全性管理員 (securityadmin) 固定伺服器角色的成員使用 sp_addlogin 所定義的。每個 SQL Server 登入名稱都會儲存在 master.dbo.syslogins.loginname 中。SQL Server 會產生一個當作安全性識別碼使用的 GUID,並將其儲存在 sys.server_principals.sid 中。

      SQL Server 會使用 sys.server_principals.sid 作為登入名稱的 security_identifier。

  • 資料庫使用者名稱

    對於使用者有權存取的每個資料庫,每個 Windows 帳戶或 SQL Server 登入都必須與其中的某個使用者名稱有關聯,或資料庫必須啟用 guest 存取權限。資料庫使用者名稱是由 db_ownerdb_accessadmin 固定資料庫角色的成員所定義,它們會儲存在每個資料庫的 sys.database_principals 資料表中。每個資料庫使用者名稱都會與儲存在 sys.database_principals.uid 中的一個資料庫使用者識別碼有關聯。

    每位使用者的 security identifier 會儲存在 sys.database_principals.sid 中;因此,使用者皆可對應回其關聯的登入。若針對 SQL Server 登入或 Windows 帳戶使用相同的資料庫使用者名稱,將可減少混淆的情形;但沒有必要這麼做。

取得登入帳戶或識別碼

當您連接到 SQL Server 執行個體時,您可以使用下列項目來取得登入帳戶或識別碼:

  • SUSER_SNAME:用以取得與 security identifier 相關的 SQL Server 登入名稱或 Windows 帳戶。

  • SUSER_SID:用以取得與 SQL Server 登入名稱或 Windows 帳戶相關的 security identifier。

  • SUSER_SID() (指定 SUSER_SID,但未指定 login_account 參數):用以取得目前連接的 security identifier,無論使用的是「SQL Server 驗證」還是「Windows 驗證」都一樣。

  • ISO 函數 SYSTEM_USER 用以取得 Windows 帳戶以進行 Windows 驗證連接,或取得 SQL Server 登入名稱以進行 SQL Server 驗證連接。在 Transact-SQL 中,SYSTEM_USER 會被當作 SUSER_SNAME() (指定 SUSER_SNAME,但未指定 security_identifier 參數) 的同義字實作。

在 SQL Server 中,會傳回登入名稱或帳戶的函數,是以下列方式運作:

  • SUSER_SNAME(security_identifier)

    SUSER_SNAME 會使用以下的其中一項:

    • Windows 帳戶或群組的 security_identifier,在此情況下會傳回 Windows 帳戶或群組的名稱。

    • 為 SQL Server 登入所產生的虛擬 security_identifier,在此情況下會傳回 SQL Server 登入名稱。

    如果在使用「Windows 驗證」進行連接時未指定 security_identifier,SUSER_SNAME 就會傳回與連接相關的 Windows 帳戶名稱。如果是利用 SQL Server 驗證來進行連接,則 SUSER_SNAME 會傳回與連接相關聯的 SQL Server 登入。

  • SYSTEM_USER

    ISO 函數會被當作 SUSER_SNAME() 的同義字來實作。(指定 SUSER_SNAME,但未指定 security_identifier 參數。)

取得資料庫使用者名稱或使用者識別碼

當您連接到 SQL Server 執行個體時,可以使用下列項目來取得使用者名稱或使用者識別碼:

  • USER_ID 用以取得與資料庫使用者名稱相關聯的資料庫使用者識別碼。

  • USER_ID() 用以取得與目前連接相關聯的資料庫使用者識別碼。

  • USER_NAME 用以取得與資料庫使用者識別碼相關聯的資料庫使用者名稱。

  • ISO CURRENT_USER 或 SESSION_USER 函數,可用以取得與目前連接相關聯的資料庫使用者名稱。在 Transact-SQL 中,這些函數會被當作 USER_NAME() 的同義字來實作。(指定 USER_NAME,但未指定 database_user_ID 參數。)Transact-SQL 函數 USER 也會被當作 USER_NAME() 的同義字來實作。

    ISO 允許 SQL 陳述式在 SQL 模組中進行編碼,它的授權識別碼與連接到 SQL 資料庫的使用者之授權識別碼不同。ISO 指定 SESSION_USER 永遠會傳回進行連線的使用者之授權識別碼。CURRENT_USER 會對任何從 SQL 模組中執行的陳述式傳回 SQL 模組之授權識別碼,如果不是從 SQL 模組執行 SQL 陳述式,則為進行連接的使用者之授權識別碼。若 SQL 模組沒有個別的授權識別碼,ISO 會指定 CURRENT_USER 傳回與 SESSION_USER 相同的值。SQL Server 的 SQL 模組沒有個別的授權識別碼,因此 CURRENT_USER 與 SESSION_USER 始終相同。ISO 會將 USER 函數定義為寫入舊版標準的應用程式之回溯相容性函數。它被指定傳回與 CURRENT_USER 相同的值。

在 SQL Server 中,會傳回登入名稱或帳戶的函數,是以下列方式運作:

  • USER_ID('database_user_name')

    USER_ID 會傳回與指定的資料庫使用者名稱相關聯的資料庫使用者識別碼。如果未指定 database_user_name,USER_ID 就會傳回與目前連接相關的資料庫使用者識別碼。

  • USER_NAME(database_user_ID)

    USER_NAME 會傳回與指定資料庫使用者識別碼相關的資料庫使用者名稱。如果未指定 database_user_ID,USER_NAME 就會傳回與目前連接相關的資料庫使用者名稱。

  • CURRENT_USER、SESSION_USER、USER

    這些函數都是 USER_NAME() 的同義字。(指定 USER NAME,但未指定 database_user_ID 參數。)