Was ist der Unterschied zwischen dem Benutzer "dbo" und dem Eigentümer der in sys.databases gespeicherten Datenbank?

11

Wir hatten kürzlich eine Frage, wo der Benutzer dboin einer Datenbank eine hatte sid, die nicht mit der owner_sidin übereinstimmte sys.databases. Ich verstehe, wie sich der Eigentümer der Datenbank von Mitgliedern der Rolle unterscheidet, db_owneraber ich hatte immer gedacht, dass der Benutzer dboder tatsächliche Eigentümer der Datenbank ist. Ist das nicht der Fall? Und wenn ja, gibt es echte Unterschiede zwischen dbound was ist drin sys.databases?

Kenneth Fisher
quelle

Antworten:

8

Ich hatte immer gedacht, der Benutzer dbosei der eigentliche Eigentümer der Datenbank.

Das ist (oder sollte zumindest sein) richtig. Der Name "dbo" dieses Benutzers ändert sich nie, die zugrunde liegende SID hängt jedoch davon ab, wer die Datenbank erstellt hat oder für wen sie über sp_changedbowner (bis einschließlich SQL Server 2005) oder ALTER AUTHORIZATION (beginnend mit SQL) festgelegt wurde Server 2008).

In allen drei Fällen wird auch die Aufzeichnung in sys.databasesgeändert, damit sie synchron gehalten werden. Wenn Sie jedoch eine Datenbank wiederherstellen, entweder von einem anderen System oder von derselben Instanz, aber von einer Datenbank, die vor dem Ausführen eines dieser beiden SQL-Befehle zum Ändern des Besitzers gesichert / getrennt wurde, erfolgt dies beim Wiederherstellen oder Anhängen werden , um eine Nichtübereinstimmung zwischen der owner_sidSäule sys.databasesund dem „DBO“ sidin sys.database_principalsin dieser DB.

Soweit mir bekannt ist, ist der Datensatz in sys.database_principalsjeder Datenbank der eigentliche Eigentümer, und die owner_sidSpalte in sys.databasesist eine Frage der Aufzeichnung / Bequemlichkeit (ähnlich wie bei der Denormalisierung; ohne dass sys.databasesdas System separate Abfragen über alle DBs hinweg durchführen müsste Holen Sie sich diese Informationen, jedes Mal angefordert!) und Sicherheit. Eine Sache, für die es verwendet wird, ist die Identifizierung einer potenziell schädlichen / ungültigen wiederhergestellten / angehängten Datenbank, wenn diese Datensätze nicht übereinstimmen. Der Versuch, auf SQLCLR-Baugruppen zuzugreifen, die als entweder markiert sind EXTERNAL_ACCESSoder UNSAFEnicht geladen werden, wenn man sich für den weniger sicheren Aktivierungsweg entschieden hat, TRUSTWORTHYda dies von der SID "dbo" abhängt, da diese mit einem Login übereinstimmen muss, das entweder das EXTERNAL ACCESS ASSEMBLYoder hatUNSAFE ASSEMBLYGenehmigung. Und wenn die SID zwischen diesen beiden Systemkatalogansichten nicht übereinstimmt, kann nicht bestimmt werden, welche verwendet werden soll, und als rote Fahne für ein potenzielles Sicherheitsproblem verwendet werden. Tatsächlich teste ich diese Bedingung im Installationsskript für SQL # , um jemanden zu warnen, die entsprechende Änderung vorzunehmen, damit er keine Zeit damit verschwenden muss, sie zu suchen, falls sich SQL Server irgendwann darüber beschwert.

Solomon Rutzky
quelle