1

私のスキーマには、入力する必要のある共通のフィールドを持つ多くのテーブルがあります。これは基本的に次のような制御フィールドです。

id_db_user
date_creation
date_last_update

このフィールドに入力するために2つのトリガーを実行しました。

-- Trigger DDL Statements
delimiter |
CREATE TRIGGER control_insert BEFORE INSERT ON EZT_SOCIETIES

  FOR EACH ROW BEGIN

    SET NEW.id_db_user    = current_user;

    SET NEW.date_creation = current_timestamp;

  END;
| delimiter ;


delimiter |
CREATE TRIGGER control_update BEFORE UPDATE ON EZT_SOCIETIES

  FOR EACH ROW BEGIN

    SET NEW.date_last_update = current_timestamp;

  END;
| delimiter ;

私の質問は、トリガー内の操作を呼び出す関数を作成できますか?このようなもの:

function fn_control_insert
    SET NEW.id_db_user    = current_user;
    SET NEW.date_creation = current_timestamp;

次に、次のようにトリガーでこの関数を呼び出します。

delimiter |
CREATE TRIGGER control_insert BEFORE INSERT ON EZT_SOCIETIES

  FOR EACH ROW BEGIN

    call fn_control_insert;

  END;
| delimiter ;

これはMySQLで行うことができますか?

よろしくお願いします、

4

2 に答える 2

3

いいえ、残念ながら不可能です。また、パラメータとしてNEWとOLDを渡すことも、関数パラメータをOUTまたはINOUT(つまり書き込み可能)にすることもできないため、簡単な答えは「いいえ」です。

トリガーから関数を呼び出すことはできますが(トリガーがアタッチされているテーブルの変更など、MySQLトリガーの制限に違反していない場合)、個々のNEWまたはOLDフィールドごとに関数を渡す必要があります。読み取る必要があり、関数はそれらに書き込むことができなくなります—関数からできることは、値を返すことだけです。

于 2012-06-06T08:25:24.227 に答える
0
  • date_creation'ONUPDATECURRENT_TIMESTAMP'句を使用してフィールドをTIMESTAMPとして宣言します。このフィールドは、INSERTまたはUPDATEステートメントのCURRENT_TIMESTAMP値で自動的に更新されます。詳細情報-TIMESTAMPの自動初期化と更新

  • トリガーにNEW.id_db_user値だけを設定しますcontrol_insert- SET NEW.id_db_user = current_user;

  • control_updateトリガーを削除します。

于 2012-06-06T08:49:33.030 に答える