具备某些条件,由Database自动Execute的一些DML 操作行为。

一、语句触发器

语句Trigger针对整个表,作用整个表操作。一般用于Permissions判断之类的。常用行Trigger。

Syntax结构

Create trigger 触发器名称
Before/after 触发动作
On 作用对象

Trigger谓词:INSERTING、UPDATING、DELETING

示例1:

向t_book插入Data之前判断,用户是否有PermissionsExecute查询操作。

Create语句Trigger:

create trigger tr_book
before insert 
on t_book
begin
    if user!='hello' then
      raise_application_error(-20001,'权限不足');
    end if;
end;

Execute插入Data:

insert into t_book values(6,'ooo',2,68,'男');

提示结果:

image-20221207201704482

修改Trigger:

create or replace trigger tr_book
before insert
on t_book
begin
    if user!='SCOTT' then
      raise_application_error(-20001,'权限不足');
    end if;
end;

重新Execute插入Data即可插入。

insert into t_book values(6,'ooo',2,68,'男');

查询结果:

image-20221207202028186

注意:多个可以用or连接

Example:

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:插入、修改、删除之前判断是否有Permissions。

进行插入、修改、删除操作:

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增删改之后记录Logging到t_book_log表中。

编写行Trigger:

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;

分别Execute增删改操作:

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。

二、行触发器

行Trigger针对行记录。一般用于记录操作Logging。

Syntax结构

Create trigger 触发器名称
Before/after 触发动作
For each row
On 作用对象

只是语句Trigger多了一个For each row

示例1:

当修改t_book增加一条Data时,t_booktype对应的Type名称就改为t_book中新增的书名作为Type名。

为插入Data前t_book\t_booktype表Data:

image-20221207213658342

编写行Trigger:

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;

注意:

Trigger内置变量

:old 表示旧行记录。

:new 表示新插入行记录。

Execute插入操作:

insert into t_book values(8,'新增sql秘籍',2,55,'男');

重新View2表Data:

image-20221207214016372

可以看到,新增Data行8后,对应的typeid=2的Type名称改为书名了。

示例2:

当删除t_book一条Data后,将t_booktype中对应Type名称,改为被删除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.字段,Get删除记录的字段信息。

t_book、t_booktype表原始Data:

image-20221207214845621

删除操作:

delete from t_book where id=7;

View删除后t_book、t_booktype表Data:t_book中id=7记录已被删除。t_booktype中typename=www了。

image-20221207215216074

注意:一般行Trigger用的较多。

三、触发器禁用和开启

禁用Trigger

alter trigger 触发器名称 disable

启用Trigger

alter trigger 触发器名称 enable

四、删除触发器

drop trigger 触发器名称;

五、修改触发器

修改和其它修改Views、Trigger、Stored Procedures一样。

create or replace

只需要加上or replace