2012-08-13 94 views
1

我目前是Firebird中的新成員,尤其是觸發器。通常我手動在腳本中完成此操作,但使用觸發器創建它真的很吸引人。火鳥觸發器:修改值和插入記錄

請讓我先解釋我的表格。

 
***STOCK*** 
CODE 
NAME 
TOTAL 
GOOD 
BROKEN 
SERVICE 
***DETAIL*** 
ID 
STOCK_CODE 
SERIAL 
***BROKEN*** 
DETAIL_ID 
MARK 
***SERVICE*** 
DETAIL_ID 
START_DATE 
END_DATE 
COST 
***LOGS*** 
DETAIL_ID 
MARK 
START_DATE 
END_DATE 
COST 

現在我的問題:

  1. 成壞了怎麼修改STOCK.GOOD和STOCK.BROKEN值後插入一個新的記錄?那將是:STOCK.GOOD-1,STOCK.BROKEN + 1。

  2. 如何刪除BROKEN和SERVICE中的所有記錄到LOGS中,然後刪除SERVICE中的當前記錄?

我希望我的問題能被接受。

非常感謝您提前。

問候, 阿卜迪

+0

對不起,我是指AFTER INSERT,而不是BEFORE INSERT。 – frozenade 2012-08-14 01:47:02

+0

你用Delphi嗎? – 2012-08-14 11:31:42

回答

0

下面是兩個觸發器:

CREATE TRIGGER bi_broken FOR broken 
    BEFORE INSERT 
    POSITION 0 
AS 
BEGIN 
    UPDATE stock SET good = good - 1, broken = broken + 1 
    WHERE code = (SELECT d.stock_code 
     FROM detail d WHERE d.id = NEW.detail_id); 
END 


CREATE TRIGGER bd_service FOR service 
    BEFORE DELETE 
    POSITION 0 
AS 
BEGIN 
    INSERT INTO logs (detail_id, mark, start_date, end_date, cost) 
    SELECT detail_id, (SELECT b.mark FROM broken b WHERE b.detail_id = OLD.detail_id), 
    start_date, end_date, cost 
    FROM service 
    WHERE detail_id = OLD.detail_id; 
END 

順便問一下,是什麼原因把標記成一個單獨的表?它屬於STOCK,不是嗎?

+0

是的,你是對的。它應該屬於STOCK。 :)但是,有一個問題。 BROKEN上的DETAIL_ID與DETAIL上的ID相同。它應該是WHERE code = NEW.code_id。但是如何? – frozenade 2012-08-14 08:05:20

+0

我已更正觸發器。 – 2012-08-14 13:25:07

+0

我很抱歉,但我真的是新的觸發器。 'd'和'b'是什麼意思? d.id,b.detail_id等。是否應該是表名?例如STOCK.code,DETAIL.id?謝謝。 – frozenade 2012-08-14 16:42:45