SQL Server 2000から2008データベースに一連のテーブルをインポートしました。インポートされたすべてのテーブルには、ユーザー名がプレフィックスとして付けられます。例:erpadmin.tablename
。
テーブルのプロパティには、dbスキーマとして「erpadmin」がリストされています。クエリを作成するときは、「erpadmin」を含める必要があります。混乱を招くすべてのテーブル名の前。
現在の結果:
select *
from erpadmin.tablename
望ましい結果:
select *
from tablename
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部構成の名前を使用する必要があります。インデックス付きビューはその一例です。
これは、データベースオブジェクトにアクセスするときに スキーマ名を指定する必要がある の典型的な理由です。これが指定されておらず、デフォルト以外のスキーマのオブジェクトにアクセスしようとしている場合は、現在表示されている問題が発生します。
本当の修正は、アプリケーション(または現在問題となっているクエリエージェント)を明示的に変更することです。
クエリを作成するときは、「erpadmin」を含める必要があります。混乱を招くすべてのテーブル名の前。
それは紛らわしいことではありません、それは明示的な命名規則です。オブジェクトのシャッフルと不整合を避けるために、その命名法を守ることをお勧めします。
@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'
あなたの問題はおそらく移行がどのように行われたかによるものです。あなたが所有者であると見なされない限り、スタッフにユーザーに添付すべきではありません。
スキーマは、理にかなった方法でテーブルを分離するのに役立ちます。 HR部門用のリソースのテーブルが1つあり、製造部門用に別のテーブルが必要で、両方を同じデータベースに保持しているとします。その場合、リソースという名前の2つのテーブルを1つは本番スキーマに、もう1つはHRスキーマに含めることができます。そのため、デフォルトのスキーマにアイテムを入れない限り、shcemasを指定する必要があります。
他の理由で移行をやり直さない場合は、Adam Wengerの転送が賢明な選択肢になるはずです。