2008-09-16 7 views
0

MS SQL Serverデータベースの行を更新し、ストアドプロシージャを使用して更新を履歴テーブルに挿入するコードを実装するように求められました。データベースを制御しないので、ストアドプロシージャを追加することはできません。ストアドプロシージャでは、更新を行い、別のストアドプロシージャでexecuteを呼び出すことができます。 1つのSQLコマンドを使用してコード内でこれを行うように設定することはできますか?挿入を実行して1つのSQLコマンドをログインします

答えて

1

セカンダリが失敗した場合に最初のステートメントをロールバックできるように、同じステートメント(セミコロンで別々のコマンドを区切る)またはトランザクションを使用して両方を実行します。

+0

これは私に正しい経路を教えてくれたので受け入れてくれました。ありがとう。 – osp70

0

また、SQLトリガーを作成することもできます。

+0

彼はストアドプロシージャを作成することができない場合は、彼はほぼ確実にトリガー – foxxtrot

0

ライブラリによっては、通常、両方のクエリをセミコロンで区切って1つのコマンド文字列に入れることができます。

+0

感謝を作成することはできません、それは私がセミコロンをしようとvb.net 2005を使用したMS SQLです。 – osp70

0

不十分な情報 - どのようなSQLサーバーですか?なぜ履歴テーブルがありますか?

トリガーはこのようなことを行います。 MySQLのバイナリログはあなたにとってもっと便利かもしれません。

あなたはデータベースを制御していないと言います。あなたはそれにアクセスするコードを制御しますか?そこにログを追加し、それをSQLサーバーから完全に削除してください。

+0

履歴テーブルは、アプリケーションがアイテムの更新を表示するために使用します。回復のためのトランザクションログだけではありません。 – osp70

1

これには実際にはストアドプロシージャは必要ありません。問題は本当にあなたがすべての挿入物をコントロールできるかどうかまでにまでわかります。実際にすべての挿入物にアクセスできる場合は、挿入物をデータテーブルにラップし、ヒストリカルテーブルに挿入するだけで単一の転置を行うことができます。これにより、両方が成功して「成功」することが保証されます。ただし、トランザクション内で順番にテーブルにアクセスするときは、履歴テーブルとデータテーブルをロックしないようにする必要があります。そうしないとデッドロック状態になる可能性があります。

ただし、挿入を制御できない場合は、変更、挿入、または削除されたデータにアクセスする特定のデータベースシステムにトリガーを追加できます。挿入、更新、削除を行った人のように、必要なデータをすべて提供しても提供しなくてもかまいませんが、変更された内容が表示されます。

0

お返事いただきありがとうございます。以下は、私がやったことの概要です。今、トランスが失敗した場合に実際にロールバックするかどうかを調べるテスト。

sSQL = "BEGIN TRANSACTION;" & _ 
      " Update table set col1 = @col1, col2 = @col2" & _ 
      " where col3 = @col3 and " & _ 
      " EXECUTE addcontacthistoryentry @parm1, @parm2, @parm3, @parm4, @parm5, @parm6; " & _ 
      "COMMIT TRANSACTION;" 
+0

私のテスト環境では、格納されたprocを削除しました.SQLがエラーを投げたとき、情報は開始と同じであったため、更新はロールバックされているに違いありません。みんな、ありがとう! – osp70

関連する問題