SQL Server principal "dbo" tidak ada,

194

Saya mendapatkan kesalahan berikut

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.

Saya membaca tentang ALTER AUTHORIZATION, tapi saya tidak tahu di mana database ini terjadi. Kesalahan ini semakin sering meludah, dan menumbuhkan log kesalahan sekitar 1GB setiap hari.

PBG
sumber
1
Ini mungkin pertanyaan untuk situs DBA, tetapi akan membantu jika Anda memberikan informasi lebih lanjut tentang kapan kesalahan muncul, yaitu perintah apa yang tidak dapat dieksekusi. Dan ada banyak hasil pencarian untuk kesalahan ini termasuk pertanyaan ini ; Sudahkah Anda melihatnya dan apakah mereka cocok dengan situasi dan konfigurasi Anda?
Pondlife

Jawaban:

414

Saya mengatasi masalah ini dengan menetapkan pemilik basis data. Basis data saya tidak memiliki pemilik sebelum masalah ini. Jalankan perintah ini di basis data Anda untuk mengatur pemilik ke akun sysadmin:

use [YourDatabaseName] EXEC sp_changedbowner 'sa'
Hogan
sumber
6
Lihat artikel terperinci di sini: sqlserver-help.com/tag/…
orberkov
8
@ hurleystylee, solusi Anda benar-benar bekerja dengan baik untuk saya. DB saya punya pemilik btw.
Keyvan Sadralodabai
Saya mengalami masalah yang sama. Saya telah mencoba menjalankan query oleh @hurleystylee dieksekusi tetapi tidak melakukan apa-apa. Ketika saya memeriksa dbomasih db_owner dan saya TIDAK BISA MELAKUKAN APA SAJA UNTUK DBO. Menjadi sangat frustasi. Saya tidak bisa mengubah apa pun.
Wairimu Murigi
@ hurleystylee harap pertimbangkan untuk mengedit dan melengkapi jawaban sehingga orang tidak perlu melihat komentar untuk mengetahui sintaks perintah.
Ulysses Alves
2
@ hurleystylee ya, saya tahu dia melakukannya. Saya pikir dengan cara ini jawabannya menjadi lebih lengkap dengan sendirinya.
Ulysses Alves
112

masukkan deskripsi gambar di sini

Lakukan Secara Grafis.

Basis data klik kanan -> properti -> file -> pilih pemilik basis data -> pilih [sa] - ok

arnav
sumber
sekali lagi menyelesaikan masalah saya dengan merujuk kembali ke jawaban ini.
teapeng
Berhasil! Terima kasih!
alejandrob
Kami telah memulihkan DB dari contoh SQL berbeda. Saya mengikuti langkah ini dan berhasil .. Terima kasih!
dotnetavalanche
11

Ini juga dapat terjadi ketika database adalah pemulihan dari server SQL yang berbeda atau contoh. Dalam hal itu, prinsip keamanan 'dbo' dalam database tidak sama dengan prinsip keamanan pada server SQL tempat db dipulihkan. Jangan tanya saya bagaimana saya tahu ini ...

Peter Huppertz
sumber
Bisakah saya bertanya bagaimana cara mengatasinya? lol, itulah yang saya coba lakukan. Pindahkan diagram database antara server yang berbeda dan kemudian implementasikan database. Saya mendapatkan kesalahan ini setelah saya mengimpor file .bak dan mencoba membuka folder diagram.
Gunslingor atau
1
Hei, ini berhasil untuk saya: dba.stackexchange.com/questions/50690/…
ironstone13
@ ironstone13 tidak bekerja untuk saya. Saya mendapat pesan bahwa saya tidak bisa drop dbo
Wairimu Murigi
8

cara lain untuk melakukannya

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

Jawaban yang dipilih dan beberapa yang lain semuanya baik. Saya hanya ingin memberikan penjelasan murni SQL. Itu datang ke solusi yang sama bahwa tidak ada pemilik basis data (valid).

Akun pemilik basis data dboyang disebutkan dalam kesalahan selalu dibuat dengan basis data. Jadi sepertinya aneh bahwa itu tidak ada tetapi Anda dapat memeriksa dengan dua pilihan (atau satu tapi mari kita tetap sederhana).

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

yang menunjukkan SID dbopengguna di basis data DB_NAME dan

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

untuk menampilkan semua login (dan SID mereka) untuk contoh server SQL ini. Perhatikan itu tidak menulis awalan db_name, itu karena setiap database memiliki informasi yang sama dalam pandangan itu.

Jadi dalam hal kesalahan di atas tidak akan ada login dengan SID yang ditugaskan untuk pengguna database dbo.

Seperti dijelaskan di atas bahwa biasanya terjadi ketika mengembalikan database dari komputer lain (di mana database dan pengguna dbo dibuat oleh login yang berbeda). Dan Anda dapat memperbaikinya dengan mengubah kepemilikan menjadi login yang ada.

Waktu Bizniz
sumber
0

Di bawah Keamanan, tambahkan kepala sekolah sebagai "pengguna SQL tanpa login", buat skema sendiri dengan nama yang sama dengan kepala sekolah dan kemudian di Keanggotaan buatlah db_owner.

David Zamula
sumber
Ini tidak melakukan apa pun pada SSMS 2017
Zimano
0

Juga memiliki kesalahan ini ketika secara tidak sengaja memasukkan string koneksi database ke mirror readonly - bukan database utama dalam pengaturan HA.

perintah
sumber
0

Seperti yang dikatakan pesan, Anda harus menetapkan izin sebagai pemilik untuk pengguna Anda. Jadi, Anda dapat menggunakan yang berikut:

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

Semoga bermanfaat! Tinggalkan komentar jika Anda setuju.

Alireza Abdollahnejad
sumber