【问题标题】:How to get previous data before commit?如何在提交之前获取以前的数据?
【发布时间】:2014-06-23 23:38:50
【问题描述】:

有没有办法获取当前更改之前和我们提交更改之前特定表中的先前值,并且无需将数据存储在备份表中。

也许这样会更清楚:

  • 第一阶段:在不提交的情况下更改表 X 中的数据
  • 阶段 2:在阶段 1 之前获取数据而不将其存储在备份文件夹中
  • 第 3 阶段:提交第 1 阶段的更改。

【问题讨论】:

  • 选项 1. 在提交更改之前,请读取现有数据并将其写入文件。选项 2 使用触发器。
  • 不确定您所说的“获取数据”是什么意思,在哪里获取(一些前端应用程序,后端进程?)以及您想用它做什么? (将其展示给某个应用用户,将其存储在某处(表格、文件?...这显然是您不想要的)?需要更多信息。
  • 好的。您可能有一个执行一些更新的存储过程。在您运行这些更新之前,我假设您有一些可用的主键。根据主键选择现有数据,将其插入到其他一些临时保存表中,以供您随意使用。现在,您应该拥有此保持表中之前数据的快照。
  • 其数以百万计的记录,出于性能考虑,我试图避免备份表。我的假设是有可能的,因此如果我们在另一个会话中尝试,我们会得到 prev 数据。

标签: sql oracle


【解决方案1】:

根据您的事务的设计方式,您可以将逻辑置于触发器中。触发器可以访问旧值和新值。请参阅Oracle Documentation 了解更多信息(:old 和 :new)。

CREATE OR REPLACE TRIGGER test_trigger
  BEFORE DELETE OR UPDATE ON test_table
  FOR EACH ROW

BEGIN
    INSERT INTO backup_table (col1, col2) VALUES (:old.col1, :old.col2);
END;

【讨论】:

  • 我所做的更改是数百万条记录,我想在某些情况下从 prevs 值中找到数据。这个数据库过程需要一个多小时,有时其他表中的数据会根据在该过程中发生变化的表而发生变化,我需要在提交之前查看更改
【解决方案2】:

UPDATE 上的The RETURNING 子句应该能够为您执行此操作。不幸的是,我不知道引用前一个值的 Oracle 语法(在 PostgreSQL 中这将是 OLD.column_name),但文档听起来好像您的需求得到了支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2012-11-23
    • 2018-12-11
    相关资源
    最近更新 更多