触发器
触发器是数据库中的一种特殊对象,它可以在数据库中的某个事件发生时自动执行一系列的操作。触发器通常与表相关联,当表中的数据发生变化时,触发器可以被激活并执行相应的操作。
触发器可以用于实现以下功能:
数据完整性约束:通过在触发器中定义一些条件和规则,可以确保数据的完整性和一致性。例如,在插入或更新数据之前,可以使用触发器进行数据验证。
数据同步:当一个表中的数据发生变化时,可以使用触发器将相关的数据同步到其他表中。这样可以确保数据的一致性。
日志记录:通过触发器,可以在数据库中自动记录某些操作的日志信息,如插入、更新或删除数据等。
自动计算字段:通过触发器,可以在插入或更新数据时自动计算某些字段的值,而不需要手动进行计算。
触发器通常包括以下几个要素:
事件:触发器所关联的事件,如插入、更新或删除操作。
触发条件:触发器被激活的条件,如满足某个特定的条件或规则。
触发动作:触发器被激活后要执行的操作,如插入、更新或删除数据等。
触发器可以在数据库中使用,具体的语法和用法可能会因数据库管理系统而有所不同。常见的数据库管理系统如MySQL、Oracle和SQL Server都支持触发器的使用。
oracle dml触发器语法
语法如下:
create [or replace] [EDITIONABLE|NONEDITIONABLE] trigger [schema_name.]trigger_name { BEFORE | AFTER} {INSERT|UPDATE|DELETE} ON table_name [ FOR [ EACH ] { ROW | STATEMENT } ] plsqlblock
drop trigger [schema_name.]trigger_name
{ BEFORE | AFTER} {INSERT|UPDATE|DELETE} 表示触发器触发的事件和事件
before insert :插入前触发
before update: 更新前触发
before delete: 删除前触发
after insert: 插入后触发
after update: 跟新后触发
after delete: 删除后触发
FOR [ EACH ] { ROW | STATEMENT } ]
for each statement 每个语句触发一次,没有命中行也触发。
for each row 每行记录触发记录,没有命中行不触发。
使用示例:
create table test_tb_trigger(a int,b numeric, c varchar(20));
create trigger test_oracle_trigger_wuyf before insert
on test_tb_trigger
begin
dbms_output.put_line('before insert');
end;
/
create trigger test_oracle_trigger_wuyf_after after insert
on test_tb_trigger
declare
a numeric(38,0);
begin
dbms_output.put_line('after insert');
end;
/
truncate table test_tb_trigger;
insert into test_tb_trigger SELECT 1,2,3 FROM dual UNION SELECT 1,3,4 FROM dual;
select * from test_tb_trigger;
update test_tb_trigger set a = 2, c = 4 where a = 0;
select * from test_tb_trigger;
update test_tb_trigger set a = 2, c = 4 where a = 1;
select * from test_tb_trigger;
delete from test_tb_trigger where a = 2;
select * from test_tb_trigger;
delete from test_tb_trigger;
select * from test_tb_trigger;
lightdb支持
24.1之前的版本,只支持通过pg的语法创建触发器。24.1开始支持使用oracle语法创建触发器。以上示例运行结果如下:
lightdb@oracle=# create table test_tb_trigger(a int,b numeric, c varchar(20));
CREATE TABLE
lightdb@oracle=# create trigger test_oracle_trigger_wuyf before insert
lightdb@oracle-# on test_tb_trigger
lightdb@oracle-# begin
lightdb@oracle$# dbms_output.put_line('before insert');
lightdb@oracle$# end;
lightdb@oracle$# /
CREATE TRIGGER
lightdb@oracle=# create trigger test_oracle_trigger_wuyf_after after insert
lightdb@oracle-# on test_tb_trigger
lightdb@oracle-# declare
lightdb@oracle$# a numeric(38,0);
lightdb@oracle$# begin
lightdb@oracle$# dbms_output.put_line('after insert');
lightdb@oracle$# end;
lightdb@oracle$# /
CREATE TRIGGER
lightdb@oracle=# truncate table test_tb_trigger;
TRUNCATE TABLE
lightdb@oracle=# insert into test_tb_trigger SELECT 1,2,3 FROM dual UNION SELECT 1,3,4 FROM dual;
before insert
after insert
INSERT 0 2
lightdb@oracle=# select * from test_tb_trigger;
a | b | c
---+---+---
1 | 2 | 3
1 | 3 | 4
(2 rows)
lightdb@oracle=# update test_tb_trigger set a = 2, c = 4 where a = 0;
UPDATE 0
lightdb@oracle=# select * from test_tb_trigger;
a | b | c
---+---+---
1 | 2 | 3
1 | 3 | 4
(2 rows)
lightdb@oracle=# update test_tb_trigger set a = 2, c = 4 where a = 1;
UPDATE 2
lightdb@oracle=# select * from test_tb_trigger;
a | b | c
---+---+---
2 | 2 | 4
2 | 3 | 4
(2 rows)
lightdb@oracle=# delete from test_tb_trigger where a = 2;
DELETE 2
lightdb@oracle=# select * from test_tb_trigger;
a | b | c
---+---+---
(0 rows)
lightdb@oracle=# delete from test_tb_trigger;
DELETE 0
lightdb@oracle=# select * from test_tb_trigger;
a | b | c
---+---+---
(0 rows)
368

被折叠的 条评论
为什么被折叠?



