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.