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 d'entités de sécurité. Chaque entité de sécurité 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 l'entité de sécurité a été créée et du fait qu'il s'agit d'une entité de sécurité de serveur ou d'une entité de sécurité 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 de l'entité de sécurité 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 - 16 383

5 - 16 383

Utilisateurs, alias, rôles d'applications

16 384

16 384

db_owner

16 385

16 385

db_accessadmin

16 386

16 386

db_securityadmin

16 387

16 387

db_ddladmin

16 389

16 389

db_backupoperator

16 390

16 390

db_datareader

16 391

16 391

db_datawriter

16 392

16 392

db_denydatareader

16 393

16 393

db_denydatawriter

16 394 - 16 399

16 394 - 16 399

Réservé

16 400 - 32 767

Rôles

16 400 - 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ésapprouvé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.