【问题标题】:log insertions/updates/deletions in oracle database在 oracle 数据库中记录插入/更新/删除
【发布时间】:2013-03-12 12:58:01
【问题描述】:

要了解一个应用程序,如果可以以某种方式记录每个数据库更改,那将是非常有帮助的。然后你可以在前端执行一个动作,看看数据库中发生了什么。 (我只关心最后 5 分钟左右,但更多不会受到伤害。)这有什么可能性?

我知道configure the JDBC driver 可以记录已执行的语句,但它记录的内容比我想看到的要多(例如,我不关心查询)并且被广泛地混合到您的日志文件中。 :-/

我能想到的另一件事是为每个表创建触发器,将更改的数据写入日志表。有没有人设法做到这一点?尤其是创建一个脚本来为给定的一组表创建这些触发器?

【问题讨论】:

  • 检查审计(虽然需要企业版)
  • 是临时需要还是长期设置?
  • 也许this post 可能会有所帮助

标签: sql oracle triggers


【解决方案1】:

您可以在 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;
/

【讨论】:

  • 一些建议——您可能希望使用时间戳而不是日期,如果删除要记录“旧”工资,则将工资列命名为 new_salary 可能不是一个好的选择。
  • @David - 谢谢。我从 Oracle 文档中复制了这个,几乎没有修改。这是一般的例子。由创建者定义列等...
【解决方案2】:

使用触发器,您可以只保留以前的数据(数据的历史记录)。为什么不简单地将日志插入日志表?

【讨论】:

    猜你喜欢
    • 2019-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多