SID e ID

Se si scrive codice che interagisce con il motore di SQL Server, è necessario tenere conto di due numeri utilizzati come rappresentazioni interne dell'entità. Ogni entità presenta un ID e un ID di protezione (SID). Il significato e l'origine di questi numeri dipendono dalla modalità di creazione dell'entità e dalla sua natura, ovvero se si tratta di un'entità di database o di server.

Numero di identificazione a livello del server

Quando viene creato un account di accesso di SQL Server, a tale account vengono assegnati un ID e un SID, visibili nella vista del catalogo sys.server_principals come principal_id e SID. L'ID (principal_id) identifica l'account di accesso come un'entità a protezione diretta all'interno del server. Viene assegnato da SQL Server al momento della creazione dell'account di accesso. Quando un account di accesso viene eliminato, il relativo numero ID viene riciclato. Il SID identifica il contesto di protezione dell'account di accesso ed è univoco all'interno dell'istanza del server. L'origine del SID dipende dalla modalità di creazione dell'account di accesso. Se l'account di accesso è stato creato da un utente o gruppo di Windows, a esso viene assegnato il SID di Windows dell'entità di origine. Il SID di Windows è univoco all'interno del dominio. Se l'account di accesso di SQL Server è stato creato da un certificato o da una chiave asimmetrica, viene assegnato un SID derivato dall'hash SHA-1 della chiave pubblica. Se l'account di accesso viene creato come account di accesso di SQL Server legacy che richiede una password, il server genererà un SID.

Numero di identificazione a livello di database

Quando viene creato un utente del database, vengono assegnati un ID e un ID di protezione (SID). Questi numeri sono visibili nella vista del catalogo sys.database_principals come principal_id e SID. L'ID identifica l'utente come un'entità a protezione diretta all'interno del database. Quando viene eliminato un utente del database, il relativo ID viene riciclato. Il SID assegnato a un utente del database è univoco all'interno del database. L'origine del SID dipende dalla modalità di creazione dell'utente del database. Se l'utente è stato creato da un account di accesso di SQL Server, riceve il SID dell'account di accesso. Se l'utente è stato creato da un certificato o da una chiave asimmetrica, riceve un SID derivato dall'hash SHA-1 della chiave pubblica.

Numero massimo di utenti del database

Il numero massimo di utenti del database è determinato dalle dimensioni del campo ID dell'utente. Il valore di un ID utente deve essere zero o un valore intero positivo. In SQL Server 2000 l'ID utente viene archiviato come valore smallint composto da 16 bit, uno dei quali è il segno. Per questo motivo, il numero massimo di ID utente in SQL Server 2000 è 215 = 32.768. In SQL Server 2005 e versioni successive l'ID utente viene archiviato come valore int composto da 32 bit, uno dei quali è il segno. Questi bit aggiuntivi consentono di assegnare 231 = 2.147.483.648 numeri ID.

Gli ID utente del database sono suddivisi in intervalli preallocati, come illustrato nella tabella seguente.

ID di SQL Server 2000

ID di SQL Server 2005

Allocato a

0

0

public

1

1

dbo

2

2

guest

3

3

INFORMATION_SCHEMA

4

4

SYSTEM_FUNCTION_SCHEMA

5 - 16383

5 - 16383

Utenti, alias, ruoli applicazione

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

Riservato

16400 - 32767

Ruoli

16400 - 2,147,483,647

Utenti, ruoli, ruoli applicazione, alias

Le dimensioni dell'ID utente sono aumentate da smallint (16 bit) a int (32 bit). Le API che richiedono un ID utente a 16 bit restituiranno risultati non corretti se viene passato un ID utente a 32 bit. In caso di migrazione dei dati e delle applicazioni create per SQL Server 2000 o versioni precedenti, è necessario rivedere il codice di riferimento alle seguenti interfacce obsolete.

  • sysusers

  • syscacheobjects

  • sysmembers

  • sysobjects

  • syspermissions

  • sysprocesses

  • sysprotects

  • systypes

  • USER_ID

Queste interfacce richiedono ID utente a 16 bit e non restituiscono valori corretti se utilizzate con ID utente a 32 bit.