在插入或更新-软件,计算或业务之前,我需要检查变量(主题名称)并确保它是以下变量之一。
这是为Uni所做的一件工作,讲师很糟糕,因此不胜感激。
我有以下代码,但它似乎不起作用。
create or replace trigger subject_name_check
before insert or update on Student
FOR EACH ROW
WHEN (NEW.SUBJECT <> 'Software' or 'Computing' or 'Business')
begin
DBMS_OUTPUT.PUT_LINE('INVALID INPUT');
end;
答案 0 :(得分:4)
您正在做的只是打印一条消息,该消息可能已配置也可能未配置为客户端。您不会阻止插入操作完成。
您可以提出一个例外:
create or replace trigger subject_name_check
before insert or update on Student
FOR EACH ROW
WHEN (NEW.SUBJECT NOT IN ('Software', 'Computing', 'Business'))
begin
RAISE_APPLICATION_ERROR(-20001, 'INVALID INPUT');
end;
我也固定了比较逻辑-您无法以您尝试的方式将一件事与其他事物进行比较。
快速演示:
create table student (subject varchar2(20));
create or replace trigger subject_name_check
before insert or update on Student
FOR EACH ROW
WHEN (NEW.SUBJECT NOT IN ('Software', 'Computing', 'Business'))
begin
RAISE_APPLICATION_ERROR(-20001, 'INVALID INPUT');
end;
/
insert into student (subject) values ('Software');
1 row inserted.
insert into student (subject) values ('Spanish');
ORA-20001: INVALID INPUT
ORA-06512: at "MYSCHEMA.SUBJECT_NAME_CHECK", line 2
但这确实应该通过检查约束而不是触发器来完成:
drop trigger subject_name_check;
alter table student add (
constraint subject_name_check check (
subject in ('Software', 'Computing', 'Business'))
);
insert into student (subject) values ('Computing');
1 row inserted.
insert into student (subject) values ('Physics');
ORA-02290: check constraint (MYSCHEMA.SUBJECT_NAME_CHECK) violated
...甚至在与具有有效主题列表的另一个表建立外键关系时甚至更好。