SIDs e IDs
Se você estiver gravando o código que interage com o mecanismo do SQL Server, lembre-se de dois números usados como representações internas da entidade. Cada entidade tem uma identificação e um identificador de segurança (SID). O significado e a fonte desses números dependem de como a entidade foi criada e se ela é uma entidade de servidor ou de banco de dados.
Número de identificação de nível de servidor
Quando um logon do SQL Server é criado, uma identificação e um SID são atribuídos. Eles são visíveis na exibição do catálogo sys.server_principals como principal_id e SID. A identificação (principal_id) identifica o logon como seguro no servidor. Ela é atribuída pelo SQL Server quando o logon é criado. Quando um logon é excluído, o número de identificação é reciclado. O SID identifica o contexto de segurança do logon e é exclusivo dentro da instância do servidor. A fonte do SID depende de como o logon é criado. Se o logon for criado de um grupo ou um usuário do Windows, será fornecido o SID do Windows da entidade de origem; o SID do Windows é exclusivo no domínio. Se o logon do SQL Server for criado de um certificado ou uma chave assimétrica, será atribuído um SID derivado do hash SHA-1 da chave pública. Se o logon for criado como um logon do SQL Server com estilo herdado que requer uma senha, o servidor irá gerar um SID.
Número de identificação de nível de banco de dados
Quando um usuário de banco de dados é criado, uma ID e um identificador de segurança (SID) são atribuídos. Esses números são visíveis na exibição do catálogo sys.database_principals como principal_id e SID. A identificação identifica o usuário como seguro dentro do banco de dados. Quando um usuário de banco de dados é excluído, a identificação é reciclada. O SID atribuído a um usuário de banco de dados é exclusivo dentro do banco de dados. A fonte do SID depende de como o usuário de banco de dados é criado. Se o usuário for criado de um logon do SQL Server, será fornecido o SID do logon. Se o usuário for criado de um certificado ou uma chave assimétrica, o SID será derivado do hash SHA-1 da chave pública.
Número máximo de usuários do banco de dados
O número máximo de usuários do banco de dados é determinado pelo tamanho do campo de identificação de usuário. O valor de uma ID de usuário deve ser zero ou um inteiro positivo. No SQL Server 2000, a ID do usuário é armazenada como smallint, que consiste em 16 bits, um dos quais é o sinal. Por esse motivo, o número máximo de IDs de usuário no SQL Server 2000 é 215= 32.768. No SQL Server 2005, e em versões posteriores, a ID do usuário é armazenada como um int, que consiste em 32 bits, um dos quais é o sinal. Esses bits adicionais permitem atribuir 231 = 2.147.483.648 números de ID.
As IDs de usuário de banco de dados são divididas em intervalos pré-alocados, conforme ilustrado na tabela a seguir.
ID do SQL Server 2000 |
ID do SQL Server 2005 |
Alocada para |
---|---|---|
0 |
0 |
público |
1 |
1 |
dbo |
2 |
2 |
convidado |
3 |
3 |
INFORMATION_SCHEMA |
4 |
4 |
SYSTEM_FUNCTION_SCHEMA |
5 - 16383 |
5 - 16383 |
Usuários, aliases, funções de aplicativo |
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 |
Funções |
|
16400 - 2,147,483,647 |
Usuários, funções, funções de aplicativos, aliases |
O tamanho da ID de usuário é aumentado de smallint (16 bits) para int (32 bits). As APIs que requerem uma ID de usuário de 16 bits retornarão resultados incorretos se uma ID de usuário de 32 bits for transmitida. Ao migrar dados e aplicativos criados para o SQL Server 2000 ou anterior, você deve verificar o código para referências às interfaces preteridas a seguir.
sysusers
syscacheobjects
sysmembers
sysobjects
syspermissions
sysprocesses
sysprotects
systypes
USER_ID
Essas interfaces requerem IDs de usuário de 16 bits. Elas não retornam resultados corretos quando usadas com IDs de usuário de 32 bits.