2012-08-13 45 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