Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Triggers Firebird触发器:修改值&;插入记录_Triggers_Firebird - Fatal编程技术网

Triggers Firebird触发器:修改值&;插入记录

Triggers Firebird触发器:修改值&;插入记录,triggers,firebird,Triggers,Firebird,我目前在Firebird是新手,尤其是在trigger。通常我在脚本中手动完成这项工作,但我非常喜欢用触发器创建它 请让我先解释一下我的桌子 ***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

我目前在Firebird是新手,尤其是在trigger。通常我在脚本中手动完成这项工作,但我非常喜欢用触发器创建它

请让我先解释一下我的桌子

***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 ***股票*** 代码 名称 全部的 好 破碎的 服务 ***细部*** 身份证件 股票代码 电视连续剧 ***破碎的*** 详细信息 做记号 ***服务*** 详细信息 开始日期 结束日期 成本 ***日志*** 详细信息 做记号 开始日期 结束日期 成本 现在我的问题是:

  • 如何在将新记录插入破记录后修改STOCK.GOOD和STOCK.break值?这将是:股票。良好-1,股票。破碎+1

  • 在删除服务中的当前记录之前,如何将断开和服务中的所有记录插入日志中

  • 我希望我的问题能被接受

    事先非常感谢

    问候,,
    以下是两个触发器:

    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
    

    顺便问一下,把马克放在一个单独的表格里的原因是什么?它属于股票,不是吗?

    对不起,我是说在插入之后,而不是插入之前。是的,你说得对。它应该属于股票。:)但是,有一个问题。断开上的详细信息\u ID与详细信息上的ID等效。应该是code=NEW.code\u id.但是怎么做呢?对不起,我对触发器真的很陌生。“d”和“b”是什么意思?d、 id、b.detail\u id等。是否应该是表名?e、 g、库存代码、详细信息、id?谢谢。哦,我明白了。直接使用表名可以吗?为什么?别名用于在同一个表多次涉及的查询中区分表。感谢您的帮助,Andrei先生。我真的很感激。:)