Główny program SQL Server „dbo” nie istnieje,


194

Otrzymuję następujący błąd

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.

Czytałem o ALTER AUTHORIZATION, ale nie mam pojęcia, w jakiej bazie danych to się dzieje. Ten błąd jest bardzo często wypluwany i dziennik błędów rośnie o około 1 GB dziennie.


1
Jest to prawdopodobnie pytanie do strony DBA, ale pomogłoby to, gdybyś podał więcej informacji o tym, kiedy pojawia się błąd, tj. Jakiego polecenia nie można wykonać. Istnieje wiele wyników wyszukiwania tego błędu, w tym to pytanie ; czy na nie spojrzałeś i czy w jakikolwiek sposób odpowiadają twojej sytuacji i konfiguracji?
Pondlife,

Odpowiedzi:


414

Rozwiązałem ten problem, ustawiając właściciela bazy danych. Moja baza danych nie miała żadnego właściciela przed tym problemem. Wykonaj to polecenie w bazie danych, aby ustawić właściciela konta sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'

6
Zobacz szczegółowy artykuł tutaj: sqlserver-help.com/tag/…
orberkov

8
@hurleystylee, twoje rozwiązanie faktycznie działało dla mnie dobrze. Mój DB miał właściciela btw.
Keyvan Sadralodabai

Mam ten sam problem. Próbowałem uruchomić zapytanie @hurleystylee, wykonało je, ale nic nie zrobiło. Kiedy sprawdziłem, dbonadal był właściciel_bazy_danych i NIE MOGĘ NIC ZROBIĆ DBO. To staje się naprawdę frustrujące. Nic nie mogę zmienić.
Wairimu Murigi,

@urleystylee, proszę rozważyć edycję i uzupełnienie odpowiedzi, aby ludzie nie musieli patrzeć na komentarze w celu znalezienia składni polecenia.
Ulysses Alves

2
@hurleystylee tak, widzę, że tak. Myślę, że w ten sposób odpowiedź sama w sobie staje się bardziej kompletna.
Ulysses Alves

112

wprowadź opis zdjęcia tutaj

Czy graficznie.

Kliknij bazę danych prawym przyciskiem myszy -> właściwości -> pliki -> wybierz właściciela bazy danych -> wybierz [sa] - ok


po raz kolejny rozwiązałem mój problem, powracając do tej odpowiedzi.
teapeng

Przybiłam to! Dziękuję Ci!
alejandrob

Przywróciliśmy DB z różnej instancji SQL. Wykonałem ten krok i zadziałało. Dzięki!
dotnetavalanche


11

Może się to również zdarzyć, gdy baza danych jest odtwarzaniem z innego serwera SQL lub instancji. W takim przypadku podmiot zabezpieczeń „dbo” w bazie danych nie jest tym samym co podmiot zabezpieczeń na serwerze SQL, na którym przywrócono db. Nie pytaj mnie, skąd to wiem ...


Czy mogę zapytać, jak to rozwiązać? lol, właśnie to staram się zrobić. Przenieś diagramy bazy danych między różnymi serwerami, a następnie zaimplementuj bazę danych. Ten błąd wystąpił po zaimportowaniu pliku .bak i próbie otwarcia folderu diagramów.
rewolwerowiec


@ ironstone13 nie działał dla mnie. Dostałem wiadomość, że nie mogę upuścić dbo
Wairimu Murigi,

8

inny sposób na zrobienie tego

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

6

Wybrana odpowiedź i niektóre inne są dobre. Chcę tylko wyjaśnić bardziej SQL. Dochodzi do tego samego rozwiązania, że ​​nie ma (poprawnego) właściciela bazy danych.

Konto właściciela bazy danych, o dboktórym wspomniano błędnie, jest zawsze tworzone z bazą danych. Wydaje się więc dziwne, że nie istnieje, ale możesz to sprawdzić za pomocą dwóch wyborów (lub jednego, ale bądźmy prostymi).

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

który pokazuje SID dboużytkownika w bazie danych DB_NAME i

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

aby wyświetlić wszystkie dane logowania (i ich identyfikatory SID) dla tej instancji serwera SQL. Zauważ, że nie zapisał żadnego prefiksu db_name, ponieważ każda baza danych ma takie same informacje w tym widoku.

W przypadku powyższego błędu nie będzie loginu z identyfikatorem SID przypisanym do użytkownika dbo bazy danych.

Jak wyjaśniono powyżej, zwykle dzieje się tak podczas przywracania bazy danych z innego komputera (gdzie baza danych i użytkownik dbo zostały utworzone przez inny login). Możesz to naprawić, zmieniając własność na istniejący login.



0

W obszarze Bezpieczeństwo dodaj podmiot główny jako „użytkownik SQL bez logowania”, ustaw go jako schemat o tej samej nazwie co zleceniodawca, a następnie w członkostwie ustaw go jako właściciel_db.


To nie zrobiło nic na SSMS 2017
Zimano

0

Wystąpił także ten błąd, gdy przypadkowo podano ciąg połączenia z bazą danych do tylko do odczytu kopii lustrzanej - nie podstawowej bazy danych w konfiguracji HA.


0

Jak napisano w wiadomości, należy ustawić uprawnienia użytkownika jako właściciela. Możesz więc użyć następujących elementów:

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

Mam nadzieję, że pomocna! Zostaw komentarz, jeśli Ci odpowiada.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.