十一、触发器
- 数据库 触发器,是一个与表相关联的、存储的
PL/SQL
程序。- 每当一个特定的数据操作语句(
insert
、update
、delete
)在指定的表上发出时,Oracle 自动地执行 触发器 中定义的 语句序列。
- 触发器可用于:
- 数据确认。
- 实施复杂的安全性检查。
- 做审计,跟踪表上所做的数据操作等。
- 数据的备份和同步。
- 触发器分类:
- 前置触发器(
BEFORE
)。- 后置触发器(
AFTER
)。
1. 创建触发器
CREATE [OR REPLACE] TRIGGER '触发器名'
BEFORE | AFTER -- 触发时间。
[DELETE] [[OR]INSERT] [[OR]UPDATE [OF '列名']] -- 触发事件。
ON '表名'
[FOR EACH ROW] [WHEN('条件')]
declare
-- ...声明变量
begin
'PLSQL块'
End;
-- `FOR EACH ROW`:指定对于受触发事件影响的每一行,都要激活触发器的动作。
FOR EACH ROW
:
是标注此触发器是 行级触发器、语句级触发器。- 在触发器中 触发语句 与 伪记录变量 的值。
- 在触发器创建中,每个表每个事件每次只允许一个触发器。
- 一个表最多支持 6 个触发器。
触发语句 | :old | :new |
---|---|---|
Insert | 所有字段都是空(null) | 将要插入的数据 |
update | 更新以前该行的值 | 更新后的值 |
delete | 删除以前该行的值 | 所有字段都是空(null) |
CREATE TRIGGER `test`.`customers_insert_trigger`
AFTER
INSERT
ON `test`.`customers`
FOR EACH ROW SET @str = 'one customers added!'
CREATE TRIGGER `test`.`customers_insert_trigger`
AFTER
INSERT
ON `test`.`customers`
FOR EACH ROW SET @str = NEW.cus_id;
-- NEW:虚拟表,用来访问新插入的行(在`INSERT、UPDATE`触发器,不区分大小写)。
-- OLD:虚拟表,用来访问被删除的行(在`DELETE、UPDATE`触发器,不区分大小写)。
CREATE TRIGGER `test`.`customers_update_trigger`
BEFORE
UPDATE
ON `test`.`customers`
FOR EACH ROW
SET NEW.cus_address = OLD.cus_contact;
2. 删除触发器
DROP TRIGGER [IF EXISTS] '触发器名';
DROP TRIGGER IF EXISTS `test`.`customers_insert_trigger`;
二、案例
1. 前置触发器
- 需求:当用户输入 本月累计表数 后,自动计算出 本月使用数。
create or replace trigger 'tri_account_update_num1'
before
update of 'num1'
on 't_account'
for each row
declare
begin
:new.usenum: = :new.num1 - :new.num0;
end;
-- num0=95076、num1=99324、usenum=4248
UPDATE T_ACCOUNT
SET num1 = 100000
WHERE ID = 66;
-- num0=95076、num1=100000、usenum=4924
2. 后置触发器
- 需求:当用户修改了 业主信息表的数据 时,记录 修改前与修改后 的值。
-- 创建业主修改日志表,用于记录业主更改前后的名称。
create table `t_owners_log`
(
updatetime date,
ownerid number,
oldname varchar2(30),
newname varchar2(30)
);
-- 创建后置触发器,自动记录业主更改前后日志
create trigger 'tri_owners_log'
after
update of 'name'
on 't_owners'
for each row
declare
begin
insert into 't_owners_log'
values (sysdate, :old.id, :old.name, :new.name);
end;
- 测试。
-- 更新数据
update t_owners set name = 'wy' where id = 11;
commit;
-- 查询日志表
select * from `t_owners_log`;
-- 2022-04-26 16:48:02 11 王岩 wy
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36214.html