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)
)

3、创建自动备份触发器:

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表示被操作表中现在的数据指向。

4、操作测试:

insert into prgamd
values('x','x');
select * from AUD_PRGAMD1
select * from prgamd;
update prgamd set code='m1' where fty='x';
commit;

时间: 2024-09-20 20:47:55

Oracle中用于数据备份的触发器及表结构的相关文章

vb.net-读取oracle中的数据如果有空怎么判断

问题描述 读取oracle中的数据如果有空怎么判断 在asp.net中用vb.net编写程序读取oracle中是我数据,如果某一列为空那么怎么判定?还有就是读取数据后立即删改行数据怎么实现?谢谢大神 解决方案 如果是字符的空,如:'NULL,就用 coulun <> 'NULL'.如果是对象为空,就用 is not null 解决方案二: 判断一列为空 is null 立即删改 delete from table where id in (select id from table whete

c# 从oracle中查询数据,设置时间参数问题,在线等

问题描述 c# 从oracle中查询数据,设置时间参数问题,在线等 各位大神,小弟刚接触c#时间不长,写了个程序,从界面上datatimepicker中取出时间,然后在c#代码的sql语句中设置时间参数,无论怎么设置要不就查不到数据,要不就是时间格式设置的不对,下面是代码 public DataTable QueryUsedMaterial(string classgroup, string beginTime, string endTime) { string sql_QueryMateria

如何将oracle中的数据导入到excle中

由于需要将oracle中的数据导入到excle中,分享一下,^-^ 1,建立一个emp.sql文件我的是在F :\SQL\EMP.SQL set line 120set pagesize 100set feedback off --关闭类似于"已选11行"这样的输出反馈,以保证spool输出定义的--文件中只有我 --们想要的数据spool f:\excels\empselect * from emp;spool off 2 以scott用户登录, 执行  1中建立的emp.sql 在

c# 服务-从一个表中取出对应的数据 插入到另外一个表结构相同的表中

问题描述 从一个表中取出对应的数据 插入到另外一个表结构相同的表中 C# 写一个服务程序实现功能如下: 有两个结构相同的表A和B 要实现 从表A中取出符合条件的数据 插入到表B中去 然后把A表中的数据删除 ,注明:数据量很大 保证数据顺利插入B表中并删除A表中的数据 保证各个环节不出错: 大伙有什么高招 请指点下

急求:如何把datagridview 表格中的数据写入到SQL数据库表中?

问题描述 如何把datagridview表格中的数据写入到SQL数据库表中?请知道的给我点详细的代码让我学习一下,谢谢了, 解决方案 解决方案二:例:自己更换连接对象.表名就可以了.DimsqladpAsNewSqlClient.SqlDataAdapterDimsqlcomAsNewSqlClient.SqlCommandDimsqlcbdAsNewSqlClient.SqlCommandBuildersqlcom.Connection=DBsqlcom.CommandText="select

mysql-MySQL5.0,使用触发器修改表结构

问题描述 MySQL5.0,使用触发器修改表结构 需求: 表t_fault_code记录故障信息编码, 表t_fault_record记录故障记录, 表t_fault_count记录每日的故障统计 现在,code表中增加一条记录时,需要在count表中新增一列,用来存储record表中该故障的出现次数.我的思路: 创建3个触发器, trigger 1:code表insert一条记录后,查询count表中是否已经存在该列(列名:t_fault_code.Source).如果不存在,新增一列. tr

Oracle中的数据锁定机制全面解析

为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突.为了解决这个问题,大多数数据库用的方法就是数据的锁定. 数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁.什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住.而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做.

桌面虚拟化中的数据备份

越来越多的用户部署VMware View,所以各式各样的需求自然也涌现出来.桌面虚拟化把所有的运算和数据全部集中到了数据中心,这种即安全又易于集中控管的方法,一经推出,就受到很多用户的青睐. 数据全集中了,那么数据的保护就变得不可或缺了,今天我们就来说说虚拟桌面的备份. 提到备份,也许你会想到Ghost,不过严格来说,Ghost只是一个映像工具,并不是常规的备份软件,常规的备份软件一般都可以支持在线/离线的系统,数据备份等功能. 虚拟桌面需要使用到虚拟机,也就是说每个用户都有一个属于自己的操作系

Oracle中怎样用自治事务保存日志表

数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败.在Oracle中,一个事务是从执行第一个数据治理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束. 事务的"要么全部完成,要么什么都没完成"的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成. 针对这种困境,Oracle提供了一种便捷的方法,即自治事务.自治事务从当前事务开始,在其自身的语