Le principal SQL Server «dbo» n'existe pas,

196

Je reçois l'erreur suivante

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.

J'ai lu ALTER AUTHORIZATION, mais je n'ai aucune idée de la base de données dans laquelle cela se produit. Cette erreur est crachée très fréquemment et augmente le journal des erreurs d'environ 1 Go chaque jour.

PBG
la source
1
C'est probablement une question pour le site DBA, mais cela aiderait si vous donniez plus d'informations sur le moment où l'erreur apparaît, c'est-à-dire quelle commande ne peut pas être exécutée. Et il y a beaucoup de résultats de recherche pour cette erreur, y compris cette question ; les avez-vous examinés et correspondent-ils à votre situation et à votre configuration?
Pondlife

Réponses:

416

J'ai résolu ce problème en définissant le propriétaire de la base de données. Ma base de données n'avait pas de propriétaire avant ce problème. Exécutez cette commande dans votre base de données pour définir le propriétaire sur le compte sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Hogan
la source
6
Voir l'article détaillé ici: sqlserver-help.com/tag/…
orberkov
8
@hurleystylee, votre solution a bien fonctionné pour moi. Ma DB avait un propriétaire btw.
Keyvan Sadralodabai
J'ai ce même problème. J'ai essayé d'exécuter la requête par @hurleystylee qu'elle a exécutée mais cela n'a rien fait. Quand j'ai vérifié, dboc'était toujours le db_owner et je ne peux rien faire à DBO. Cela devient vraiment frustrant. Je ne peux rien changer.
Wairimu Murigi
@hurleystylee veuillez envisager de modifier et de compléter la réponse afin que les gens n'aient pas à regarder les commentaires pour découvrir la syntaxe de la commande.
Ulysses Alves
2
@hurleystylee oui, je vois qu'il l'a fait. Je pense que de cette façon, la réponse devient plus complète par elle-même.
Ulysses Alves
112

entrez la description de l'image ici

Faites graphiquement.

Base de données clic droit -> propriétés -> fichiers -> sélectionner le propriétaire de la base de données -> sélectionner [sa] - ok

Arnav
la source
une fois de plus résolu mon problème en renvoyant à cette réponse.
teapeng du
J'y suis arrivé! Je vous remercie!
alejandrob
Nous avons restauré la base de données à partir d'une instance SQL diff. J'ai suivi cette étape et cela a fonctionné .. Merci!
dotnetavalanche le
11

Cela peut également se produire lorsque la base de données est une restauration à partir d'un serveur ou d'une instance SQL différent. Dans ce cas, le principal de sécurité «dbo» dans la base de données n'est pas le même que le principal de sécurité sur le serveur SQL sur lequel la base de données a été restaurée. Ne me demandez pas comment je sais cela ...

Peter Huppertz
la source
Puis-je vous demander comment le résoudre? lol, c'est exactement ce que j'essaye de faire. Déplacez les diagrammes de base de données entre différents serveurs, puis implémentez la base de données. J'ai eu cette erreur une fois que j'ai importé le fichier .bak et essayé d'ouvrir le dossier des diagrammes.
gunslingor
1
Hé, cela a fonctionné pour moi: dba.stackexchange.com/questions/50690/…
ironstone13
@ ironstone13 n'a pas fonctionné pour moi. J'ai reçu le message que je ne peux pas abandonner dbo
Wairimu Murigi
8

une autre façon de le faire

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

Réponse sélectionnée et quelques autres sont toutes bonnes. Je veux juste donner une explication plus pure SQL. Cela revient à la même solution qu'il n'y a pas de propriétaire de base de données (valide).

Le compte du propriétaire de la base de données dbomentionné par erreur est toujours créé avec la base de données. Il semble donc étrange qu'il n'existe pas, mais vous pouvez vérifier avec deux sélections (ou une, mais restons simple).

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

qui montre le SID de l' dboutilisateur dans la base de données DB_NAME et

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

pour afficher toutes les connexions (et leurs SID) pour cette instance de serveur SQL. Notez qu'il n'a pas écrit de préfixe db_name, car chaque base de données a les mêmes informations dans cette vue.

Donc, en cas d'erreur ci-dessus, il n'y aura pas de connexion avec le SID attribué à l'utilisateur de la base de données dbo.

Comme expliqué ci-dessus, cela se produit généralement lors de la restauration de la base de données à partir d'un autre ordinateur (où la base de données et l'utilisateur dbo ont été créés par une connexion différente). Et vous pouvez le résoudre en changeant la propriété de la connexion existante.

Bizniztime
la source
0

Sous Sécurité, ajoutez le principal en tant qu '"utilisateur SQL sans connexion", rendez-lui propriétaire du schéma avec le même nom que le principal, puis dans Membership, faites-le db_owner.

David Zamula
la source
Cela n'a rien fait sur SSMS 2017
Zimano
0

Il y avait également cette erreur lors de la transmission accidentelle d'une chaîne de connexion de base de données au miroir en lecture seule - pas à la base de données principale dans une configuration HA.

décret
la source
0

Comme le message l'indique, vous devez définir l'autorisation en tant que propriétaire de votre utilisateur. Vous pouvez donc utiliser ce qui suit:

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

J'espère utile! Laissez un commentaire si cela vous convient.

Alireza Abdollahnejad
la source
0

Dans mon cas, j'ai eu cette erreur en essayant de me faire passer pour un autre utilisateur. Par exemple

EXEC AS USER = 'dbo';

Et comme la base de données a été importée d'un autre environnement, certains de ses utilisateurs ne correspondaient pas aux connexions SQL Server.

Vous pouvez vérifier si vous rencontrez le même problème en exécutant le (obsolète) sp_change_users_login (en mode "Rapport"), ou utilisez la requête suivante:

select p.name,p.sid "sid in DB", (select serp.sid from sys.server_principals serp where serp.name = p.name) "sid in server"
from sys.database_principals p
where p.type in ('G','S','U')
and p.authentication_type = 1
and p.sid not in (select sid from sys.server_principals)

Si dans cette liste montre l'utilisateur que vous essayez d'emprunter votre identité, vous pouvez probablement le réparer en attribuant à l'utilisateur de base de données la connexion appropriée sur votre serveur. Par exemple:

ALTER USER dbo WITH LOGIN = dbo;
Mariano Desanze
la source