最近、2 つのデータベースの大きなマージを試みました。データベース 2 からデータベース 1 にスキーマを再作成し、データベース 2 からデータベース 1 にすべてのデータを転送するスクリプトを作成しました。このスクリプトの実行とトランザクション処理には約 35 分かかります。
BEGIN TRANSACTION
...
IF(@@error<>0)
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
完全なスクリプトは少し機密ですが、同じ構造を持ついくつかの SQL を次に示します: http://pastebin.com/GWJ3ZnkF
スクリプトを実行したところ、すべてのデータがエラーなしで転送されました。新しい結合データベースで動作するシステムをテストしました (古いデータベースへのアクセス権を削除しました)。
しかし、最後の作業として、古いデータベースをオフラインにして、誰もそのデータベースを使用していないことを確認したいと考えていました。これを行うために、次を使用しました。
ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE
これはまずかった。この SQL コード行の後、コピーした結合データベースのすべてのデータが突然なくなりました。私は最初、それが本当に終わっていないと思っていたので、「すぐにロールバック」は私のトランザクションでロールバックを実行したように聞こえます..
しかし、なぜ?トランザクションはすでにコミットされていませんか?
また、同じスクリプトを数回再実行しようとしましたが、スクリプトが成功したと言っても、試行するたびにデータはコピーされませんでした。理由はわかりません...オフラインのロールバックを何らかの形で覚えていましたか?
接続に実際に何が起こっているのですか?