TRIGGERで例外が発生した場合はどうなりますか?私たちは以下の値を持つテーブルR(A、B、C、D、E)があるとしTRIGGERSでの例外処理(各行用)
:
を今、私たちは実際には、下記のトリガとUPDATE R SET b = 2, c = 3 WHERE a = 1
を実行しようとします
CREATE TRIGGER fd_enforcer_update
BEFORE UPDATE on R
FOR EACH ROW
DECLARE counter INT
BEGIN
SELECT COUNT(*) INTO counter
FROM R
WHERE R.A = NEW.A AND R.B = NEW.B AND R.C <> NEW.C
AND NOT (R.A = OLD.A AND R.B = OLD.B AND R.C = OLD.C AND R.D = OLD.D AND R.E = OLD.E);
IF (counter > 0)
THEN raise_exception();
END;
上記のコードは、おそらく機能的依存AB->C
を強制するために書かれています。
上記の例では、UPDATE
ステートメントは4行に影響します。トリガーにFOR EACH ROW
と指定したので、これらの4つの行のそれぞれがチェックされます。
トリガーは、4行のうちの最初の行をチェックして例外を発生させます。今、何が起こるのですか?トリガーは完全に終了しますか?それとも他の3つの行をチェックしていますか?
私のUPDATE
ステートメントが実行された後、実際に更新される行の数はいくつですか?
'update'で例外が発生するので、' update'文は終了し、変更はロールバックされます。これが 'raise_exception()'の動作です。 –
フォーマットされたテストとして[スクリーンショットではなく]データを投稿してください(http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking -a-question/285557#285557) – Aleksej
試したときに何が起こったのですか? –