-3

Oracle Databaseで実行された各SQLファイルの元に戻す操作が必要な問題があります。

私はMSBuildを使用してxmlファイルでそれらを実行します-ログインと@ * .sqlを使用した実行コマンドsqlplus。

すでにコミットされたトランザクションをロールバックできないため、明らかにロールバックは機能しません。

数日間探し続けていますが、まだ答えが見つかりません。私が学んだのは、Oracle Flashback と Point in Time Recovery です。問題は、現在のユーザーに対してのみ変更を元に戻したいことです。つまり、別のユーザーが同時にいくつかの変更を行った場合、私のソリューションはユーザー ' X ' ではなく ' Y 'に対してのみ元に戻すことを実行します。

flashback_transaction_query で start_scn と commit_scn を見つけました。しかし、それは 1 人のユーザーだけを識別しますか? 特定のSCNにフラッシュバックするとどうなりますか? それは私だけを元に戻しますか、それとも他のユーザーも元に戻しますか? 取り出しました

flashback_transaction_query WHERE logon_user='MY_USER_NAME' から start_scn を選択します

WHERE table_name = "MY_TABLE NAME"

そして実行した

FLASHBACK TO SCN「その番号はこちら」

選択した操作の SCN で。それは私のために働くでしょうか?

ポイントインタイムリカバリについても知りましたが、読んだところ、データベース全体が利用できなくなり、他のユーザーはそれを操作できなくなります。

したがって、*.sql ファイル全体を元に戻すものが必要です。

4

2 に答える 2

0

これは可能ですが、使用するツールではできない場合があります。sqlplusトランザクションをロールバックできますが、sqlplus セッションを終了する前に、自動コミットが有効になっていないことと、スクリプトに権限が 1 つだけ含まれていることを確認する必要がありますcommit(まったくコミットしない場合、sqlplus は常にすべての変更をロールバックします)終了します)。

問題は、いくつかのスクリプトがあり、たとえば、昨日実行したスクリプトをロールバックしたい場合に始まります。これはまったく新しいワームであり、常に機能する一般的な解決策はありません (これは「マージ問題」グループの問題の一部です。つまり、誰もがトランザクションを開いたままにしておくことができる場合、異なるユーザーによるトランザクションをマージするにはどうすればよいかという問題です)。彼らは好きです)。

それは可能ですが、データベースを慎重に設計する必要があり、ビジネスルールはそれでOKである必要があります.

一般的なアプローチは、スクリプトによってどの行が変更 (= 作成、更新、削除) されたか、スクリプト名と実行時刻を含むテーブルを作成することです。

この情報を使用して、スクリプトによって作成された変更を取り消すことができる SQL を生成できます。このようなテーブルを埋めるには、トリガーを使用するか、この情報も書き込むような方法でスクリプトを生成します (注: これはおそらく「単純な」sqlplus ソリューションを超えているため、独自のデータ ローダーを作成する必要があります)。

于 2013-01-14T14:17:48.987 に答える