Oracle 甲骨文触发器从不开火

Oracle 甲骨文触发器从不开火,oracle,triggers,Oracle,Triggers,我有以下表格 create table Surveys ( survey_id int, cid int, num_submitted int, sum_q1 int, sum_q2 int, sum_q3 int, sum_q4 int, constraint pk_survey primary key (survey_id), constraint fk_courses foreign key (cid)

我有以下表格

create table Surveys ( 
    survey_id int, 
    cid int, 
    num_submitted int, 
    sum_q1 int, 
    sum_q2 int, 
    sum_q3 int, 
    sum_q4 int,
    constraint pk_survey primary key (survey_id),
    constraint fk_courses foreign key (cid) 
        references Courses(cid)
);

create table Surveydata ( 
    survey_id int,  
    sid int,
    submit_time date,
    q1 int, 
    q2 int, 
    q3 int, 
    q4 int, 
    q5_str varchar(250),
    constraint pk_survey_data primary key (survey_id, sid),
    constraint fk_sdata_surveys foreign key (survey_id) 
        references Surveys(survey_id),
    constraint fk_sdata_students foreign key (sid) 
        references Students(sid)
);
扳机呢

CREATE OR REPLACE TRIGGER survey_data_trigger
    AFTER INSERT OR UPDATE OR DELETE ON SURVEYDATA
    FOR EACH ROW

    BEGIN
        IF INSERTING THEN
            UPDATE Surveys SET
                num_submitted = num_submitted + 1, 
                sum_q1 = sum_q1 + :new.q1,
                sum_q2 = sum_q2 + :new.q2,
                sum_q3 = sum_q3 + :new.q3,
                sum_q4 = sum_q4 + :new.q4
            WHERE
                survey_id = :new.survey_id;
        END IF;

        IF UPDATING THEN
            IF(:new.survey_id = :old.survey_id) THEN
                UPDATE Surveys SET
                    sum_q1 = sum_q1 - :old.q1 + :new.q1,
                    sum_q2 = sum_q2 - :old.q2 + :new.q2,
                    sum_q3 = sum_q3 - :old.q3 + :new.q3,
                    sum_q4 = sum_q4 - :old.q4 + :new.q4
                WHERE
                    survey_id = :new.survey_id;
            ELSE
                UPDATE Surveys SET
                    num_submitted = num_submitted + 1, 
                    sum_q1 = sum_q1 + :new.q1,
                    sum_q2 = sum_q2 + :new.q2,
                    sum_q3 = sum_q3 + :new.q3,
                    sum_q4 = sum_q4 + :new.q4
                WHERE
                    survey_id = :new.survey_id; 

                UPDATE Surveys SET
                    num_submitted = num_submitted - 1, 
                    sum_q1 = sum_q1 - :old.q1,
                    sum_q2 = sum_q2 - :old.q2,
                    sum_q3 = sum_q3 - :old.q3,
                    sum_q4 = sum_q4 - :old.q4
                WHERE
                    survey_id = :old.survey_id;
                END IF;

        END IF;

        IF DELETING THEN
            UPDATE Surveys SET
                num_submitted = num_submitted - 1, 
                sum_q1 = sum_q1 - :old.q1,
                sum_q2 = sum_q2 - :old.q2,
                sum_q3 = sum_q3 - :old.q3,
                sum_q4 = sum_q4 - :old.q4
            WHERE
                survey_id = :old.survey_id;
        END IF;
    END;
/
当我发布

INSERT INTO Surveydata VALUES(1, 1, SYSDATE, 5, 5, 5, 5, 'Great teacher!');

触发器不会触发并更新此Surveydata记录指向的测量记录。我在这里做错了什么?

您的触发器只有在有效的情况下才会触发-也就是说,它是在没有错误的情况下创建的,并且此后没有以阻止它成功重新编译的方式失效-并且是启用的。您可以在
user\u objects
表中检查有效性:

select status
from user_objects
where object_type = 'TRIGGER' and object_name = 'SURVEY_DATA_TRIGGER';
select text
from user_errors
where type = 'TRIGGER' and name = 'SURVEY_DATA_TRIGGER'
order by sequence;
如果这表明触发器是无效的,您可以在
用户错误表中看到它有哪些错误:

select status
from user_objects
where object_type = 'TRIGGER' and object_name = 'SURVEY_DATA_TRIGGER';
select text
from user_errors
where type = 'TRIGGER' and name = 'SURVEY_DATA_TRIGGER'
order by sequence;
。。。然后用正确的代码重新创建它。但由于,它可能对您有效,因此被禁用,您可以通过以下方式进行检查:

select status
from user_triggers
where trigger_name = 'SURVEY_DATA_TRIGGER';
如果这表示它已禁用
,则可以通过以下方式启用它:

alter trigger survey_data_trigger enable;
但是,触发器创建代码不会将其创建为禁用状态,因此,如果它处于该状态,则可能有另一个步骤显式禁用它。我想不出任何东西会自动禁用一个新的触发器,除非你有一个DDL触发器正在改变所有新创建的触发器的状态,但是你可能知道这一点,并且你可以很容易地测试它。看起来更有可能是你自己禁用了它


*嗯,有一个隐藏的init参数,
\u system\u trig\u enabled
,这将使它被创建为禁用,但设置该参数似乎也不太可能。

触发器编译成功了吗,它启用了吗?(您可以签入
user\u对象
user\u触发器
)提交的
num\u和
sum\u q1
<假设您从非空值开始,这可能是Luke暗示的(我猜?)。@AlexPoole触发器编译并安装成功。在user_对象和user_触发器中有一个条目。@Luke Woodward在插入之前和之后,调查中的值都设置为0。我不确定为什么在创建时禁用它。触发器用于一个类项目,并在我所在大学管理的Oracle实例上运行。ALTERTRIGGER语句成功了。再次感谢你的帮助,亚历克斯。