Apa perbedaan antara pengguna `dbo` dan pemilik basis data yang disimpan di sys.databases

11

Kami baru-baru ini memiliki pertanyaan yang muncul di mana pengguna dbodalam database memiliki sidyang tidak cocok dengan owner_sidin sys.databases. Saya mengerti bagaimana pemilik basis data berbeda dengan anggota dari peran tersebut, db_ownertetapi saya selalu berpikir bahwa pengguna dboadalah pemilik sebenarnya dari basis data. Apakah bukan ini masalahnya? Dan jika demikian, apakah ada perbedaan nyata antara dbodan apa yang ada di dalamnya sys.databases?

Kenneth Fisher
sumber

Jawaban:

8

Saya selalu berpikir pengguna dboadalah pemilik sebenarnya dari database.

Itu (atau setidaknya harus) benar. Nama "dbo" dari Pengguna itu tidak pernah berubah, namun SID yang mendasarinya tergantung pada siapa yang membuat basis data, atau siapa yang ditetapkan melalui sp_changedbowner (meskipun, dan termasuk, SQL Server 2005) atau ALAM OTOMATIS (dimulai dengan SQL Server 2008).

Dalam ketiga kasus tersebut, catatan di sys.databasesjuga diubah sehingga mereka tetap sinkron. Namun, ketika mengembalikan Database, baik dari sistem lain atau dari Instance yang sama tetapi dari DB yang dicadangkan / dilepaskan sebelum salah satu dari 2 perintah SQL yang dijalankan untuk mengubah pemilik, kemudian pada KEMBALIKAN kembali atau melampirkan, akan ada menjadi ketidakcocokan antara owner_sidkolom sys.databasesdan "dbo" siddi sys.database_principalsdalam DB itu.

Sejauh yang saya ketahui, catatan dalam sys.database_principalssetiap DB adalah pemilik sebenarnya , dan owner_sidkolom dalam sys.databasesadalah masalah pencatatan / kenyamanan (mirip dengan denasionalisasi; tanpa sys.databasessistem akan perlu membuat pertanyaan terpisah di semua DB untuk dapatkan info itu, setiap kali diminta!) dan keamanan. Satu hal yang digunakan untuk mengidentifikasi DB yang berpotensi berbahaya / dipulihkan / dilampirkan adalah rekaman yang tidak cocok. Mencoba mengakses SQLCLR Assemblies yang ditandai sebagai EXTERNAL_ACCESSatau UNSAFEtidak akan dimuat jika seseorang memilih untuk menempuh rute yang kurang aman untuk diaktifkan TRUSTWORTHYkarena bergantung pada SID "dbo" karena perlu mencocokkan dengan Login yang memiliki salah satu EXTERNAL ACCESS ASSEMBLYatauUNSAFE ASSEMBLYizin. Dan ketika ada ketidaksesuaian dalam SID antara dua pandangan katalog sistem, tidak dapat ditentukan mana yang akan digunakan, dan digunakan sebagai tanda bahaya karena ada kemungkinan masalah keamanan. Bahkan, saya menguji untuk kondisi ini dalam skrip instalasi untuk SQL # untuk mengingatkan seseorang untuk membuat perubahan yang tepat, hanya agar mereka tidak perlu membuang waktu memburunya jika SQL Server mengeluh tentang hal itu di beberapa titik.

Solomon Rutzky
sumber