データベース更新スクリプトの1つが特定の顧客サイトで正しく機能しなかった理由をよりよく理解し、データベースの所有権と役割に絞り込んだ(と思います)。
免責事項:お客様のDBAからの返信を実際に待っているので、SQLデータベースを最近アップグレードしたかどうかをお知らせします。彼らのデータベース。更新スクリプトのいくつかの場所で
dbo
を参照していたため、アプリケーションのデータベースログインがスキーマに変換された場合、SQL2000からSQL2005への変換がスクリプトを無駄にした可能性があると思います。
とにかく、私はデータベースの所有権と役割のより良い説明と、T-SQLステートメントで所有者を明示的に指定しない場合にデータベースオブジェクトが実際に割り当てられる所有者にどのように影響するかを見つけようとしています。たとえば、更新スクリプトは通常、_CREATE TABLE foo
_などの代わりに_CREATE TABLE dbo.foo
_を実行しますが、明示的にdbo
を使用しているものがいくつか見つかりました。これらは、で問題を引き起こしているものです。瞬間(この1人の顧客のみ)。
この記事 (SQL Server 2000に固有)が見つかりましたが、そのページの表はわかりにくいです。ユーザーが持つことができる役割の2つの異なる可能性として、_db_owner
_と「データベースを所有している」と記載されています。
たとえば、この表は、_db_owner
_ロールに属するユーザーsam
がクエリCREATE TABLE [test3](abc int)
を実行すると、sam
が所有することを示しています。 。
次に、「データベースを所有している」(原文のまま)別のユーザーsue
が同じクエリを実行した場合、それはdbo
。
_db_owner
_と「データベースを所有している」は同じものではないでしょうか。この表は、「_db_owner
_ロールにいる」と実際には「データベースの所有者である」の間に違いがあることを示しています。しかし、それが本当なら、それが_db_owner
_ロールのメンバーである以外の何かである場合、「データベースを所有する」とはどういう意味ですか?
いいえ、db_ownerとデータベースの所有者は同じではありません。 dboはユーザーであり、db_ownerはデータベースロールです。データベースはログインによって所有されます。データベースを所有するログインはすべて、データベース内でdbo
としてエイリアスされます。 sp_changedbowner
システムストアドプロシージャを使用して、データベースの所有者を変更できます。
データベース内のすべてのオブジェクトは、ユーザーが所有しています。 db_ownerロールのメンバーであるユーザーは、他のアクセス許可の中でも、dboが所有するオブジェクトを作成できます。ユーザーがdb_ownerのメンバーではないが、いくつかの作成権限(Create Tableなど)を持っている場合、ユーザーが作成するオブジェクトはすべて、それらを作成したユーザーによって所有されます。 sp_changeobjectowner
システムストアドプロシージャを使用して、オブジェクトの所有権を変更できます。