SID および ID
SQL Server エンジンを操作するコードを記述する場合、プリンシパルの内部表現として使用される 2 つの数値に注意する必要があります。すべてのプリンシパルには、ID とセキュリティ ID (SID) があります。これらの数値の意味およびソースは、プリンシパルがどのように作成されたか、およびサービス プリンシパルとデータベース プリンシパルのどちらであるかによって異なります。
サーバー レベルの ID 番号
SQL Server ログインが作成されると、ID および SID が割り当てられます。ID および SID は、sys.server_principals カタログ ビューで principal_id および SID として確認できます。ID (principal_id) は、そのログインをサーバー内部でセキュリティ保護可能なログインとして識別します。ID は、ログイン作成時に SQL Server によって割り当てられます。ログインが削除されると、その ID 番号は再利用されます。SID は、ログインのセキュリティ コンテキストを識別し、サーバー インスタンス内で一意です。SID のソースは、ログインの作成方法によって異なります。ログインが Windows ユーザーまたはグループから作成されると、このログインには、元のプリンシパルの Windows SID が指定されます。Windows SID はドメイン内で一意です。SQL Server ログインが証明書または非対称キーから作成されると、公開キーの SHA-1 ハッシュから派生した SID が割り当てられます。パスワードを必要とする従来型の SQL Server ログインとして作成されると、サーバーで SID が生成されます。
データベース レベルの ID 番号
データベース ユーザーが作成されると、ID とセキュリティ ID (SID) が割り当てられます。これらの数値は、sys.database_principals カタログ ビューで principal_id および SID として確認できます。ID は、そのユーザーをデータベース内部でセキュリティ保護可能なユーザーであると識別します。データベース ユーザーが削除されると、その ID 番号は再利用されます。データベース ユーザーに割り当てられた SID はデータベース内で一意です。SID のソースは、データベース ユーザーの作成方法によって異なります。ユーザーが SQL Server ログインから作成されると、ユーザーにはログインの SID が指定されます。ユーザーが証明書または非対称キーから作成されると、SID は公開キーの SHA-1 ハッシュから派生します。
データベース ユーザーの最大数
データベース ユーザーの最大数は、ユーザー ID フィールドのサイズによって決まります。ユーザー ID の値には、0 または正の整数を指定する必要があります。SQL Server 2000 では、ユーザー ID は、16 ビット (そのうち 1 ビットは符号) で構成される smallint として格納されます。このため、SQL Server 2000 のユーザー ID の最大数は 32,768 (215) です。SQL Server 2005 以降のバージョンでは、ユーザー ID は、32 ビット (そのうち 1 ビットは符号) で構成される int として格納されます。このように追加されたビットにより、2,147,483,648 (231) 個の ID 番号を割り当てることができます。
データベース ユーザー ID は、次の表に示すように、事前に割り当てられた範囲に分類されます。
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 |
ユーザー、ロール、アプリケーション ロール、別名 |
ユーザー ID のサイズが smallint (16 ビット) から int (32 ビット) に増加しています。16 ビットのユーザー ID を必要とする API は、32 ビットのユーザー ID を渡されると、正しい結果を返しません。SQL Server 2000 以前のバージョン向けに作成されたデータとアプリケーションを移行する場合は、コード内で次の非推奨のインターフェイスが参照されていないかどうかを確認する必要があります。
sysusers
syscacheobjects
sysmembers
sysobjects
syspermissions
sysprocesses
sysprotects
systypes
USER_ID
これらのインターフェイスには、16 ビットのユーザー ID が必要です。32 ビットのユーザー ID で使用すると、正しい結果を返しません。