SID 和識別碼

如果您正在撰寫與 SQL Server 引擎互動的程式碼,就應該注意兩組當做主體內部表示使用的數字。每個主體都具有一個識別碼和一個安全性識別碼 (SID)。這些數字的意義和來源會根據主體的建立方式而定,並且根據它是伺服器主體或資料庫主體而定。

伺服器層級識別碼

建立 SQL Server 登入時,系統會指派識別碼和 SID 給這個登入。這些識別碼會在 sys.server_principals 目錄檢視中顯示成 principal_id 和 SID。識別碼 (principal_id) 可將登入識別為伺服器中的安全性實體。它是在建立登入時,由 SQL Server 所指派的。刪除登入後,系統就會回收其識別碼。SID 可識別登入的安全性內容,而且它在伺服器執行個體中是唯一的。SID 的來源會根據建立登入的方式而定。如果登入是從 Windows 使用者或群組建立的,系統就會提供來源主體的 Windows SID 給此登入,而且該 Windows SID 在網域中是唯一的。如果 SQL Server 登入是從憑證或非對稱金鑰建立的,系統就會指派一個衍生自公開金鑰 SHA-1 雜湊的 SID 給此登入。如果登入是建立成需要密碼的傳統樣式 SQL Server 登入,伺服器就會產生 SID。

資料庫層級識別碼

當建立資料庫使用者時,系統會為它指派一個識別碼和安全性識別碼 (SID)。這些識別碼會在 sys.database_principals 目錄檢視中顯示成 principal_id 和 SID。識別碼可將使用者識別為資料庫中的安全性實體。刪除資料庫使用者後,系統就會回收其識別碼。指派給資料庫使用者的 SID 在資料庫中是唯一的。SID 的來源會根據建立資料庫使用者的方式而定。如果使用者是從 SQL Server 登入建立的,系統就會提供登入的 SID 給這個使用者。如果使用者是從憑證或非對稱金鑰建立的,此 SID 就會衍生自公開金鑰的 SHA-1 雜湊。

資料庫使用者的數目上限

資料庫使用者的數目上限是由使用者識別碼欄位大小所決定。使用者識別碼的值必須為零或正整數。在 SQL Server 2000 中,使用者識別碼會儲存成包含 16 個位元的 smallint,而且其中一個位元是符號。因此,SQL Server 2000 中使用者識別碼的最大數目為 215 = 32,768。在 SQL Server 2005 及更新版本中,使用者識別碼會儲存成包含 32 個位元的 int,而且其中一個位元是符號。這些額外的位元可讓您指派 231 = 2,147,483,648 個識別碼。

資料庫使用者識別碼可分成預先配置的範圍,如下表所示。

SQL Server 2000 ID

SQL Server 2005 ID

配置給

0

0

public

1

1

dbo

2

2

guest

3

3

INFORMATION_SCHEMA

4

4

SYSTEM_FUNCTION_SCHEMA

5 - 16383

5 - 16383

使用者、別名、應用程式角色

16384

16384

db_owner

16385

16385

db_accessadmin

16386

16386

db_securityadmin

16387

16387

db_ddladmin

16389

16389

db_backupoperator

16390

16390

db_datareader

16391

16391

db_datawriter

16392

16392

db_denydatareader

16393

16393

db_denydatawriter

16394 - 16399

16394 - 16399

已保留

16400 - 32767

角色

16400 - 2,147,483,647

使用者、角色、應用程式角色、別名

使用者識別碼的大小會從 smallint (16 個位元) 增加為 int (32 個位元)。如果傳遞了 32 位元的使用者識別碼,則需要 16 位元使用者識別碼的 API 將會傳回不正確的結果。在移轉針對 SQL Server 2000 或舊版建立的資料和應用程式時,您應該檢閱程式碼,以了解是否參考下列已被取代的介面。

  • sysusers

  • syscacheobjects

  • sysmembers

  • sysobjects

  • syspermissions

  • sysprocesses

  • sysprotects

  • systypes

  • USER_ID

這些介面會要求 16 位元使用者識別碼。如果搭配 32 位元使用者識別碼使用,它們就不會傳回正確的結果。