我的代码如下
CREATE TRIGGER SETSEASON AFTER UPDATE OR INSERT ON ENROLLMENT
FOR EACH ROW
BEGIN
UPDATE RecCenterMember 
SET ClassSeason=(Select distinct(Season) From Class,Enrollment 
where Class.id=new.Class_ID and ENROLLMENT.MEMBER_ID=NEW.MEMBER_ID)
where ID=new.member_ID;
END;
然后可以创建trigger
但是当我Insert Enrollment 表的时候
时却出错:ORA-04098: trigger 'SETSEASON' is invalid and failed re-validation帮我看看错在哪里了 谢谢了。

解决方案 »

  1.   

    你在做更新操作时,在触发器所在的这个表ENROLLMENT中引用的自身的表在一个表中写触发器,是不能更新和删除自身的表的介个你要记住。
      

  2.   

    貌似关键字new错了吧,应该前面还加冒号:
    还有,我想你Season应该是Class表中的吧,跟Enrollment表是通过哪个字段关联起来的,假设是Class.id
    那么查询中你只需用:new关键字来获取Enrollment表中的值就行了,
    CREATE TRIGGER SETSEASON 
    AFTER UPDATE OR INSERT ON ENROLLMENT
    FOR EACH ROW
    BEGIN
    UPDATE RecCenterMember  
    SET ClassSeason=(Select distinct(Season) From Class where Class.id=:new.Class_ID AND ROWNUM=1)
    where ID=:new.member_ID;
    END;
      

  3.   

    确认Trigger中的这段Script取得的是唯一值:
    SELECT DISTINCT (season)
               FROM CLASS, enrollment
              WHERE CLASS.ID = NEW.class_id
                AND enrollment.member_id = NEW.member_id
      

  4.   


    CREATE TRIGGER SETSEASON before UPDATE OR INSERT ON ENROLLMENT
    FOR EACH ROW
    BEGIN
    UPDATE RecCenterMember  
    SET ClassSeason=(Select distinct Season From Class where Class.id=:new.Class_ID and Class.MEMBER_ID=:new.MEMBER_ID)
    where ID=:new.member_ID;
    END;
      

  5.   

    搞定了CREATE OR REPLACE TRIGGER SETSEASON AFTER UPDATE OR INSERT ON ENROLLMENT
    FOR EACH ROW
    BEGIN
    UPDATE RecCenterMember 
    SET ClassSeason=(Select Season From Class
    where Class.id=:new.Class_ID)
    where ID=:new.member_ID;
    END;
      

  6.   

    对于 触发器中
    insert 引用触发器的触发表的字段 :new.col
    update 引用触发器的触发表的字段 :old.col  ,:new.col
    delete 引用触发器的触发表的字段 :old.col
      

  7.   

    SQL触发器正在学习中,不过帮你顶一下,要给分哈。