2012-06-06 55 views
1

在我的模式中,我有很多需要填寫的常用字段的表格。這是這樣的人basicaly控制字段:MySQL - 有可能調用函數來執行觸發器操作?

id_db_user 
date_creation 
date_last_update 

我已經做了兩個觸發器來填補這一領域:

-- 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做什麼?

最好的問候,

回答

2

不,這是不可能的,不幸的是,也可以通過新的和舊的參數,也沒有函數的參數可以是OUT或INOUT(即寫入),所以簡單的答案是否定的。

你可以從觸發器中調用一個函數(假設該函數不違反任何MySQL觸發器限制,例如修改觸發器附加的表),但是你必須通過每個單獨的NEW或OLD字段需要閱讀,並且該函數將無法寫入它們 - 您可以從函數執行的所有操作都會返回一個值。

+0

嗨米格爾,感謝您的答覆。我一直在閱讀關於這個主題。是否可以使用PROCEDURE並在AFTER INSERT/UPDATE TRIGGER中將PROCEDURE傳遞給PROCEDURE以將新值傳遞給該過程?謝謝 –

+0

你可以,但INOUT和OUT參數不起作用,並且該過程不能用於解決MySQL對遞歸等觸發器的限制。 –

0
  • 用'ON UPDATE CURRENT_TIMESTAMP'子句聲明date_creation字段爲TIMESTAMP。該字段將使用INSERT或UPDATE語句中的CURRENT_TIMESTAMP值自動更新。更多信息 - Automatic Initialization and Updating for TIMESTAMP

  • control_insert觸發器中設置NEW.id_db_user值 - SET NEW.id_db_user = current_user;

  • 刪除control_update觸發器。

相關問題