Estou tentando copiar um usuário do meu servidor ativo para o meu servidor de DR usando o seguinte comando:
CREATE LOGIN [xxx]
WITH PASSWORD = 0x010006278DD83306AD19FA8B0CE4405F13DA83DDDFB25B088D7C HASHED
, SID = 0xFEEBD63ECD0F6A41AE60A6E0414F5A1D
, DEFAULT_DATABASE = [master]
, CHECK_POLICY = OFF
, CHECK_EXPIRATION = OFF
Eu então recebo um erro:
Msg 15433, Nível 16, Estado 1, Linha 1 O parâmetro fornecido sid está em uso.
Então eu verifico o sys.syslogins com:
SELECT *
FROM sys.syslogins
WHERE sid = '0xFEEBD63ECD0F6A41AE60A6E0414F5A1D'
Isso não encontra nada. Então, minha pergunta é o que mais poderia estar usando este sid?
Como @SteBov observou em seu comentário , comparar o sid com aspas é problemático, pois isso força uma conversão implícita a ser executada na coluna sid. Como a conversão converte o valor hexadecimal em um valor de caractere, você nunca verá o login nos resultados da consulta.
Se você verificar o plano de execução para a seguinte instrução:
Vemos a seguinte verificação de índice clusterizado na tabela interna, sys.sysxlgns:
Nos detalhes, você pode ver o seguinte predicado:
Se você executar um select transformando o
CONVERT_IMPLICIT
em uma instrução simplesCONVERT
, como abaixo, você pode ver que a coluna sid não é o que você esperaria:Para encontrar com sucesso o login com o sid duplicado, você precisará executar o select como:
De preferência, você observaria
sys.server_principals
que syslogins é uma exibição compatível com o SQL Server 2000 que foi preterida.