2008-09-06 88 views
10

我一直聽說有關觸發器,我有幾個問題。
什麼是觸發器?
我該如何設置它們?
除了典型的SQL內容之外,還有什麼需要注意的地方嗎?設置MySQL觸發器

回答

15

觸發器允許您在某些事件發生時執行數據庫中的函數(例如,插入到表中)。

我無法對mysql進行具體評論。

注意事項:觸發器可以非常誘人,當你第一次使用它們時,它們看起來像是各種問題的靈丹妙藥。但是,他們會發生「魔術」的事情,如果你不知道數據庫裏面的事情,看起來真的很奇怪(例如插入其他表格,輸入數據改變等)。在實現事件作爲觸發器之前,我會認真考慮在模式周圍強制使用API​​(最好在數據庫中,但在外部如果不行)。

有些事情我還是使用觸發器的

  • 「DATE_CREATED」和「date_last_edited」領域
  • 保持跟蹤插入「ID」的(在Oracle中,那裏沒有汽車id字段)
  • 飼養改變歷史

事情你不想使用觸發器,

  • 業務規則/邏輯
  • 任何它連接的數據庫之外(例如Web服務調用)
  • 訪問控制
  • 任何這不是事務性的(什麼,你在做觸發必須能夠與回滾交易)
0

觸發器是一個指定的數據庫對象,它與一個表關聯,並在表發生特定事件時被激活。

創建觸發器:

CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE; 


即使我回答了這個部分的另一個問題仍然有效。

1

dev.mysql.com,觸發器是

...指定的數據庫對象,它是一個與表有關 那就是 激活當特定事件 爲表發生。

創建它們的語法is also documented at that site

簡而言之,

CREATE 
    [DEFINER = { user | CURRENT_USER }] 
    TRIGGER trigger_name trigger_time trigger_event 
    ON tbl_name FOR EACH ROW trigger_stmt 

,他們提供了一個例子:

CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); 
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount; 

你至少需要通過all the restrictions on stored functions遵守。 您將無法鎖定表格,更改視圖或修改觸發觸發器的表格。也觸發may cause replication problems

0

這個問題是舊的,其他的答案都非常好,但由於用戶被問及應採取預防措施,我想補充一點:

  • 如果在複雜環境中使用複製,請不要大量使用觸發器,也不要從觸發器中調用存儲過程。
  • 觸發器在MySQL中很慢。
  • 您不能在觸發器中使用某些SQL語句。有些陳述是允許的,但應該避免,如LOCK。一般規則是:如果你不完全理解你在做什麼的含義,你不應該這樣做。
  • 觸發器會導致無限循環,所以要小心。