SID et ID
Si vous écrivez du code qui interagit avec le moteur SQL Server, vous devez avoir connaissance de deux numéros utilisés comme représentations internes de principaux. Chaque principal a un identificateur (ID) et un identificateur de sécurité (SID). La signification et la source de ces numéros dépendent de la façon dont le principal a été créé et du fait qu'il s'agit d'un principal de serveur ou d'un principal de base de données.
Numéro d'identification de niveau serveur
Lorsqu'une connexion SQL Server est créée, un ID et un SID lui sont assignés. Ces identificateurs sont visibles dans l'affichage catalogue sys.server_principals en tant que principal_id et SID. L'ID (principal_id) identifie la connexion comme élément sécurisable dans le serveur. Il est assigné par SQL Server lors de la création de la connexion. Lorsqu'une connexion est supprimée, son numéro d'ID est recyclé. Le SID identifie le contexte de sécurité de la connexion ; il est unique dans l'instance de serveur. La source du SID dépend de la façon dont la connexion est créée. Si elle est créée à partir d'un utilisateur ou d'un groupe Windows, le SID Windows du principal source lui est assigné ; le SID Windows est unique dans le domaine. Si la connexion SQL Server est créée à partir d'un certificat ou d'une clé asymétrique, un SID dérivé du hachage SHA-1 de la clé publique lui est assigné. Si elle est créée en tant que connexion SQL Server héritée qui requiert un mot de passe, le serveur génère un SID.
Numéro d'identification de niveau base de données
Lorsqu'un utilisateur de base de données est créé, un ID et un ID de sécurité (SID) lui sont assignés. Ces numéros sont visibles dans l'affichage catalogue sys.database_principals en tant que principal_id et SID. L'ID identifie l'utilisateur comme élément sécurisable dans la base de données. Lorsqu'un utilisateur de base de données est supprimé, son ID est recyclé. Le SID assigné à un utilisateur de base de données est unique dans la base de données. La source du SID dépend de la façon dont l'utilisateur de base de données est créé. Si l'utilisateur est créé à partir d'une connexion SQL Server, le SID de la connexion lui est affecté. S'il est créé à partir d'un certificat ou d'une clé asymétrique, le SID est dérivé du hachage SHA-1 de la clé publique.
Nombre maximal d'utilisateurs de base de données
Le nombre maximal d'utilisateurs de base de données est déterminé par la taille du champ d'ID utilisateur. La valeur d'un ID d'utilisateur doit être zéro ou un entier positif. Dans SQL Server 2000, l'ID d'utilisateur est stocké en tant que smallint constitué de 16 bits, dont l'un est le signe. Pour cette raison, le nombre maximal d'ID d'utilisateurs dans SQL Server 2000 est 215 = 32 768. Dans SQL Server 2005 et les versions ultérieures, l'ID d'utilisateur est stocké en tant que valeur int constituée de 32 bits, dont l'un correspond au signe. Ces bits supplémentaires permettent d'assigner 231 = 2 147 483 648 numéros d'ID.
Les ID d'utilisateurs de base de données sont divisés en plages préallouées, comme illustré dans le tableau ci-dessous.
ID SQL Server 2000 |
ID SQL Server 2005 |
Alloué à |
---|---|---|
0 |
0 |
public |
1 |
1 |
dbo |
2 |
2 |
invité |
3 |
3 |
INFORMATION_SCHEMA |
4 |
4 |
SYSTEM_FUNCTION_SCHEMA |
5 - 16383 |
5 - 16383 |
Utilisateurs, alias, rôles d'applications |
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 |
Réservé |
16400 - 32767 |
Rôles |
|
16400 - 2,147,483,647 |
Utilisateurs, rôles, rôles d'application, alias |
La taille de l'ID d'utilisateur est augmentée de smallint (16 bits) à int (32 bits). Les API qui requièrent un ID d'utilisateur 16 bits retourneront des résultats erronés si un ID d'utilisateur 32 bits leur est transmis. Lors de la migration de données et d'applications créées pour SQL Server 2000 ou une version antérieure, vous devez passer en revue le code pour relever les références aux interfaces déconseillées ci-dessous.
sysusers
syscacheobjects
sysmembers
sysobjects
syspermissions
sysprocesses
sysprotects
systypes
USER_ID
Ces interfaces requièrent des ID d'utilisateurs 16 bits. Elles retournent des résultats incorrects lorsqu'elles sont utilisées avec des ID d'utilisateurs 32 bits.