Permissões do usuário desarrumadas após uma operação de backup -> restauração

11

Eu tive que mover vários bancos de dados do SQL Server 2008 para o nosso novo servidor db, para fazer backup de todos (arquivos .bak), copiar esses arquivos para a nova caixa e restaurá-los (tudo feito usando o SQL Management Studio).

Tudo deu certo, mas agora acho que não consigo fazer login em nenhum banco de dados usando a conta do SQL Server que continua funcionando no antigo RDBMS. Meu login autenticado pelo Windows ainda funciona bem por acaso.

Tive a ideia de que todos os usuários e permissões seriam duplicados no novo servidor de banco de dados, mas parece que algo deu errado em algum lugar. Gostaria muito de receber comentários / sugestões / ofertas de ajuda ;-)

5arx
fonte

Respostas:

7

Vejo que você já encontrou uma solução para o seu problema. Uma coisa que notei na sua pergunta original foi que você ainda tinha acesso ao servidor antigo.

A seguinte pergunta sobre SO teve um problema semelhante e inclui links para um artigo da Microsoft com um script para gerar as permissões de usuário.

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(Recurso listado para essa pergunta http://support.microsoft.com/kb/918992 )

Parece que alterar a configuração do servidor de autenticação do Windows para autenticação de modo misto corrigiu seu problema, mas, caso não resolvesse completamente o problema, achei que isso poderia ser útil.

Jeff
fonte
Tenho certeza de que essa não será a primeira vez que luto com o SQL Server sobre usuários / permissões, para marcar o artigo como favorito. Muito obrigado por postar.
5arx 23/03
6

Isso é conhecido como "usuários órfãos". Aqui estão duas maneiras de corrigi-lo

  1. Se possível, restaure o banco de dados mestre original como "loginsource" e sys.server_principals possui informações suficientes para gerar todos os logons do SQL Server e do Windows. Ou seja, os SIDs e a senha criptografada

  2. Se você usar apenas logons do Windows, poderá executá-lo por banco de dados para gerar um script

Roteiro:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')
gbn
fonte
Obrigado pela sua resposta - meu aplicativo da Web usa logons SQL enquanto nossas contas do Windows são usadas para fins de administração. Não vejo uma maneira de restaurar como 'fonte de logins' como você sugere - você poderia elaborar? Espero que tudo isso possa ser feito usando o Managment Studio?
5arx 23/03
PS. Eu segui este documento: support.microsoft.com/kb/274188 e executei todos os scripts (aparentemente) com êxito. Mas nada mudou.
Marx
5

Idealmente, você criaria scripts para os usuários e permissões antes de fazer a restauração. Se isso não tiver acontecido, você precisará consertar as coisas após o fato, e as chances são de que alguma coisa será perdida, mas você deverá conseguir 90% do caminho até lá.

A primeira coisa que você precisa verificar é se os mesmos logons existem no novo servidor. Caso contrário, você deve descobrir se está OK para os logins serem criados no novo servidor. Nunca assuma que eles deveriam ser criados, poderia haver uma boa razão para que eles não existissem em primeiro lugar. Em seguida, você pode criá-los pesquisando a tabela de sysusers.

Você pode corrigir os usuários órfãos executando algo semelhante ao seguinte:

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

Este código funcionará para o SQL2008, mas foi escrito para ser compatível com versões anteriores do SQL2000.

SQLRockstar
fonte
Obrigado pelo script. Posso assumir que não há como fazer isso no Management Studio? Além disso, algumas pessoas estão sugerindo que eu exclua e recrie os usuários no nível do banco de dados - isso é recomendado?
5arx 23/03
Isso pressupõe logins já existe e só mataches SID
GBN
sp_change_users_login não atualiza o SID? msdn.microsoft.com/en-us/library/ms174378.aspx
SQLRockstar
5arx - não há como fazer isso no SSMS. Como eu disse, em uma situação ideal, você teria script suas permissões antes da restauração. Nesse ponto, você precisa recriar manualmente ou tentar juntar as coisas manualmente. se eu fosse você, restauraria o banco de dados antigo, executaria um script das permissões, restauraria a partir do outro servidor e refizesse suas permissões.
SQLRockstar
"Update_One: vincula o usuário especificado no banco de dados atual a um logon existente do SQL Server. O usuário e o logon devem ser especificados. A senha deve ser NULL ou não especificada." Portanto, assume que os logins já existem.
gbn 23/03
0

Você pode consultar o seguinte URL para corrigir as permissões de usuário do banco de dados

http://mywindowsblog.com/?p=287

Prashant
fonte