gpt4 book ai didi

sql - 相当于 SQL Server INSERTED 和 DELETED 表的 Oracle

转载 作者:行者123 更新时间:2023-12-04 21:14:31 24 4
gpt4 key购买 nike

我正在将 SQL Server 数据库迁移到 Oracle,在那里我必须转换使用名为 INSERTED 的特殊表的 SQL Server 过程。和 DELETED在 SQL Server 中。

根据我的理解,这些表保存了最后插入/删除记录的数据副本。
(在此处找到 msdn 文章:http://msdn.microsoft.com/en-us/library/ms191300.aspx)

Oracle 中是否有类似的表来实现这一点..?请指教。

更新:

感谢您的回答和评论,我想我需要再解释一下情况。这是了解真实场景的完整故事;

  • 数据库包含表和影子表(影子有一个附加列)。
  • 更新表时,应将相同的更改与一些附加数据一起记录在相关的影子表中。
  • 为此,他们为每个表设置了触发器(这些触发器将数据复制到相关的影子表)。
  • 上述过程为每个表动态生成这些触发器。
  • 现在真正的问题是我不了解列,因为触发器是为每个表动态生成的。
  • 基本上我无法获得像 APC 提到的 NEW.col_1 或 OLD.col_1 这样的值。我可以吗。?

  • 否则我必须使用前缀手动编写所有这些触发器:NEW 和:OLD 而不是尝试动态生成它们。

    我正在使用 Oracle 11g

    最佳答案

    Oracle 触发器使用伪记录而不是特殊表。也就是说,我们可以访问单个列的值而不是表。

    我们使用前缀 :NEW 将受影响表中的伪记录与(其他)表中的记录区分开来。和 :OLD . Oracle 允许我们为这些声明我们自己的名称,但实际上没有充分的理由放弃该标准。

    我们可以访问哪些列值?

    Action       :OLD                :NEW
    ------ ---- ----
    INSERTING n/a Inserted value
    UPDATING Superseded value Amended value
    DELETING Deleted value n/a

    你会看到 :OLD与 MSSQL 表相同 DELETED:NEW同表 INSERTED
    因此,要在更新某个列时触发业务规则检查:
    create or replace trigger t23_bus_check_trg 
    before update on t23
    for each row
    begin
    if :NEW.col_1 != :OLD.col_1 then
    check_this(:NEW.col_1 , :OLD.col_1);
    end if;
    end t23_bus_check_trg;

    PL/SQL 引用中有关于记录的一整章。 Find out more .

    关于sql - 相当于 SQL Server INSERTED 和 DELETED 表的 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25589965/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com