1

特定の に対して一連の LINQ2SQLInsertOnSubmitステートメントがあるとしDataContextます。呼び出しが成功した場合、後で送信されたすべてを元に戻すSubmitChangesことができる SQL コマンド (または LINQ2SQL ステートメント) のリストを自動的に生成する方法はありますか? すべてが期待どおりに機能したにもかかわらず、ロールバックを実行するようなものです。

注: 宛先データベースは Oracle または SQL Server のいずれかになります。そのため、両方のデータベースにこれを実現する特定の機能があれば、それも喜んで使用します。

明確化: 挿入が正常に完了するとすぐに「ロールバック」が自動的に行われることは望ましくありません。元のプログラムがデータの挿入を終了してから 24 時間後まで (たとえば)、DELETE (またはその他の手段) を介して INSERT ステートメントを「元に戻す」機能が必要です。発生する可能性のある参照整合性の問題は無視できます。

Id(自動生成された一意の ID) とValue(文字列)の 2 つの列を持つテーブル A を想定します。

LINQ2SQL コードが 2 つの挿入を実行する場合

 INSERT INTO Table A VALUES('a') // Creates new row with Id = 1
 INSERT INTO Table A VALUES('z') // Creates new row with Id = 2

<< time passes>>

後で、実行してこれを「元に戻す」ことができるようにしたいと思います

 DELETE FROM A Where Id = 1
 DELETE FROM A Where Id = 2

または似たようなもの。DELETEステートメントに一致するステートメントを生成できるようにしたいINSERT。または、トランザクションをキャプチャして後でロールバックを実行できる機能を使用します。

プログラムによって開始されなかった他の変更がそれ以降に発生した可能性があるため、特定の時点に「データベースをリセット」することはできません。

4

3 に答える 3

2

SqlConnection構築時に LINQ to SQLにa を渡すことができるため、これを行うのは実際には非常に簡単ですDataContext。この接続をトランザクションで実行し、完了したらすぐにそのトランザクションをロールバックします。

次に例を示します。

string output;

using (var connection = new SqlConnection("your conn.string"))
{
    connection.Open();
    using (var transaction = connection.StartTransaction())
    {
        using (var context = new YourDataContext(connection))
        {
            // This next line is needed in .NET 3.5.
            context.Transaction = transaction;

            var writer = new StringWriter();
            context.Log = writer;

            // *** Do your stuff here ***

            context.SubmitChanges();

            output = writer.ToString();
        }

        transaction.Rollback();
    }
}
于 2010-04-23T10:40:30.600 に答える
1

PRODで変更スクリプトを実行する前に、テストのためにQAチームにロールバックスクリプトを提供する必要があります。

例:ファイルは、私たち、受信者、および他のサードパーティ間の一連のマッピングとともに外部に送信されます。これらのサードパーティの1つは、合意された日付に、3人の間のマッピングを変更したいと考えています。

Execスクリプトは、既存のものを更新し、冗長になったものを削除し、新しいレコードを挿入する可能性があります-後続のリレーショナルセットアップで使用されるscope_identityなど。

何らかの理由で、すべての変更を実行し、ファイルトランスポートが起動された後、UATの場合と同様に、UATで発生しないエラーが発生した場合、変更をロールバックすることを多国間で決定する可能性があります。したがって、ロールバックスクリプト。

TRANを開始すると、TRANまたはROLLBACK TRANをコミットするまで、SQLにこの情報があります。あなたの質問は私のものと同じだと思います-その情報をスクリプトとして出力できますか?

于 2010-11-11T04:44:57.940 に答える
0

なぜこれが必要なのですか?

おそらく、Oracle のフラッシュバックの可能性を探る必要があります。時間をさかのぼることができます。

テーブルまたはデータベースの内容を、特定の時点 (または特定のシステム変更番号) の状態にリセットすることができます。

参照: http://www.oracle.com/technology/deploy/availability/htdocs/Flashback_Overview.htm

于 2010-04-23T14:55:43.437 に答える