Il principale "dbo" di SQL Server non esiste,


194

Ricevo il seguente errore

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.

Ho letto ALTER AUTHORIZATION, ma non ho idea di quale database stia accadendo. Questo errore viene espulso molto frequentemente e aumenta il registro degli errori di circa 1 GB ogni giorno.


1
Questa è probabilmente una domanda per il sito DBA, ma sarebbe utile se fornissi ulteriori informazioni su quando appare l'errore, ovvero quale comando non può essere eseguito. E ci sono molti risultati di ricerca per questo errore inclusa questa domanda ; li hai guardati e corrispondono in qualche modo alla tua situazione e configurazione?
Pondlife

Risposte:


414

Ho risolto questo problema impostando il proprietario del database. Il mio database non aveva avuto alcun proprietario prima di questo problema. Eseguire questo comando nel database per impostare il proprietario sull'account sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
Vedi l'articolo dettagliato qui: sqlserver-help.com/tag/…
orberkov,

8
@hurleystylee, la tua soluzione in realtà ha funzionato bene per me. Il mio DB aveva un proprietario tra l'altro.
Keyvan Sadralodabai,

Sto riscontrando lo stesso problema. Ho provato a eseguire la query da @hurleystylee eseguita ma non ha fatto nulla. Quando ho controllato dboera ancora il db_owner e NON POSSO FARE NIENTE A DBO. Sta diventando davvero frustrante. Non posso cambiare nulla.
Wairimu Murigi,

@hurleystylee, considera di modificare e integrare la risposta in modo che le persone non debbano guardare i commenti per scoprire la sintassi del comando.
Ulisse Alves il

2
@hurleystylee sì, vedo che l'ha fatto. Penso che in questo modo la risposta diventi più completa da sola.
Ulisse Alves il

112

inserisci qui la descrizione dell'immagine

Fare graficamente.

Fare clic con il tasto destro del mouse sul database -> proprietà -> file -> selezionare il proprietario del database -> selezionare [sa] - ok


ancora una volta risolto il mio problema facendo riferimento a questa risposta.
Teapeng,

Azzeccato! Grazie!
Alejandrob,

Abbiamo ripristinato DB dall'istanza diff SQL. Ho seguito questo passaggio e ha funzionato .. Grazie!
dotnetavalanche,


11

Ciò può accadere anche quando il database è un ripristino da un diverso server SQL o istanza. In tal caso, l'entità di sicurezza 'dbo' nel database non è la stessa dell'entità di sicurezza sul server SQL su cui è stato ripristinato il db. Non chiedermi come lo so ...


Posso chiederti come risolverlo? lol, è esattamente quello che sto cercando di fare. Spostare i diagrammi di database tra server diversi e quindi implementare il database. Ho ricevuto questo errore dopo aver importato il file .bak e ho provato ad aprire la cartella diagrammi.
pistolero o

1
Ehi, questo ha funzionato per me: dba.stackexchange.com/questions/50690/…
ironstone13

@ ironstone13 non ha funzionato per me. Ho ricevuto il messaggio che non posso eliminare dbo
Wairimu Murigi il

8

un altro modo di farlo

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

6

La risposta selezionata e alcune altre sono tutte valide. Voglio solo dare una spiegazione più pura di SQL. Viene alla stessa soluzione che non esiste un proprietario (valido) del database.

L'account del proprietario del database dbomenzionato per errore viene sempre creato con il database. Quindi sembra strano che non esista, ma puoi controllare con due selezioni (o una, ma manteniamola semplice).

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

che mostra il SID dbodell'utente nel database DB_NAME e

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

per mostrare tutti gli accessi (e i loro SID) per questa istanza del server SQL. Notare che non ha scritto alcun prefisso db_name, perché ogni database ha le stesse informazioni in quella vista.

Quindi in caso di errore sopra non ci sarà accesso con SID assegnato all'utente del dbo del database.

Come spiegato sopra, ciò si verifica in genere quando si ripristina il database da un altro computer (in cui il database e l'utente dbo sono stati creati con un accesso diverso). E puoi risolverlo cambiando la proprietà al login esistente.



0

In Sicurezza, aggiungi l'entità come "utente SQL senza accesso", rendilo proprietario dello schema con lo stesso nome dell'entità e quindi in Appartenenza rendilo db_owner.


Questo non ha fatto nulla su SSMS 2017
Zimano,

0

Si è verificato anche questo errore quando è stata inviata accidentalmente una stringa di connessione al database al mirror di sola lettura, non al database primario in un'installazione HA.


0

Come diceva il messaggio, dovresti impostare l'autorizzazione come proprietario per il tuo utente. Quindi puoi usare quanto segue:

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

Spero utile! Lascia un commento se ti va bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.