记录Oracle上一行改变历史的数据库(oracle上一行数据库)

Oracle数据库是企业级应用层最受欢迎和广泛使用的数据库之一。如今,在大型企业内部的数据处理和存储中,Oracle数据库拥有相当高的市场占有率。然而,尽管这个数据库储存着大量业务关键数据,对于一个数据库管理员来说,它仍然可能需要记录下更改这些数据的过程。这就需要一种方式来了解数据库历史记录。

倘若管理员在Oracle数据库上执行查询时,可以用以下语句记录数据表改变的历史:

CREATE TABLE emp_history as SELECT * FROM emp;

以上语句可以查看所有历史记录,但是对于管理员来说,仅仅这样是无法保证安全性,应当记录每一行数据的变更。

为了达到此目的,管理员可以使用触发器,在审计表中记录所有更新操作。

但是,在Oracle数据库的情况下,并非所有的更新都是通过UPDATE语句实现。这意味着触发器无法记录所有行的更改。

这种情况下,我们可以使用另一个DBMS内置的历史观察机制来记录上一行变化的历史。以下是建立历史观察机制的步骤:

1.创建一个名为HISTORY_TABLE的表,用于保存要监视的表的变化:

CREATE TABLE “HISTORY_TABLE”( ROWID_ROW ROWID, PKVAL VARCHAR2(100), OLD_DATA CLOB );

创建ROWID_ROW列来储存ROWID作为主键标识。

创建PKVAL列来储存包含要监视数据行的主键的字符串。

创建OLD_DATA列用于保存过去行的XML的CLOB数据类型。

2.以下是创建一个PROCEDURE来将事件添加到HISTORY_TABLE的代码:

CREATE OR REPLACE PROCEDURE AUDIT_TABLE ( PRIMARY_VAL IN VARCHAR2, OPER IN VARCHAR2 )

AS

BEGIN

INSERT INTO HISTORY_TABLE

SELECT ROWID_ROW, PRIMARY_VAL, DBMS_ROWID.ROWID_OBJECT(ROWID_ROW, 0) AS ROW_OBJECT_ID,

TO_CLOB(DBMS_XMLGEN.GETXML(‘SELECT * FROM ‘ || ‘HR.DUMMY_TABLE’ || ‘ WHERE ‘ || ‘id=”’ || PRIMARY_VAL ||

”’ AND ROWNUM=1 AND ROWNUM

END AUDIT_TABLE;

AUDIT_TABLE从SYS_CONTEXT(’USERENV’,’SESSION_USER’)获取连接的用户名來使其更具动态性。

3.运行触发器,将该行的旧数据记录在HISTORY_TABLE中:

CREATE OR REPLACE TRIGGER UPDATE_DUMMY_TABLE

AFTER UPDATE ON HR.DUMMY_TABLE

FOR EACH ROW

BEGIN

IF INSERTING THEN

AUDIT_TABLE(:NEW.ID, ‘INSERT’);

ELSIF UPDATING THEN

AUDIT_TABLE(:NEW.ID, ‘UPDATE’);

ELSIF DELETING THEN

AUDIT_TABLE(:OLD.ID, ‘DELETE’);

END IF;

END;

上面的代码将在我们的HISTORY_TABLE表中创建一个行历史记录。根据需要,您可以更改表和字段的名称。通过这种方法,开发人员和管理员可以轻松地查看和分类权限的使用历史。


数据运维技术 » 记录Oracle上一行改变历史的数据库(oracle上一行数据库)