O login já tem uma conta com um nome de usuário diferente

29

Quando executo esse SQL:

USE ASPState
GO
IF NOT EXISTS(SELECT * FROM sys.sysusers WHERE NAME = 'R2Server\AAOUser')
CREATE USER [R2Server\AAOUser] FOR LOGIN [R2Server\AAOUser];
GO

Estou tendo o erro a seguir:

O login já tem uma conta com um nome de usuário diferente.

Como sei qual é esse nome de usuário diferente para minha conta de login?

Jack
fonte

Respostas:

31

Isso significa que o login [R2Server \ AAOUser] já está mapeado para um usuário nesse banco de dados. Ou, em outras palavras, outro usuário do banco de dados está usando esse logon. Você pode ver qual usuário do banco de dados está usando seu login com a seguinte consulta:

use YourDB
go
SELECT su.name as DatabaseUser
FROM sys.sysusers su
join sys.syslogins sl on sl.sid = su.sid
where sl.name = 'test' -- login

PS: uma versão do script que não usa as visualizações de compatibilidade:

Select sp.name as LoginName, sp.type_desc as LoginType,
    dp.name as DBUser, dp.type_desc as UserType
from sys.server_principals sp
join sys.database_principals dp on dp.sid = sp.sid
where sp.name = 'test' -- your login
Marian
fonte
Ok, vejo o valor dbosendo exibido. Estranho, não me lembro de ter usado o dbopara minha conta R2Server\AAOUser. Pensando no que devo fazer a seguir.
Jack
4
Você criou o banco de dados usando esse login para se conectar ao servidor? Se sim, você é o proprietário do banco de dados e não precisa criar outro usuário. Você já está pronto.
Marian
Na verdade, usei o comando aspnet_regsql -E -S .\MSSQLSERVER_R2 -ssaddpara criar o ASPStatebanco de dados. Acho que provavelmente já estou preparada, embora nem perceba isso em primeiro lugar.
Jack
Adivinha o que: "-E -> Autenticar com credenciais atuais do Windows." :-)
Marian
4
Eu usaria sys.server_principalse sys.database_principals. sysuserse sysloginsexistem apenas para compatibilidade com versões anteriores.
Aaron Bertrand
4

É uma 'coisa de metadados' ...

Às vezes, o usuário do banco de dados é "corrompido" durante o que estiver acontecendo nesse banco de dados. (Vi um comportamento semelhante se o banco de dados for restaurado, e as funções na cópia restaurada diferem da que você substituiu. Foi por isso que tentei abaixo, o que corrigiu o problema para mim.)

  1. Abra as propriedades de Login no SSMS -> (Segurança | Logins | com falha no UserID | Propriedades | Mapeamento de Usuários). Você provavelmente verá os bancos de dados já verificados e as funções atribuídas (como perfeitamente normal).

  2. Observe as permissões no banco de dados que deu o erro, apenas para referência.

  3. Desmarque esse banco de dados e salve o logon.
  4. Agora execute novamente sua consulta para adicionar o Login / Função ao banco de dados de destino. Deve funcionar muito bem.
CK em CLE
fonte
2
quando chego ao passo 3, obtenho:Cannot drop the user 'dbo'. (Microsoft SQL Server, Error: 15150)
bkwdesign
Eu também recebi a Cannot drop the user 'dbo'.mensagem de erro. Corri esse script, que removeu o mapeamento de usuários problemáticos e corrigiu o problema: USE DATABASE_NAME; ALTER AUTHORIZATION ON DATABASE::DATABASE_NAME TO [sa]. Para obter mais informações, essa é a fonte que eu usei: blog.sql-assistance.com/index.php/cannot-drop-the-user-dbo
SherlockSpreadsheets