1 触发器简介
- 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。
- 因此触发器不需要人为的去调用,也不能调用。
- 触发条件在定义的时候就已经设定好了。
触发器可以分为语句级触发器和行级触发器:
详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发。而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次。
- 在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。这个就是删除表的操作就是触发器执行的条件了。
- 在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行。
2 触发器语法
触发器的语法:
create [or replace] trigger trigger_name trigger_time trigger_event
on table_name
[for each row]
begin
pl/sql语句
end
其中:
1.trigger_name
:触发器对象的名称。由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
2.trigger_time
:指明触发器何时执行,该值可取:
- before:表示在数据库动作之前触发器执行;
- after:表示在数据库动作之后触发器执行。
3.trigger_event
:指明哪些数据库动作会触发此触发器:
- insert:数据库插入会触发此触发器;
- update:数据库修改会触发此触发器;
- delete:数据库删除会触发此触发器。
表 名:数据库触发器所在的表。
4.for each row
:对表的每一行触发器执行一次。如果没有这一选项,则只对整个表执行一次。
3 触发器功能
触发器能实现如下功能:
1、 允许/限制对表的修改
2、 自动生成派生列,比如自增字段
3、 强制数据一致性
4、 提供审计和日志记录
5、 防止无效的事务处理
6、 启用复杂的业务逻辑
4 创建触发器
1.下面的触发器在更新表tb_emp之前触发,目的是不允许在周末修改表:
create or replace trigger auth_secure before insert or update or delete
on tb_emp
begin
IF(to_char(sysdate,'DY')='星期日') THEN
RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表tb_emp');
END IF;
end;
2.这是数据库的加固项里面的其中一项,使用触发器来记录数据库登入行为
- 创建表
create table sys.logon_table
(
user_id varchar2(50),
user_name varchar2(50),
ip_address varchar2(50),
host varchar2(30),
logon_day date,
logon_time varchar2(10)
);
- 创建触发器
create trigger SYS.TRI_LOGON after logon on database
begin
insert into logon_table values
(
user,
SYS_CONTEXT('USERENV', 'SESSION_USER'),
SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
SYS_CONTEXT('USERENV', 'HOST'),
SYSDATE,
TO_CHAR(SYSDATE,'hh24:mi:ss')
);
END;
/
5 开启与关闭触发器
- 查看触发器内容
SQL> select TRIGGERING_EVENT,table_name from user_triggers where trigger_name='TRI_LOGON';
- 禁用触发器
SQL> alter trigger SYS.TRI_LOGON disable;
- 开启触发器
SQL> alter trigger SYS.TRI_LOGON enable;