Oracle触发器
需求:使用触发器记录对某一表的insert,update,delete操作
创建测试数据库
-- 创建数据库测试表
CREATE TABLE "ZXY"."STUDY" (
"ID" NUMBER(*,0), --id
"NAME" VARCHAR2(20), --名称
"TESTTIME" VARCHAR2(50) --时间
)
创建Sequence
-- 创建Sequence
CREATE SEQUENCE seq_study --序列名即计算器的名称,自拟
INCREMENT BY 1 --每次增加幅度为1
START WITH 1 --起始序号设为1,视具体情况定
NOMAXvalue -- 不设置最大值,或设置最大值:maxvalue 9999
NOCYCLE --一直累加不循环,想循环的话设置cycle
CACHE 10; --设置缓存序列个数,如果系统down掉可能会导致序列不连续,可设置为nocache
创建存储触发器日志表
-- 创建存储触发器日志
CREATE TABLE "ZXY"."TRIGGERLOG_STUDY" (
"NUM" NUMBER(16,0), --存储数据库操作的唯一序列号
"SQLTEXT" VARCHAR2(2000), --存储数据库详细操作
"OPTFLG" VARCHAR2(2000) --存储操作类型
)
创建触发器
-- 创建触发器
create or replace trigger triggerlog_study --创建触发器
after
insert or update or delete --监控insert\update\delete操作
on STUDY
referencing old as old new as new
for each row
declare
NUM int; -- 记录操作唯一序列号
wk_values varchar2(2000); --详细操作
ID VARCHAR2(25); -- 测试数据库字段
NAME VARCHAR2(25);
TESTTIME VARCHAR2(25);
BEGIN
SELECT seq_study.nextval INTO NUM FROM dual; --查询当前的序列号,并赋值给NUM变量
IF :NEW.ID IS null THEN ID := 'null'; ELSE ID := :NEW.ID; END IF;
IF :NEW.NAME IS null THEN NAME := 'null'; ELSE NAME := ''''||:NEW.NAME||''''; END IF;
IF :NEW.TESTTIME IS null THEN TESTTIME := 'null'; ELSE TESTTIME := ''''||:NEW.TESTTIME||''''; END IF;
if inserting THEN -- insert事件
wk_values := 'insert into zxy values('
||ID||','
||NAME||','
||TESTTIME||
');';
INSERT INTO triggerlog_study(num,sqltext,optflg) VALUES(NUM,wk_values,'insert');
elsif updating THEN -- update事件
wk_values := 'delete from zxy where ID = ' || :OLD.ID;
insert into triggerlog_study(num,sqltext,optflg) VALUES(NUM,wk_values,'updating'); -- update先执行delete
SELECT seq_study.nextval INTO NUM FROM dual;
wk_values := '';
wk_values := 'insert into zxy values('
||ID||','
||NAME||','
||TESTTIME||
');';
INSERT INTO triggerlog_study(num,sqltext,optflg) VALUES(NUM,wk_values,'updated'); -- update后执行insert
elsif deleting THEN -- delete事件
wk_values := 'delete from zxy where id = '|| :OLD.ID;
insert into triggerlog_study(num,sqltext,optflg) VALUES(NUM,wk_values,'delete');
end if;
end;
测试
insert测试
--insert测试
insert into study values (1,'zxy','2021-02-02')
update测试
--update测试
update study set name = 'zhou' where name = 'zxy'
delete测试
--delete测试
delete from study where name = 'zhou'
查看触发器存储日志
-- 查看触发器表中存储日志
select * from TRIGGERLOG_STUDY
今天的文章《Oracle系列》Oracle触发器分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/4568.html