O principal "dbo" do SQL Server não existe,

192

Eu estou recebendo o seguinte erro

Cannot execute as the database principal because the principal "dbo" 
does not exist, this type of principal cannot be impersonated,
or you do not have permission.

Eu li sobre ALTER AUTHORIZATION, mas não tenho idéia em qual banco de dados isso está acontecendo. Esse erro é cuspido com muita frequência e aumenta o registro de erros em cerca de 1 GB por dia.

PBG
fonte
1
Essa é provavelmente uma pergunta para o site do DBA, mas ajudaria se você fornecesse mais informações sobre quando o erro aparecer, ou seja, qual comando não pode ser executado. E há muitos resultados de pesquisa para esse erro, incluindo esta pergunta ; você olhou para eles e eles correspondem à sua situação e configuração de alguma maneira?
Pondlife

Respostas:

408

Resolvi esse problema definindo o proprietário do banco de dados. Meu banco de dados não tinha nenhum proprietário antes desse problema. Execute este comando no seu banco de dados para definir o proprietário na conta sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Hogan
fonte
6
Veja o artigo detalhado aqui: sqlserver-help.com/tag/…
orberkov
8
@hurleystylee, sua solução realmente funcionou bem para mim. Meu banco de dados tinha um proprietário btw.
Keyvan Sadralodabai
Eu estou tendo este mesmo problema. Eu tentei executar a consulta por @hurleystylee, mas ela não fez nada. Quando chequei dboainda era o db_owner e NÃO POSSO FAZER QUALQUER COISA COM O DBO. Está ficando realmente frustrante. Eu não posso mudar nada.
Wairimu Murigi
@hurleystylee, considere editar e complementar a resposta para que as pessoas não precisem olhar os comentários para descobrir a sintaxe do comando.
Ulysses Alves
2
@hurleystylee sim, vejo que ele fez. Penso assim que a resposta se torna mais completa por si só.
Ulysses Alves
110

insira a descrição da imagem aqui

Faça graficamente.

Clique com o botão direito do mouse no banco de dados -> propriedades -> arquivos -> selecione o proprietário do banco de dados -> selecione [sa] - ok

arnav
fonte
mais uma vez, resolvi meu problema consultando novamente esta resposta.
teapeng 27/09/17
Acertou em cheio! Obrigado!
alejandrob
O banco de dados foi restaurado a partir da instância diff do SQL. Eu segui esta etapa e funcionou .. Obrigado!
dotnetavalanche 13/01
11

Isso também pode acontecer quando o banco de dados é uma restauração de um servidor ou instância SQL diferente. Nesse caso, o principal de segurança 'dbo' no banco de dados não é o mesmo que o principal de segurança no servidor SQL no qual o banco de dados foi restaurado. Não me pergunte como eu sei disso ...

Peter Huppertz
fonte
Posso perguntar como resolvê-lo? lol, é exatamente isso que estou tentando fazer. Mova os diagramas de banco de dados entre diferentes servidores e implemente o banco de dados. Eu recebi esse erro depois de importar o arquivo .bak e tentar abrir a pasta diagramas.
gunslingor
1
Ei, isso funcionou para mim: dba.stackexchange.com/questions/50690/...
ironstone13
@ ironstone13 não funcionou para mim. Recebi a mensagem de que não pode cair dbo
Wairimu Murigi
8

outra maneira de fazê-lo

ALTER AUTHORIZATION 
ON DATABASE::[DatabaseName]
TO [A Suitable Login];
Mugiwara
fonte
6

Resposta selecionada e algumas outras são boas. Eu só quero dar uma explicação mais pura de SQL. É a mesma solução que não existe um proprietário de banco de dados (válido).

A conta do proprietário do banco de dados dbomencionada com erro é sempre criada com o banco de dados. Portanto, parece estranho que não exista, mas você pode verificar com duas seleções (ou uma, mas vamos simplificar).

SELECT [name],[sid] 
FROM [DB_NAME].[sys].[database_principals]
WHERE [name] = 'dbo'

que mostra o SID do dbousuário no banco de dados DB_NAME e

SELECT [name],[sid] 
FROM [sys].[syslogins]

para mostrar todos os logins (e seus SIDs) para esta instância do servidor SQL. Observe que ele não gravou nenhum prefixo db_name, porque todo banco de dados possui as mesmas informações nessa exibição.

Portanto, no caso de erro acima , não haverá logon com o SID atribuído ao usuário dbo do banco de dados.

Como explicado acima, isso geralmente acontece ao restaurar o banco de dados de outro computador (em que o banco de dados e o usuário dbo foram criados por login diferente). E você pode corrigi-lo alterando a propriedade para o login existente.

Bizniztime
fonte
0

Em Segurança, adicione o principal como um "usuário SQL sem logon", torne-o o esquema com o mesmo nome que o principal e, em Associação, faça-o db_owner.

David Zamula
fonte
Isso não fez nada no SSMS 2017
Zimano 26/03/19
0

Também ocorreu esse erro quando acidentalmente alimentou uma seqüência de conexão com o banco de dados no espelho somente leitura - e não o banco de dados primário em uma configuração de alta disponibilidade.

decreto
fonte
0

Como dizia a mensagem, você deve definir a permissão como proprietário para o seu usuário. Então você pode usar o seguinte:

ALTER AUTHORIZATION 
ON DATABASE::[YourDBName]
TO [UserLogin];

Espero que seja útil! Deixe um comentário se estiver ok para você.

Alireza Abdollahnejad
fonte