在Oracle数据库中,用于数据备份的触发器及表结构
对当前的数据表的插入、删除、更新等进行记录,并把操作日期、操作者、原来数据、现在数据都作为备份,以便于在当前备出现问题的时候能够给以恢愎。
当然,最好就是把备份表放在不同的磁盘上不同的数据库中:
1、建立用于数据备份及操作记录的表:
CREATE TABLE
AUD_PRGAMD1
(
W_ROWID
VARCHAR2
(
50
),
--
行
ID
W_ACTION
VARCHAR2
(
1
),
--
操作
DTTM
DATE
,
--
操作日期
OPUSER
VARCHAR2
(
30
),
--
操作者
B$CODE
VARCHAR2
(
10
),
--
原表中的
CODE
A$CODE
VARCHAR2
(
10
),
--
现表中的
CODE
B$FTY
VARCHAR2
(
1
),
--
原表中的
FTY
A$FTY
VARCHAR2
(
1
)
–
现表中的
FTY
);
2、建立实际数据表:
create table
prgamd
(
code
varchar2
(
20
),
fty
varchar2
(
20
)
)
2、创建自动备份触发器:
CREATE or replace TRIGGER
AUD_PRGAMD_TRIGGER
AFTER INSERT OR UPDATE OR DELETE
ON
PRGAMD
FOR EACH ROW
DECLARE
V_ROWID
VARCHAR2
(
50
);
V_ACTION
VARCHAR2
(
1
);
V_OPUSER
VARCHAR
(
30
)
:
=
'UNKNOW'
;
BEGIN
IF
INSERTING
THEN
V_ROWID:
=
:NEW
.
ROWID
;
V_ACTION:
=
'I'
;
ELSIF
UPDATING
THEN
V_ROWID:
=
:NEW
.
ROWID
;
V_ACTION:
=
'U'
;
ELSIF
DELETING
THEN
V_ROWID:
=
:OLD
.
ROWID
;
V_ACTION:
=
'D'
;
END IF
;
V_OPUSER:
=
USER
;
INSERT INTO
AUD_PRGAMD1
(
W_ROWID
,
W_ACTION
,
DTTM
,
OPUSER
,
B$CODE
,
B$FTY
,
A$CODE
,
A$FTY
)
VALUES
(
V_ROWID
,
V_ACTION
,
SYSDATE
,
V_OPUSER
,
:OLD
.
CODE
,
:OLD
.
FTY
,
:NEW
.
CODE
,
:NEW
.
FTY
);
END
;
注:上面的OLD表示被操作表中原来的数据指向,NEW表示被操作表中现在的数据指向
3、操作测试:
insert into
prgamd
values
(
'x'
,
'x'
);
select
*
from
AUD_PRGAMD1
select
*
from
prgamd
;
update
prgamd
set
code
=
'm1'
where
fty
=
'x'
;
commit
;
注:这是当初在那个论坛上看到的,因为时间的关系,现在已经想不起来了,如果您是原作者,请告知一下,以便我把名暑上。
本文出自:冯立彬的博客