C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: トリガについて


(過去ログ 22 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■9874 / inTopicNo.1)  トリガについて
  
□投稿者/ ダンナ (1回)-(2007/11/06(Tue) 14:34:34)

分類:[データベース全般] 

トリガを作成していてふと思ったので質問があります。

例えばテーブルAにプログラムでINSERTするような処理があったとして
そのINSERTされた時にトリガでテーブルBに何か処理をするトリガを作成するとします。
プログラムの方はトランザクション処理をしていて、失敗したらロールバックなどやるようにしていて
もし失敗したとしたら、トリガの方は動作しないんでしょうか?
ちゃんとコミットが完了してから初めてトリガが動作するんでしょうか?

逆に、トリガの方のトランザクションも気になります。
プログラムの方は成功して、プログラム側でコミットを切ってしまっていると
それが終わった後にトリガが走るとしたら、そのトリガで失敗したらどうなるんでしょう?
テーブルAにプログラムでINSERT→成功したのでコミット

テーブルAのINSERTに反応するトリガがテーブルBにログのような物をINSERT→失敗
こんな状態になった時、テーブルAにはデータが入っているのに
テーブルBにはデータがない事になってしまいますが、どうするんでしょう?
こういう事にはなりえなのでしょうか?
それとも何か方法があって、それで対処するんでしょうか?

トリガ自体にトランザクション処理をしても、テーブルAの方はプログラム側でコミットしているので
トリガが動作する時には既にコミットされていますよね?
テーブルAの処理は外部からのプログラム。
テーブルBはデータベース自体の処理なので、別々のトランザクションになると思うので。
ストアドとかならプログラム側のトランザクション内でストアド呼べば
同一トランザクション内で完結するので大丈夫かと思いましたが
トリガの場合、こういうのはどうやって対処していくんでしょうか?
引用返信 編集キー/
■9899 / inTopicNo.2)  Re[1]: トリガについて
□投稿者/ はつね (327回)-(2007/11/06(Tue) 20:12:41)
No9874 (ダンナ さん) に返信
> 例えばテーブルAにプログラムでINSERTするような処理があったとして
> そのINSERTされた時にトリガでテーブルBに何か処理をするトリガを作成するとします。
> プログラムの方はトランザクション処理をしていて、失敗したらロールバックなどやるようにしていて
> もし失敗したとしたら、トリガの方は動作しないんでしょうか?
> ちゃんとコミットが完了してから初めてトリガが動作するんでしょうか?

RDBMSの種類にもよりますし、トリガーの種類にもよります。
ちゃんとトランザクションをサポートしていれば、テーブルBの処理中にエラーが発生してロールバックすればテーブルAのINSERTもロールバック可能なような指定ができます。
イメージ的には、プログラムで明示的にテーブルAにINSERTしたあとにテーブルBに何らかの処理をおこなうというのを同一トランザクションでおこなっているようなイメージ。


> テーブルAの処理は外部からのプログラム。
> テーブルBはデータベース自体の処理なので、別々のトランザクションになると思うので。

表現をかえてみましょう。
テーブルAの処理は外部プログラムから依頼されたデータベース自身の処理
テーブルBはテーブルAの処理に伴い自動的に依頼されたデータベース自身の処理
要はテーブルに対して処理を行うのはすべてデータベース自身だという事です。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -