IF UPDATING('NIANLEIJI') OR UPDATING('SHANGNIAN') THEN
     UPDATE INDISUM
       SET ZONGLEIJI = :NEW.NIANLEIJI + :NEW.SHANGNIAN
       WHERE "ID" = :OLD."ID";
---可以是可以,但不需要这样写了,你可以改一下,改成:
 IF UPDATING('NIANLEIJI') OR UPDATING('SHANGNIAN') THEN  
     :NEW.ZONGLEIJI = :NEW.NIANLEIJI + :NEW.SHANGNIAN 
 END IF;IF UPDATING('ZONGLEIJI') OR UPDATING('DONGJIE') THEN
      :NEW.KEYONG = :NEW.ZONGLEIJI - :NEW.DONGJIE
  END IF;  
--

解决方案 »

  1.   

    但是,可以对‘NEW’中的数据进行更新吗?
    这样做好像也不行,我试了,但编译不通。
      

  2.   

    将after update 改为 before update,就可以更新NEW的值
    CREATE OR REPLACE TRIGGER "TRI_SUM" BEFORE UPDATE ON "INDISUM" FOR EACH ROW 
    BEGIN
    ....
      

  3.   

    是不是表的字段类型不匹配。
    create sequence SEQ_XT_LOG
    minvalue 1
    maxvalue 9999999999999999999999999999
    start with 1062
    increment by 1
    cache 20
    cycle;
    下面的触发器的作用是:任何时候表中插入或更新了行, 当前的用户名和时间都记录入行中. 并且它保证给出了雇员名称并且薪水是一个正数. CREATE TABLE emp (
        empname text,
        salary integer,
        last_date timestamp,
        last_user text
    );CREATE FUNCTION emp_stamp () RETURNS OPAQUE AS '
        BEGIN
            -- 检查是否给出了 empname 和 salary
            IF NEW.empname ISNULL THEN
                RAISE EXCEPTION ''empname cannot be NULL value'';
            END IF;
            IF NEW.salary ISNULL THEN
                RAISE EXCEPTION ''% cannot have NULL salary'', NEW.empname;
            END IF;        -- 我们必须付帐给谁?
            IF NEW.salary < 0 THEN
                RAISE EXCEPTION ''% cannot have a negative salary'', NEW.empname;
            END IF;        -- 记住何时何人的薪水被修改了
            NEW.last_date := ''now'';
            NEW.last_user := current_user;
            RETURN NEW;
        END;
    ' LANGUAGE 'plpgsql';CREATE TRIGGER emp_stamp BEFORE INSERT OR UPDATE ON emp
        FOR EACH ROW EXECUTE PROCEDURE emp_stamp();
      

  4.   

    在ID不被修改的情况下:
    1.把after 换成 before
    2.因为数值之间有关联,所以也不必判断那个被修改了,全部修正一遍省事。
    CREATE OR REPLACE TRIGGER "TRI_SUM" before
    UPDATE ON "INDISUM" FOR EACH ROW BEGIN
          :new.NIANLEIJI = :NEW.JIAFEN - :NEW.YONGFEN - :NEW.JIANFEN
          :new.PAIXU = :NEW.JIAFEN + :NEW.YONGFEN - :NEW.JIANFEN
          :new.ZONGLEIJI = :NEW.NIANLEIJI + :NEW.SHANGNIAN
          :new.KEYONG = :NEW.ZONGLEIJI - :NEW.DONGJIE 
    END TRI_SUM;