SQL Server-Prinzip "dbo" existiert nicht,


192

Ich erhalte den folgenden Fehler

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.

Ich habe darüber gelesen ALTER AUTHORIZATION, aber ich habe keine Ahnung, in welcher Datenbank dies geschieht. Dieser Fehler wird sehr häufig ausgespuckt und vergrößert das Fehlerprotokoll täglich um etwa 1 GB.


1
Dies ist wahrscheinlich eine Frage für die DBA-Site, aber es wäre hilfreich, wenn Sie weitere Informationen darüber geben, wann der Fehler auftritt, dh welcher Befehl nicht ausgeführt werden kann. Und es gibt viele Suchergebnisse für diesen Fehler, einschließlich dieser Frage . Haben Sie sie angeschaut und passen sie in irgendeiner Weise zu Ihrer Situation und Konfiguration?
Pondlife

Antworten:


407

Ich habe dieses Problem behoben, indem ich den Datenbankeigentümer festgelegt habe. Meine Datenbank hatte vor diesem Problem keinen Eigentümer. Führen Sie diesen Befehl in Ihrer Datenbank aus, um den Eigentümer auf das Systemadministratorkonto festzulegen:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
Siehe ausführlichen Artikel hier: sqlserver-help.com/tag/…
orberkov

8
@ Hurleystylee, deine Lösung hat bei mir wirklich gut funktioniert. Meine DB hatte übrigens einen Besitzer.
Keyvan Sadralodabai

Ich habe das gleiche Problem. Ich habe versucht, die Abfrage von @hurleystylee auszuführen, die ausgeführt wurde, aber sie hat nichts getan. Als ich nachgesehen habe, dbowar immer noch der db_owner und ich kann DBO nichts antun. Es wird wirklich frustrierend. Ich kann nichts ändern.
Wairimu Murigi

@hurleystylee Bitte überlegen Sie, die Antwort zu bearbeiten und zu ergänzen, damit die Benutzer nicht auf die Kommentare schauen müssen, um die Befehlssyntax herauszufinden.
Ulysses Alves

2
@ Hurleystylee Ja, ich sehe, dass er es getan hat. Ich denke, auf diese Weise wird die Antwort von selbst vollständiger.
Ulysses Alves

110

Geben Sie hier die Bildbeschreibung ein

Grafisch tun.

Datenbank Rechtsklick -> Eigenschaften -> Dateien -> Datenbankbesitzer auswählen -> [sa] auswählen - ok


Ich habe mein Problem noch einmal gelöst, indem ich auf diese Antwort zurückgegriffen habe.
Teapeng

Geschafft! Danke dir!
Alejandrob

Wir hatten DB aus diff SQL-Instanz wiederhergestellt. Ich bin diesem Schritt gefolgt und es hat funktioniert. Danke!
Dotnetavalanche


11

Dies kann auch passieren, wenn es sich bei der Datenbank um eine Wiederherstellung von einem anderen SQL Server oder einer anderen Instanz handelt. In diesem Fall stimmt das Sicherheitsprinzipal 'dbo' in der Datenbank nicht mit dem Sicherheitsprinzipal auf dem SQL Server überein, auf dem die Datenbank wiederhergestellt wurde. Frag mich nicht, woher ich das weiß ...


Kann ich Sie fragen, wie Sie das Problem beheben können? lol, genau das versuche ich zu tun. Verschieben Sie Datenbankdiagramme zwischen verschiedenen Servern und implementieren Sie dann die Datenbank. Ich habe diesen Fehler erhalten, als ich die .bak-Datei importiert und versucht habe, den Diagrammordner zu öffnen.
Revolverheld oder


@ ironstone13 hat bei mir nicht funktioniert. Ich habe die Nachricht erhalten, dass ich dbo nicht fallen lassen kann
Wairimu Murigi

8

eine andere Art, es zu tun

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

6

Ausgewählte Antwort und einige andere sind alle gut. Ich möchte nur eine reinere Erklärung für SQL geben. Es kommt zu derselben Lösung, dass es keinen (gültigen) Datenbankeigentümer gibt.

Das fälschlicherweise dboerwähnte Datenbankbesitzerkonto wird immer mit der Datenbank erstellt. Es scheint also seltsam, dass es nicht existiert, aber Sie können es mit zwei Auswahlen überprüfen (oder einer, aber lassen Sie es uns einfach halten).

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

Hier wird die SID des dboBenutzers in der Datenbank DB_NAME und angezeigt

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

um alle Anmeldungen (und ihre SIDs) für diese SQL Server-Instanz anzuzeigen. Beachten Sie, dass kein Präfix db_name geschrieben wurde, da jede Datenbank in dieser Ansicht dieselben Informationen enthält.

Im Falle des oben genannten Fehlers erfolgt keine Anmeldung mit der SID, die dem Datenbank-Dbo-Benutzer zugewiesen ist.

Wie oben erläutert, geschieht dies normalerweise beim Wiederherstellen der Datenbank von einem anderen Computer (wobei Datenbank und Dbo-Benutzer durch unterschiedliche Anmeldungen erstellt wurden). Sie können das Problem beheben, indem Sie den Eigentümer auf das vorhandene Login ändern.



0

Fügen Sie unter "Sicherheit" den Principal als "SQL-Benutzer ohne Anmeldung" hinzu, machen Sie ihn zum Eigentümer des Schemas mit demselben Namen wie der Principal und machen Sie ihn dann in "Mitgliedschaft" zu db_owner.


Dies hat nichts auf SSMS 2017
Zimano

0

Hatte auch diesen Fehler, als versehentlich eine Datenbankverbindungszeichenfolge dem schreibgeschützten Spiegel zugeführt wurde - nicht der Primärdatenbank in einem HA-Setup.


0

Wie in der Nachricht angegeben, sollten Sie Ihrem Benutzer die Berechtigung als Eigentümer festlegen. Sie können also Folgendes verwenden:

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

Hoffe hilfreich! Hinterlasse einen Kommentar, wenn es für dich in Ordnung ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.