web-dev-qa-db-ja.com

テーブルのスキーマを指定する必要のないクエリ

SQL Server 2000から2008データベースに一連のテーブルをインポートしました。インポートされたすべてのテーブルには、ユーザー名がプレフィックスとして付けられます。例:erpadmin.tablename

テーブルのプロパティには、dbスキーマとして「erpadmin」がリストされています。クエリを作成するときは、「erpadmin」を含める必要があります。混乱を招くすべてのテーブル名の前。

現在の結果:

select *
from erpadmin.tablename

望ましい結果:

select *
from  tablename
10
Ramdas Bhosale

SQL Server 2000の場合のようにdboスキーマの使用に戻りたい場合は、テーブルをdboスキーマに戻すことができます。

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

非dboスキーマを使用したい場合の代替方法は、ユーザーのデフォルトスキーマをerpadminに設定することです。スキーマを指定しない場合、スキーマはデフォルトとして使用されます。 (sysadmin固定サーバーロールのメンバーはDEFAULT_SCHEMAを無視し、デフォルトでdboを使用します。)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

ただし、2つの部分からなる名前(schema.table)を使用することをお勧めします。そのため、参照するテーブルを明示的に指定できます。一部の機能では2部構成の名前を使用する必要があります。インデックス付きビューはその一例です。

23
Adam Wenger

これは、データベースオブジェクトにアクセスするときに スキーマ名を指定する必要がある の典型的な理由です。これが指定されておらず、デフォルト以外のスキーマのオブジェクトにアクセスしようとしている場合は、現在表示されている問題が発生します。

本当の修正は、アプリケーション(または現在問題となっているクエリエージェント)を明示的に変更することです。

クエリを作成するときは、「erpadmin」を含める必要があります。混乱を招くすべてのテーブル名の前。

それは紛らわしいことではありません、それは明示的な命名規則です。オブジェクトのシャッフルと不整合を避けるために、その命名法を守ることをお勧めします。

17
Thomas Stringer

@AdamWengerの回答に加えて。スキーマに転送するためのスクリプトを作成するには、次のスクリプトを使用できます

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'
7
Igor Borisenko

あなたの問題はおそらく移行がどのように行われたかによるものです。あなたが所有者であると見なされない限り、スタッフにユーザーに添付すべきではありません。

スキーマは、理にかなった方法でテーブルを分離するのに役立ちます。 HR部門用のリソースのテーブルが1つあり、製造部門用に別のテーブルが必要で、両方を同じデータベースに保持しているとします。その場合、リソースという名前の2つのテーブルを1つは本番スキーマに、もう1つはHRスキーマに含めることができます。そのため、デフォルトのスキーマにアイテムを入れない限り、shcemasを指定する必要があります。

他の理由で移行をやり直さない場合は、Adam Wengerの転送が賢明な選択肢になるはずです。

4
JoseTeixeira