ID e SID
Data creazione: 14 aprile 2006
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 è stato creato come account di accesso di SQL Server legacy che richiede una password, il SID verrà generato dal server.
Numero di identificazione a livello di database
Quando viene creato un ruolo dell'utente del database, a tale ruolo 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 integer positivo. In SQL Server 2000 l'ID utente viene archiviato come un valore smallint composto da 16 bit, uno dei quali è il segno. Per tale motivo, il numero massimo di ID utente in SQL Server 2000 è 215 = 32.768. In SQL Server 2005 l'ID utente viene archiviato come un 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 in |
---|---|---|
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 |
In SQL Server 2005 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. Quando si esegue la migrazione di dati e applicazioni creati per una versione precedente di SQL Server, è consigliabile rivedere il codice per individuare riferimenti alle interfacce obsolete seguenti.
- 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.
Vedere anche
Concetti
Altre risorse
sys.server_principals (Transact-SQL)
sys.database_principals (Transact-SQL)
USER_ID (Transact-SQL)
SUSER_SID (Transact-SQL)
CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)