记录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表中创建一个行历史记录。根据需要,您可以更改表和字段的名称。通过这种方法,开发人员和管理员可以轻松地查看和分类权限的使用历史。