如何在不使用触发器和审计的情况下知道在 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
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 theDBMS_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