1. 程式人生 > >幾個sql觸發器樣例

幾個sql觸發器樣例

觸發器雖然在sql標準中有支援,但是幾個資料庫仍然還是具有特殊的語法。筆者試著寫了幾個比較常用的觸發器作為記錄。

DEMO

使用一下兩個表作為觸發器的使用示例

  • test1(a, b, c, d)
  • test2(a, c, d)

Mysql

  • insert
DROP TRIGGER IF EXISTS after_insert_trigger;
DELIMITER $
CREATE TRIGGER after_insert_trigger
AFTER INSERT ON test1
FOR EACH ROW
BEGIN
    INSERT
INTO test2 VALUES(NEW.a, NEW.c, NEW.d);
END$ DELIMITER ;
  • update
DROP TRIGGER IF EXISTS after_update_trigger;
DELIMITER $
CREATE TRIGGER after_update_trigger
AFTER UPDATE ON test1
FOR EACH ROW
BEGIN
    UPDATE test2 SET c = NEW.c, d = NEW.d WHERE test2.a = NEW.a;
END$
DELIMITER ;
  • delete
DROP TRIGGER IF EXISTS after_delete_trigger;
DELIMITER $
CREATE TRIGGER after_delete_trigger
AFTER DELETE ON test1 
FOR EACH ROW 
BEGIN 
DELETE FROM test2 WHERE test2.a = OLD.a;
END$
DELIMITER ;


  • 這裡AFTER 指在事件發生後執行,我們也可以使用BEFORE在事件發生之前執行觸發器的動作。

在事件之前被執行的觸發器可以作為避免非法更新、插入或刪除的額外約束。為了避免執行非法動作而產生錯誤,觸發器可以採取措施來糾正問題,使更新、插入或刪除合法化。[1]

DROP TRIGGER IF EXISTS before_insert_trigger;
DELIMITER $
CREATE TRIGGER before_insert_trigger
BEFORE INSERT ON test1
FOR EACH ROW
BEGIN
  SET NEW.b = NEW.b + 1;
END$
DELIMITER ;
  • DELIMITER
    DELIMITER是用來定義分隔符的,由於BEGIN和END之中的多行執行語句需要’ ; ‘作為結尾,導致命令列提前以為語句書寫結束,導致報錯,需要使用DELIMITER定義臨時分隔符,如’$’保證語句的正常執行。

Postgresql

postgresql對觸發器的語法是比較特殊的,需要先定義執行函式,然後在出發器中使用EXECUTE PROCEDURE來處理執行的行為。

CREATE OR REPLACE FUNCTION after_insert_trigger()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO test2 VALUES(NEW.a, NEW.c, NEW.d);
RETURN NULL;
END;
$$
LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS after_insert_trigger ON test1;
CREATE TRIGGER after_insert_trigger
    AFTER INSERT ON test1
    FOR EACH ROW EXECUTE PROCEDURE after_insert_trigger();

其他行為語法均與上面例子相似,筆者便不再贅述。

參考文獻

[1] Abraham Silberschatz, Henry F.Korth S.Sudarshan. 資料庫系統概念.楊冬青, 李紅燕, 唐世渭等譯. 北京. 機械工業出版社.2012.103-103.

讚賞
微信支付 支付寶
微信 支付寶