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


10

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

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

現在の結果:

select *
from erpadmin.tablename

望ましい結果:

select *
from  tablename

回答:


23

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部構成の名前を使用する必要があります。インデックス付きビューはその一例です。


17

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

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

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

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


3
常に2部構成の名前を使用するもう1つの理由は、複数のユーザーが同じコード(たとえばselect ... from table5 ;)を実行して異なる結果が得られる状況を回避するためです。これは、プランのキャッシュとトラブルシューティングにも問題があります(キューサポート担当者、「このクエリはここで正常に実行されます」)。また、関数とビューのインデックス付けに必要なスキーマバインディングには、2つの部分名が必要です。TLDR:怠惰になるのをやめる-2つの部分名を使用します。
Greenstone Walker

7

@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'

4

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

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

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


-2

コマンドを開始します。USE [tablename] クエリには参照するデータベースが関連付けられておらず、表示しているデータベースはログインしているユーザーのデフォルトではありません。クエリウィンドウの上部には、おそらく「マスター」と表示されています。


3
ということ[database_name]ですか?
dezso 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.