Erro do SQL Server 2008 R2: 15023, usuário, grupo ou função já existe


16

Eu tenho um banco de dados de teste com o qual estou tendo problemas de permissão.
Não consigo acessar o banco de dados de relatórios e a documentação de ajuda do aplicativo diz o seguinte:

Resolution: 

1. Launch the SQL Server Management Studio and connect to the database server(s) hosting   the Vision and Reporting Server databases. 
2. Expand the security folder. 
3. Select logins and right click on the <username> user and choose properties. 
4. Click the User Mapping tab 
5.Make sure the following databases are selected in the Users mapped to this Login:

    ReportServer
    ReportServerTempDB
    Your Vision databases
    This maps the login/user to the respective databases.
6. As you select each database (including your Vision database), select the db_owner role in the Database role membership for: section. You must select this option for each database.

Quando faço isso, recebo o seguinte erro:

"Create failed for user '<servername>\<username>'.  User, group, or role '<servername>\<username>' already exists in the current database. (Microsoft SQL Server, Error: 15023)"

Eu pesquisei esse erro no Google e tentei o seguinte comando em cada banco de dados:

 ALTER USER [<username>] WITH LOGIN = [<username>] 

A mensagem indicava que os comandos foram concluídos com êxito, mas ainda estou recebendo o erro acima quando tento mapear cada banco de dados conforme as instruções acima.

o que estou perdendo?

Pelo comentário de Kin (obrigado), tentei o seguinte: - cliquei com o botão direito do mouse no usuário e selecionei: Script Login As> Drop and Create To> New query window. - Executei a consulta resultante e tentei mapear as funções de usuário selecionando os outros dois bancos de dados e o db_owner novamente, mas ainda estou recebendo a mesma mensagem de erro acima.

Pensamentos??

Respostas:


12

Você pode tentar várias coisas, e o sucesso de cada uma provavelmente dependerá da função de servidor que você possui.

Para iniciantes, se for apenas um ou dois usuários, honestamente, a maneira mais fácil é desconectar o usuário do banco de dados restaurado e, desde que já exista um logon do servidor, remapeie o usuário do banco de dados para o logon do servidor usando o SSMS. Se o login do servidor não existir, crie-o, mapeie o usuário e pronto! Lá vamos nós.

Próxima opção: se você estiver migrando um grande número de usuários, use sp_help_revlogin. sp_help_revlogin é um procedimento armazenado fornecido pela Microsoft que ajudará a migrar logons de um servidor para outro, incluindo senhas e SIDs. Aqui está um bom artigo sobre isso SP_HELP_REVLOGIN


Veja support.microsoft.com/en-us/kb/918992 Como transferir logins e senhas entre instâncias do SQL Server
James Jenkins

3

Eu uso Auto_Fix com sp_change_users_loginno meu ambiente dev para corrigir tais problemas (erro 15023). Evite usar o Auto_Fix em situações sensíveis à segurança.

Auto_Fix: vincula uma entrada de usuário na exibição do catálogo do sistema sys.database_principals no banco de dados atual a um logon do SQL Server com o mesmo nome. Se um login com o mesmo nome não existir, um será criado. Examine o resultado da instrução Auto_Fix para confirmar se o link correto foi feito. Evite usar o Auto_Fix em situações sensíveis à segurança.

sp_change_users_login 'AUTO_FIX', 'myuser'

Além disso, observe que esse recurso pode ser removido em uma versão futura do Microsoft SQL Server.

Outras referências:

  1. O usuário, grupo ou função do SQL Server 2008 já existe no banco de dados atual
  2. CORRECÇÃO: Erro 15023: o usuário já existe nas bases de dados atuais
  3. SQL mapeia um logon para um usuário existente

0
ALTER USER [<username>] WITH LOGIN=[<username>]

É a abordagem correta.

Caso contrário, vá para:

Segurança> Logins> (seu nome de usuário)> Propriedades> Mapeamento de Usuário

insira a descrição da imagem aqui

e remapear esse usuário para o banco de dados desejado.

Você pode usar a seguinte consulta no contexto do seu banco de dados para verificar se há órfãos:

select
    dp.name [user_name]
    ,dp.type_desc [user_type]
    ,isnull(sp.name,'Orhphaned!') [login_name]
    ,sp.type_desc [login_type]
from   
    sys.database_principals dp
    left join sys.server_principals sp on (dp.sid = sp.sid)
where
    dp.type in ('S','U','G')
    and dp.principal_id >4
order by sp.name

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.