挿入と更新の両方のMySQL Fire Trigger


111

テーブルの挿入イベントと更新イベントの両方に対してmysqlトリガーを起動することは可能ですか?

私は次のことができることを知っています

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW
BEGIN
.....
END //

CREATE TRIGGER my_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....
END //

しかし、どうすればいいですか

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table` AND
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....

それは可能ですか、または2つのトリガーを使用する必要がありますか?コードは両方とも同じで、繰り返したくありません。

回答:


126

2つのトリガーを作成する必要がありますが、共通のコードをプロシージャに移動して、両方にプロシージャを呼び出させることができます。


3
構文に不慣れな私たちのために、おもちゃの例を挙げていただけますか?
Zxaos 2011

3
@Zxaos:dev.mysql.com/doc/refman/5.1/en/create-procedure.html(例を含む)から始めて、必要に応じて独自の質問をすることをお勧めします。
デロベルト

2
OracleのようにAND / OR演算子を使用できないのは残念です。さらに、パラメーターによって変数OLDとNEW全体をプロシージャに渡すことができない場合はなおさらです。私のコードは2倍以上になります
Mikel 2013年

二回のコードを書くことに妥協したことがない開発者のための便利なこの1の...
Sayka

1
@luismartingilプロシージャを呼び出す場合とインライン化する場合では、おそらくいくつかの余分なオーバーヘッドがあります。しかし、その代わりに、メンテナンスが容易になり、2つのトリガーのコードが誤って分岐しないことが保証されます。
derobert

46

@Zxaosリクエストへの応答では、MySQLトリガーのAND / OR演算子を使用できないため、コードから開始すると、以下は同じことを実現する完全な例です。

1. INSERTトリガーを定義します。

DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE DEFINER=root@localhost TRIGGER my_insert_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW

BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    -- NEW.id is an example parameter passed to the procedure but is not required
    -- if you do not need to pass anything to your procedure.
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

2. UPDATEトリガーを定義する

DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//

CREATE DEFINER=root@localhost TRIGGER my_update_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

3.これらの両方のトリガーで使用される共通の手順を定義します。

DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//

CREATE DEFINER=root@localhost PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255))
READS SQL DATA
BEGIN

    -- Write your MySQL code to perform when a `table` row is inserted or updated here

END//
DELIMITER ;

トリガーと手順を定義するビジネスが終了したら、区切り文字を元に戻すよう注意していることに注意してください。


1
IN table_row_id VARCHAR(255)この場合には?どの行を挿入または更新するかをどのように定義していますか?
VaTo 2016

13

残念ながら、Oracleのように、INSERTまたはUPDATEの説明のにMySQLで使用することはできません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.