Oracle 触发器
具备某些条件,由数据库自动执行的一些DML 操作行为。
一、语句触发器
语句触发器针对整个表,作用整个表操作。一般用于权限判断之类的。常用行触发器。
语法结构
Create trigger 触发器名称
Before/after 触发动作
On 作用对象
触发器谓词:INSERTING、UPDATING、DELETING
示例1:
向t_book插入数据之前判断,用户是否有权限执行查询操作。
创建语句触发器:
create trigger tr_book
before insert
on t_book
begin
if user!='hello' then
raise_application_error(-20001,'权限不足');
end if;
end;
执行插入数据:
insert into t_book values(6,'ooo',2,68,'男');
提示结果:
修改触发器:
create or replace trigger tr_book
before insert
on t_book
begin
if user!='SCOTT' then
raise_application_error(-20001,'权限不足');
end if;
end;
重新执行插入数据即可插入。
insert into t_book values(6,'ooo',2,68,'男');
查询结果:
注意:多个可以用or连接
示例:
create or replace trigger tr_book
before insert or update or delete
on t_book
begin
if user!='hello' then
raise_application_error(-20001,'权限不足');
end if;
end;
before insert or update or delete:插入、修改、删除之前判断是否有权限。
进行插入、修改、删除操作:
insert into t_book values(7,'occcc',2,88,'男');
delete from t_book where id=1;
update t_book set price=89 where id=1;
此时都提示:
示例2:
在对t_book增删改之后记录日志到t_book_log表中。
编写行触发器:
create or replace trigger tr_book_log
after insert or update or delete
on t_book
begin
if inserting then
insert into t_book_log values(user, 'insert', sysdate);
else if updating then
insert into t_book_log values(user, 'upate', sysdate);
else if deleting then
insert into t_book_log values(user, 'delete', sysdate);
end if;
end if;
end if;
end;
分别执行增删改操作:
insert into t_book values(8,'866',2,88,'男');
delete from t_book where id=8;
update t_book set price=88 where id=1;
此时t_book_log表中已经有记录了。
select * from t_book_log;
查询结果:
注意:判断增删改用的不是insert、delte、update,而是inserting、updating、deleting。
二、行触发器
行触发器针对行记录。一般用于记录操作日志。
语法结构
Create trigger 触发器名称
Before/after 触发动作
For each row
On 作用对象
只是语句触发器多了一个For each row
示例1:
当修改t_book增加一条数据时,t_booktype对应的类型名称就改为t_book中新增的书名作为类型名。
为插入数据前t_book\t_booktype表数据:
编写行触发器:
create or replace trigger tr_bookandtype
after insert
on t_book
for each row
begin
update t_booktype set booktypename=:new.bookname where id=:new.type_id;
end;
注意:
触发器内置变量
:old 表示旧行记录。
:new 表示新插入行记录。
执行插入操作:
insert into t_book values(8,'新增sql秘籍',2,55,'男');
重新查看2表数据:
可以看到,新增数据行8后,对应的typeid=2的类型名称改为书名了。
示例2:
当删除t_book一条数据后,将t_booktype中对应类型名称,改为被删除t_book记录中书名。
create or replace trigger tr_bookdeltype
after delete
on t_book
for each row
begin
update t_booktype set booktypename=:old.bookname where id=:old.type_id;
end;
注意:记录被删除了,所以可以用内置对象old.字段,获取删除记录的字段信息。
t_book、t_booktype表原始数据:
删除操作:
delete from t_book where id=7;
查看删除后t_book、t_booktype表数据:t_book中id=7记录已被删除。t_booktype中typename=www了。
注意:一般行触发器用的较多。
三、触发器禁用和开启
禁用触发器
alter trigger 触发器名称 disable
启用触发器
alter trigger 触发器名称 enable
四、删除触发器
drop trigger 触发器名称;
五、修改触发器
修改和其它修改视图、触发器、存储过程一样。
create or replace
只需要加上or replace
评论 (0)