web-dev-qa-db-ja.com

挿入と更新の両方のためのMySQL Fireトリガー

テーブルの挿入イベントと更新イベントの両方に対して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つのトリガーを使用する必要がありますか?コードは両方で同じであり、繰り返したくありません。

97
Adam Price

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

116
derobert

@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 ;

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

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 ;

トリガーと手順を定義するビジネスが完了したら、デリミタを復元するよう注意することに注意してください。

43
Al Zziwa

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

12
Jeff_Alieffson