識別碼與安全性識別碼
新增: 2006 年 4 月 14 日
如果您正在撰寫與 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。
資料庫層級識別碼
當資料庫使用者建立後,會指派識別碼 (ID) 與安全性識別碼 (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 |
使用者、角色、應用程式角色、別名 |
在 SQL Server 2005 中,使用者識別碼的大小從 smallint (16 個位元) 增加為 int (32 個位元)。如果您傳遞 32 位元使用者識別碼,要求 16 位元使用者識別碼的 API 將會傳回不正確的結果。移轉針對舊版 SQL Server 所建立的資料和應用程式時,您應該檢閱下列已被取代之介面的參考程式碼。
- sysusers
- syscacheobjects
- sysmembers
- sysobjects
- syspermissions
- sysprocesses
- sysprotects
- systypes
- USER_ID
這些介面會要求 16 位元使用者識別碼。如果您使用 32 位元使用者識別碼時,它們就不會傳回正確的結果。
請參閱
概念
其他資源
sys.server_principals (Transact-SQL)
sys.database_principals (Transact-SQL)
USER_ID (Transact-SQL)
SUSER_SID (Transact-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)