一、old和new在Oracle中不区分大小写;
二、old和new可以用在declare中也可以用在begin里的sql语句;(只会在begin中的sql语句里用)
三、old表示插入之前的值,new表示新插入的值;
(old用在删除和修改,new用在添加和修改)(但是用delete new值也没有报错,不知道怎么回事)
create or replace trigger trigger_name --触发器名不能过长,否则报错:ORA-00972:标识符过长
before insert or update of colunm1,column2,、、、
on table_name
for each row --行级触发器,一般表记的会报错,没有深入研究
declare --声明参数
pragma autonomous_transaction; --自治事务
parameter_name 参数类型; --参数
begin
if inserting then
insert into table_name values(:new.字段名1,:new.字段名2,、、、);
elsif updating then
update table_name set 表字段名=:new.字段名,、、、 where 字段名=:new.字段名;
end if;
commit; --自治事务的提交,若没有自治事务,触发器是不允许有commit的
end;
注意:
sql语句中的表与触发器的表不相同,如果相同且不加自治事务会导致报错:ORA-04091:表XXX发生了变化,触发器/函数不能读它;
即使添加了自治事务,要是当表的某个字段发生变化,对另一张表进行操作之后,又对该有触发器的表字段进行修改,
也会报错:ORA-00060:等待资源时检测到死锁;