Ich hatte immer gedacht, der Benutzer dbo
sei 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.databases
geä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_sid
Säule sys.databases
und dem „DBO“ sid
in sys.database_principals
in dieser DB.
Soweit mir bekannt ist, ist der Datensatz in sys.database_principals
jeder Datenbank der eigentliche Eigentümer, und die owner_sid
Spalte in sys.databases
ist eine Frage der Aufzeichnung / Bequemlichkeit (ähnlich wie bei der Denormalisierung; ohne dass sys.databases
das 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_ACCESS
oder UNSAFE
nicht geladen werden, wenn man sich für den weniger sicheren Aktivierungsweg entschieden hat, TRUSTWORTHY
da dies von der SID "dbo" abhängt, da diese mit einem Login übereinstimmen muss, das entweder das EXTERNAL ACCESS ASSEMBLY
oder hatUNSAFE ASSEMBLY
Genehmigung. 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.