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语句成功了。再次感谢你的帮助,亚历克斯。