2012-06-04 8 views
7

トリガーのNEWテーブルとOLDテーブルをMySQLのプロシージャに渡すことはできますか? プロシージャが受け付けるテーブルのようなデータ型がないので、私は疑いがありません。 回避策はありますか?トリガーのNEWテーブルとOLDテーブルをMySQLのプロシージャに渡すことはできますか?

理想的には、次のようになります。

CREATE TRIGGER Product_log AFTER UPDATE ON Product 
    FOR EACH ROW BEGIN 
    call logChanges(OLD, NEW); 
    END; 
+0

私は同じ問題/要件を持っています。回避策はありますか(おそらく効率的でしょうか?) – sakhunzai

答えて

1

何NEWまたはOLD テーブルがないので、それは不可能です。トリガ全体がテーブルに関連しています。「新規」と「古い」は、行が含まれていて、値がの後にトリガされたイベントを示します。言い換えれば、あなたの例は次のようになります。

call logChanges(OLD.customername, NEW.customername) 

あなたはまた、基本的に、このような生産テーブル何かのクローンであること、(私はlogchangesがとにかくない期待)履歴テーブル内のすべての古いデータを保存できます。

BEGIN 
    IF OLD.customer_name != NEW.customer_name 
    THEN 
      INSERT INTO myTable_chagne_history 
       (
        customer_id , 
        customer_name , 
        another_field , 
        edit_time 
       ) 
       VALUES 
       (
        OLD.customer_id, 
        OLD.customer_name, 
        OLD.another_field , 
        NEW.time_edit_was_made 
       ); 
    END IF; 
END; 
1

あなたは明示的に各フィールドを渡すことができます。

CALL logChanges(OLD.colA, OLD.colB, NEW.colA, NEW.colB); 

それともlogChangesが、それは別のTAから、このようなコールを処理できることを十分に汎用的でなければならない場合適切な区切り文字を使用してフィールド値を単一の文字列に連結することができる。 unit separator):

CALL logChanges(CONCAT_WS(CHAR(31), OLD.colA, old.colB), 
       CONCAT_WS(CHAR(31), NEW.colA, NEW.colB)); 

またはデータ型が保存されなければならない場合は、1がlogChanges読み込み、そこから一時的にレコードを挿入することができます。

関連する問題