如何在不使用触发器和审计的情况下知道在 Oracle 11g 的 table 中更新了哪些列

how to know which columns are updated in a table in Oracle 11g with out using triggers and auditing

Table 姓名是员工

ID NAME SALARY  

1 K1 2000  
2 K2 3000  
3 K3 4000

现在,我更新了第二行(3000 为 9000)

ID NAME SALARY

1 K1 2000  
2 K2 9000  
3 K3 4000

现在,我希望 oracle 命令知道更新了哪些列,而不使用触发器。
例如:如果我给 table 名称“employees”,那么命令应该说“SALARY”列已更新。
如果我给列名称“SALARY”,那么它必须说列“SALARY”已更改。如果我将列名称命名为“ NAME ”,那么它必须说列“ Name ”不是 changed.Thank 你的朋友。

您可以使用细粒度审计DBMS_FGA 是 Oracle 提供的内置包,用于添加 policies。请参阅 documentation 了解更多信息。

例如,

SELECT * FROM emp WHERE empno = 9998;
INSERT INTO emp (empno, ename, sal) VALUES (9998, 'Bill', 1);
UPDATE emp SET sal = 10 WHERE empno = 9998;
DELETE emp WHERE empno = 9998;
ROLLBACK;

-- Check the audit trail.

CONN sys/password AS SYSDBA
SELECT sql_text FROM dba_fga_audit_trail;

SQL_TEXT
--------------------------------------
SELECT * FROM emp WHERE empno = 9998
INSERT INTO emp (empno, ename, sal) VALUES (9998, 'Bill', 1)
UPDATE emp SET sal = 10 WHERE empno = 9998
DELETE emp WHERE empno = 9998

4 rows selected.

这只是一个示例,所有 DML 操作都经过审核。还有其他审核选项:

  • DDL(对象的创建、更改和删除)
  • DML(插入更新、删除、SELECT、执行)。
  • 系统事件(登录、注销等)

看看 Tim Hall 的 this 文章。

使用 dbms_flashback (oracle 9i) 或 select 查询中的 AS OF TIMESTAMP 子句来查询更高版本的 Oracle。有关用法的更多信息,请参阅 https://oracle-base.com/articles/10g/flashback-10g#flashback_query

Flashback Query allows the contents of a table to be queried with reference to a specific point in time, using the AS OF clause. Essentially it is the same as the DBMS_FLASHBACK functionality or Oracle 9i, but in a more convenient form. For example.

CREATE TABLE flashback_query_test (
  id  NUMBER(10)
);

SELECT current_scn, TO_CHAR(SYSTIMESTAMP, 'YYYY-MM-DD HH24:MI:SS') FROM v$database;

CURRENT_SCN TO_CHAR(SYSTIMESTAM
----------- -------------------
     722452 2004-03-29 13:34:12

INSERT INTO flashback_query_test (id) VALUES (1);
COMMIT;

SELECT COUNT(*) FROM flashback_query_test;

  COUNT(*)
----------
         1

SELECT COUNT(*)
FROM   flashback_query_test AS OF TIMESTAMP TO_TIMESTAMP('2004-03-29 13:34:12', 'YYYY-MM-DD HH24:MI:SS');

  COUNT(*)
----------
         0

SELECT COUNT(*)
FROM   flashback_query_test AS OF SCN 722452;

  COUNT(*)
----------
         0