Imagine que você criou um login para um grupo local do Windows, por exemplomachine_name\group_name
Você reconstrói o servidor (nova máquina física) com o mesmo nome de máquina ( machine_name
), anexa as unidades antigas a ele, incluindo o SQL server. O grupo também foi recriado.
Mas é uma nova instalação de SO. Como tal, o novo machine_name\group_name
terá um novo SID e não funcionará de fato.
Como podemos detectar que o SID do login não é mais válido para sabermos que precisamos recriá-lo?
SELECT SUSER_SID(machine_name\group_name)
ainda está retornando o SID antigo (conforme armazenado em sys.server_principals
). [sys].[sp_validatelogins]
também não relata nada.
Parece que isso SUSER_SID
acontece à sys.server_principals
primeira vista, então não sabemos como detectar isso.
Acho que
[sp_validatelogins]
só ajudará com contas do Windows excluídas, não aquelas com incompatibilidade de SID.Aqui está uma prova básica de conceito usando
[xp_cmdshell]
para chamar o PowerShell. Para aqueles que não podem usar[xp_cmdshell]
por motivos de segurança, ele pode ser reescrito como um SQL Server Agent PowerShell Job Step, ou inteiramente em um script do PowerShell.SID_BINARY()
não é documentado, portanto, as ressalvas usuais se aplicam.Depois de pesquisar um pouco mais, a resposta de Solomon aqui me deu uma ideia: criar uma função SQLCLR que receba um nome de conta e use
NTAccount
/SecurityIdentifier
para determinar e emitir o SID real.Isso permite que o código de chamada funcione de forma síncrona em SQL, sem
xp_cmdshell