最近、データベースのユーザーdbo
のsid
がowner_sid
のsys.databases
と一致しないという質問がありました。データベースの所有者がロールdb_owner
のメンバーとどのように異なるか理解していますが、ユーザーdbo
がデータベースの実際の所有者であるといつも思っていました。そうではありませんか?もしそうなら、dbo
とsys.databases
の内容に実際の違いはありますか?
ユーザー
dbo
がデータベースの実際の所有者であるといつも思っていました。
それは正しい(または少なくとも正しい)。そのユーザーの名前「dbo」は決して変更されませんが、基になるSIDは、データベースを作成したユーザー、または sp_changedbowner を介して設定されたユーザーによって異なります(ただし、SQL Server 2005を含む)または ALTER AUTHORIZATION (SQL Server 2008以降)。
これら3つのケースすべてで、sys.databases
のレコードも変更され、同期が保たれます。ただし、データベースを別のシステムまたは同じインスタンスから復元する場合は、所有者を変更するために2つのSQLコマンドのいずれかが実行される前にバックアップまたはデタッチされたDBから復元すると、RESTOREまたはアタッチ時に、 owner_sid
のsys.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が不平を言った場合に備えて、時間を無駄にする必要がなくなります。ある時点でそれについて。