web-dev-qa-db-ja.com

ユーザー `dbo`とsys.databasesに保存されているデータベースの所有者の違いは何ですか

最近、データベースのユーザーdbosidowner_sidsys.databasesと一致しないという質問がありました。データベースの所有者がロールdb_ownerのメンバーとどのように異なるか理解していますが、ユーザーdboがデータベースの実際の所有者であるといつも思っていました。そうではありませんか?もしそうなら、dbosys.databasesの内容に実際の違いはありますか?

11
Kenneth Fisher

ユーザーdboがデータベースの実際の所有者であるといつも思っていました。

それは正しい(または少なくとも正しい)。そのユーザーの名前「dbo」は決して変更されませんが、基になるSIDは、データベースを作成したユーザー、または sp_changedbowner を介して設定されたユーザーによって異なります(ただし、SQL Server 2005を含む)または ALTER AUTHORIZATION (SQL Server 2008以降)。

これら3つのケースすべてで、sys.databasesのレコードも変更され、同期が保たれます。ただし、データベースを別のシステムまたは同じインスタンスから復元する場合は、所有者を変更するために2つのSQLコマンドのいずれかが実行される前にバックアップまたはデタッチされたDBから復元すると、RESTOREまたはアタッチ時に、 owner_sidsys.databases列と、そのDBのsys.database_principalsの "dbo" sidが一致しない。

私の知る限り、各DBのsys.database_principalsのレコードはreal所有者であり、owner_sid列in sys.databasesは、記録保持/利便性(非正規化に似ています。sys.databasesがないと、システムはすべてのDBに対して個別のクエリを実行して、要求されるたびにその情報を取得する必要があります!)とセキュリティの問題です。これが使用される1つのことは、有害である可能性がある/無効な復元/接続されたDBを識別することです。それらのレコードが一致しません。 「dbo」に依存しているため、UNSAFEを有効にする安全性の低いルートを選択した場合、EXTERNAL_ACCESSまたはTRUSTWORTHYのいずれかとしてマークされたSQLCLRアセンブリにアクセスしようとしてもロードされません。 SIDは、EXTERNAL ACCESS AssemblyまたはUNSAFE Assembly権限を持つログインと一致する必要があるため。また、これらの2つのシステムカタログビュー間でSIDに不一致がある場合、どちらを使用するかを決定できず、潜在的なセキュリティ問題がある場合のレッドフラグとして使用されます。実際、私は SQL# のインストールスクリプトでこの状態をテストして、適切な変更を行うように誰かに警告します。これにより、SQL Serverが不平を言った場合に備えて、時間を無駄にする必要がなくなります。ある時点でそれについて。

8
Solomon Rutzky