2016-06-20 15 views
0

私のLiveAppDBには、より大きなLiveProduction DBを参照するビューの負荷があります。私は何をしたいのは、アプリケーションのDBは、ビューがビューLiveAppDBがLiveProductionDBを使用する場合は、この... を明確に支援するための入札ではFrom句のTSQLケース

-- VIEW CAN RUN ON LiveApplicationDB or TestApplicationDB 
SELECT  COL1, COL2 
FROM   (CASE WHEN DB_NAME() = ‘LiveApplicationDB‘ THEN  LIVEPRODUCTION.DB.DBTABLE ELSE TESTPRODUCTION.DB.DBTABLE END) AS tabl1 -- CASE TO DETERMINE WHICH PRODUCTION DB TO USE 
INNER JOIN  dbo.ThisDBTable BRA 
ON   tabl1.product COLLATE Latin1_General_BIN = BRA.product 
WHERE  (tabl1.COL1 IS NOT NULL) 

上で実行されているかに応じて、TestProduction DBを見て、コードを切り替えていますelse TestAppDB use TestProductionDB

もちろん、ビューで変数を使用することはできません。

ご迷惑をおかけして申し訳ございません。

+0

を比較に利益をもたらすテストと生産の間で同じですか? –

答えて

0

サーバーがリンクされている場合は、テストインスタンスを指す4つの部分からなる名前付け規則を使用できます。例: (CASE WHEN DB_NAME()= 'LiveApplicationDB'、その後はLiveServer.LIVEPRODUCTION)。 ELSE DB.DBTABLE TestServer.TESTPRODUCTION.DB.DBTABLE END しかし、あなたは知識/パワーを持っている場合は、あなた自身をあなたのDBAは、サーバをリンクすることに同意して取得する必要があり、またはそれをやります。

ドナ

0

私はこのやり方を若干違う方法でやっていますが、いつもテーブルdbo.ThisDBTableを使用しています。これをベーステーブルとして使用し、db_name()ON句をチェックインしてください。

-- VIEW CAN RUN ON LiveApplicationDB or TestApplicationDB 
SELECT BRA.COL1 
    ,COLLATE(tab1.COL2, tab2.COL2) COL2 
FROM dbo.ThisDBTable BRA 
LEFT JOIN LIVEPRODUCTION.DB.DBTABLE tab1 
    ON BRA.product = tab1.product COLLATE Latin1_General_BIN 
    AND DB_NAME() = 'LiveApplicationDB' 
LEFT JOIN TESTPRODUCTION.DB.DBTABLE tab2 
    ON BRA.product = tab2.product COLLATE Latin1_General_BIN 
    AND DB_NAME() = 'TestProductionDB' 
WHERE tab1.COL1 IS NOT NULL 
1

TestAppDBでまったく同じ名前がTESTPRODUCTION.DB.DBTABLEを指してLIVEPRODUCTION.DB.DBTABLEと同義語を指しLiveProductionDBでシノニムを作成します。クエリで同義語を使用します。あなたはおそらく、あなたの展開スクリプトでこのような何かを置く必要があります。

FYI
IF DB_NAME() = 'LiveApplicationDB' 
    CREATE SYNONYM dbo.DBTABLE FOR LIVEPRODUCTION.DB.DBTABLE; 
IF DB_NAME() = 'LiveApplicationDB' 
    CREATE SYNONYM dbo.DBTABLE FOR TESTPRODUCTION.DB.DBTABLE; 

:大半は、私が試したツールを比較同義語の先を無視し、したがって、これは違い考慮されません。

EDIT:他のデータベースのオブジェクトを直接使用しないことをおすすめします。たとえば、dbAにdbBのオブジェクトが必要な場合は、dbAという名前のdbAにスキーマを作成し、このスキーマにdbAのdbBのオブジェクトを参照するシノニムを配置します。ほとんどの場合、私はdbAでdbAと呼ばれるスキーマを作成し、そこにビューとsprocsを置くだけでdbAで使用することもできます。 dbAは、dbBのdbAスキーマに配置されたオブジェクトのみを使用できます。このアプローチの背後にある理由を説明しfutherするには:

  • DBAからDBB上のすべての依存関係が明確に風がある別のサーバーにDBBを移動する両方のデータベース
  • に記載されているが、単純にすべての同義語をリンクサーバーを作成および変更。 sprocを修正またはテストする必要はありません。
  • Datamodelの変更dbBがdbAの変更を行う必要があるとは限りません。dbBのスキーマdbAのオブジェクトのインターフェイスが同じであることを確認してください。重要
  • すべてのコードは、正確な展開とコードこれらの答えのいずれかがあなたのために働くんでした
+0

申し訳ありませんが、私は、TestApplicationDBがLiveApplicationDBによって上書きされるということを忘れています(さらなる複雑さを追加するだけです)。私はこの[リンク] https://www.ideosity.com/how-to-find-and-replace-text-in-all-stored-procedures/を見つけました。これは、リストア後に実行することができます。 – ItsDanny