《Oracle系列》Oracle触发器

《Oracle系列》Oracle触发器需求:使用触发器记录对某一表的insert,update,delete操作。

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触发器分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/4568.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注