web-dev-qa-db-ja.com

SQL Server 2012でダミーのリンクサーバーを作成する方法

2つの異なる運用サーバーにデータベースがあります。 2つのスキーマの整合性を保ちたいと思います。 1つには、リンクサーバーを参照するストアドプロシージャを呼び出すジョブがあります。もう1つはそれらのジョブまたは最初のサーバーと同じ名前のリンクサーバーを含まない(含めるべきではありません)が、両方のサーバーに同じストアドプロシージャを持たせたい。ただし、SQL Serverは、リンクサーバーが設定されていないサーバー上でリンクサーバーを参照するプロシージャの作成を拒否します。なぜそうなるのか理解していますが、プロシージャコードの変更を伴わない回避策(ダイナミックSQLを使用してコンパイラから参照を非表示にするなど)が必要です。

ローカルサーバーを指す予想される名前のリンクサーバーを作成しようとしましたが、SQL Serverは、参照先のテーブルがそのリンクサーバーに存在しないことを確認できるほどスマートです。存在しないサーバーに対して1つ作成すると、リモートサーバーに接続できなかったというプロシージャの作成中にSQLがタイムアウトします。

SQL Serverがリンクサーバー上のテーブル名を検証しないように、ダミーのリンクサーバーを作成する方法はありますか?

2
Mark Freeman
  1. プロシージャの作成が行われるように、ローカルサーバーにダミーの空のテーブルを作成します。

  2. 2部構成の同義語を使用するようにプロシージャー・コードを変更してください。リンクサーバーを使用する必要があるサーバー:

    CREATE SYNONYM dbo.whatever FOR linkedserver.dbo.whatever;
    

    リモート参照が存在する必要がないローカルサーバー:

    CREATE SYNONYM dbo.whatever FOR dbo.emptydummytable;
    

    後者を使用するストアドプロシージャは、遅延名前解決のおかげで作成できます(リンクサーバーを参照するプロシージャを作成するときには機能しません)。これには、ストアドプロシージャコードを変更する必要がありますが、1回限りの変更になります。

3
Aaron Bertrand

どこにも行かないリンクサーバーを作成できます

EXEC master.dbo.sp_addlinkedserver @server = N'THISSERVERNAME', @srvproduct=N'', @provider=N'SQLNCLI'

次に、クエリはリンクサーバーが存在することを認識しますが、その中の何にもアクセスできません。リンクサーバーのクエリ(私が知る限り)は、リンクサーバーをチェックするだけであることがよくあります(SQLデータベースではないことを宣言しているため、あまり詳細にチェックされていないようです)それはあなたが何をしているのか知っていると仮定します(GUIでそれを行うと警告が表示されますが、接続できることを登録せずにリンクサーバーを作成できます。

リンクサーバーを実際に作成しているため、これが許容できる回避策かどうかはわかりませんが、アクセスできないため、基本的にはダミーであり、アクセスしようとするとログインエラーが発生します。

0
Ste Bov