Números de identificación de seguridad (SID) e identificadores (Id.)
Si escribe código que interactúa con el motor de SQL Server, debe tener en cuenta dos números que se utilizan como representaciones internas de la entidad de seguridad. Toda entidad de seguridad tiene un identificador (Id.) y un número de identificación de seguridad (SID). El significado y origen de estos números dependen de la forma en que se creó la entidad de seguridad y si es una entidad de seguridad de servidor o de base de datos.
Número de identificación de nivel de servidor
Cuando se crea un inicio de sesión de SQL Server, se le asigna un identificador y un SID. Pueden verse en la vista de catálogo sys.server_principals como principal_id y SID. El identificador (principal_id) identifica el inicio de sesión como elemento protegible dentro del servidor. SQL Server lo asigna cuando se crea el inicio de sesión. Cuando éste se elimina, su número de identificador se recicla. El SID identifica el contexto de seguridad del inicio de sesión y es único dentro de la instancia de servidor. El origen del SID depende de cómo se haya creado el inicio de sesión. Si se ha creado a partir de un usuario o grupo de Windows, se le da el SID de Windows de la entidad de seguridad de origen; el SID de Windows es único dentro del dominio. Si el inicio de sesión de SQL Server se ha creado a partir de un certificado o clave asimétrica, se le asigna un SID que se deriva del hash SHA-1 de la clave pública. Si el inicio de sesión se ha creado como un inicio de sesión de SQL Server de estilo heredado que requiere una contraseña, el servidor generará un SID.
Número de identificación de nivel de base de datos
Cuando se crea un usuario de base de datos, se le asigna un identificador y un número de identificación de seguridad (SID). Estos números pueden verse en la vista de catálogo sys.database_principals como principal_id y SID. El identificador identifica al usuario como un elemento protegible dentro de la base de datos. Cuando un usuario de la base de datos se elimina, su identificador se recicla. El SID asignado a un usuario de base de datos es único dentro de la base de datos. El origen del SID depende de cómo se haya creado el usuario de base de datos. Si el usuario se ha creado a partir de un inicio de sesión de SQL Server, se le asigna el SID del inicio de sesión. Si el usuario se ha creado a partir de un certificado o clave asimétrica, el SID se deriva del hash SHA-1 de la clave pública.
Número máximo de usuarios de base de datos
El número máximo de usuarios de base de datos está determinado por el tamaño del campo Id. de usuario. El valor de un identificador de usuario debe ser cero o un entero positivo. En SQL Server 2000, el identificador de usuario se almacena como un smallint de 16 bits, uno de los cuales es el signo. Por esta razón, el número máximo de identificadores de usuario en SQL Server 2000 es de 215 = 32.768. En SQL Server 2005 y versiones posteriores, el identificador de usuario se almacena como un valor int de 32 bits, uno de los cuales es el signo. Estos bits adicionales hacen posible asignar 231 = 2.147.483.648 números identificadores.
Los identificadores de usuario de base de datos se dividen en intervalos asignados previamente, como se muestra en la siguiente tabla.
Identificador de SQL Server 2000 |
Identificador de SQL Server 2005 |
Asignado a |
---|---|---|
0 |
0 |
public |
1 |
1 |
dbo |
2 |
2 |
invitado |
3 |
3 |
INFORMATION_SCHEMA |
4 |
4 |
SYSTEM_FUNCTION_SCHEMA |
5 - 16383 |
5 - 16383 |
Usuarios, alias, roles de aplicación |
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 |
Reservado |
16400 - 32767 |
Roles |
|
16400 - 2,147,483,647 |
Usuarios, roles, roles de aplicación, alias |
El tamaño del identificador de usuario se incrementa de smallint (16 bits) a int (32 bits). Las API que requieren un identificador de usuario de 16 bits devolverán resultados incorrectos si se les pasa un identificador de usuario de 32 bits. Durante la migración de datos y aplicaciones de SQL Server 2000 o versiones anteriores, deberá revisar el código en busca de referencias a las siguientes interfaces obsoletas.
sysusers
syscacheobjects
sysmembers
sysobjects
syspermissions
sysprocesses
sysprotects
systypes
USER_ID
Estas interfaces requieren identificadores de usuario de 16 bits. Cuando se usan con identificadores de usuario de 32 bits no devuelven resultados correctos.