要了解一个应用程序,如果可以以某种方式记录每个数据库更改,那将是非常有帮助的。然后你可以在前端执行一个动作,看看数据库中发生了什么。(我只关心最后 5 分钟左右,但更多不会受到伤害。)这有什么可能性?
我知道可以配置 JDBC 驱动程序来记录执行的语句,但它记录的内容比我想看到的要多(例如,我不关心查询)并且被广泛地混合到您的日志文件中。:-/
我能想到的另一件事是为每个表创建触发器,将更改的数据写入日志表。有没有人设法做到这一点?特别是创建一个为给定的一组表创建这些触发器的脚本?
要了解一个应用程序,如果可以以某种方式记录每个数据库更改,那将是非常有帮助的。然后你可以在前端执行一个动作,看看数据库中发生了什么。(我只关心最后 5 分钟左右,但更多不会受到伤害。)这有什么可能性?
我知道可以配置 JDBC 驱动程序来记录执行的语句,但它记录的内容比我想看到的要多(例如,我不关心查询)并且被广泛地混合到您的日志文件中。:-/
我能想到的另一件事是为每个表创建触发器,将更改的数据写入日志表。有没有人设法做到这一点?特别是创建一个为给定的一组表创建这些触发器的脚本?
您可以在 Oracle 文档中找到许多触发器示例。您需要在插入、更新、删除每一行触发器之后填充您的日志表。以下是 Oracle 文档中的一些示例:
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#LNPLS020
CREATE TABLE Emp_log (
Emp_id NUMBER,
Log_date DATE,
New_salary NUMBER,
Action VARCHAR2(20));
CREATE OR REPLACE TRIGGER Log_salary_increase_ARUID
AFTER UPDATE OR INSERT OR DELETE ON emp
FOR EACH ROW
BEGIN
-- Can be separated for Inserting then Updating with addl if
-- In this case it may be easier to control and/or add flags to your log tables
-- such as Action = 'INS' or Action = 'UPD' --
If (INSERTING OR UPDATING)
THEN
-- Insert newly created/updated values to your log table --
INSERT INTO Emp_log (Emp_id, Log_date, New_salary, Action)
VALUES (:NEW.Empno, SYSDATE, :NEW.SAL, 'INS_UPD');
ELSE
-- Deleting - insert old or deleted values to your logs --
INSERT INTO Emp_log (Emp_id, Log_date, New_salary, Action)
VALUES (:OLD.Empno, SYSDATE, :OLD.SAL, 'DEL');
END;
/
使用触发器,您可以只保留以前的数据(数据的历史记录)。为什么不简单地将日志插入日志表?