web-dev-qa-db-ja.com

SQLServer-ダウンタイムなしでシノニムをリダイレクトする

同義語を使用する複数のアプリケーションデータベースが、外部バックアップを復元することによって定期的に更新する必要がある不変のデータを持つ共有データベースを指している。現在、更新期間中はアプリケーションを停止できないという新しい要件があるため、データベースを更新する計画は次のとおりです。

  1. 更新された共有データベースをshared_tempとして復元します
  2. アプリケーションデータベース内のすべての同義語をshared_tempにリダイレクトします
  3. 更新された共有データベースを「メイン」sharedデータベースに復元します
  4. 同義語をsharedにリダイレクトします
  5. ドロップshared_temp

alter synonymステートメントがないように見えるので、drop synonymcreate synonymの間で実行されたクエリが共有データベースの参照に失敗する競合状態なしで、これらのシノニムリダイレクトを実行するにはどうすればよいですか?

同義語をロックし、ロック中に再作成できるようにする方法はありますか?

あるいは、シングルユーザーモードのように着信クエリが拒否されるのではなくキューに入れられるように、データベース(またはスキーマ)全体をロックする方法はありますか?

他のすべてが失敗した場合、クエリを遅くすることなく、データベース内のすべてのテーブルの内容を別のテーブルから更新する信頼できる方法はありますか?データには内部参照があることに注意してください。既存の参照は、新しいデータでも引き続き有効であることが保証されています。以前のバージョンにダウングレードしない限り、安全であるはずです。

これらの同義語を参照するステートメントを変更することはできません。

SQLServerの最小バージョンは2008R2ですが、新しいバージョンでこれが可能になる場合は、アップグレードを選択できます。

プロセスにかかる時間はあまり気にせず、ダウンタイムがないことだけを考えています。ドロップと名前の変更はアトミックではなく、ロックできない可能性があります。そうでない場合はオプションになります。

1
Jussi Kosunen

コメントに残された回答 Dan Guzman

DROP/CREATEステップ2および4のトランザクション内のすべての同義語。(うまくいけば)短期間のブロッキングが発生する可能性がありますが、ダウンタイムは発生しません。

3
user126897