Oracle 触发器

admin
2022-12-07 / 0 评论 / 120 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年12月07日,已超过498天没有更新,若内容或图片失效,请留言反馈。

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,'男');

提示结果:

image-20221207201704482

修改触发器:

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,'男');

查询结果:

image-20221207202028186

注意:多个可以用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;

此时都提示:

image-20221207202838286

示例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;

查询结果:

image-20221207210829768

注意:判断增删改用的不是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表数据:

image-20221207213658342

编写行触发器:

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表数据:

image-20221207214016372

可以看到,新增数据行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表原始数据:

image-20221207214845621

删除操作:

delete from t_book where id=7;

查看删除后t_book、t_booktype表数据:t_book中id=7记录已被删除。t_booktype中typename=www了。

image-20221207215216074

注意:一般行触发器用的较多。

三、触发器禁用和开启

禁用触发器

alter trigger 触发器名称 disable

启用触发器

alter trigger 触发器名称 enable

四、删除触发器

drop trigger 触发器名称;

五、修改触发器

修改和其它修改视图、触发器、存储过程一样。

create or replace

只需要加上or replace

2

评论 (0)

取消