oracle 在使用“合并插入更新作为增量"策略的表上触发

2j4z5cfb  于 2023-01-30  发布在  Oracle
关注(0)|答案(2)|浏览(117)
  • 所讨论的触发器适用于在ODI中具有ETL的表,但用户也可以选择编辑某些(如果要调整它们)。这是使用APEX完成的
  • 触发器用于更改两列:变更人变更日期。两者均表示仅在APEX页面上完成变更。
  • 当ODI加载运行并且是MERGE INSERT UPDATE时,问题出现,Trigger认为其更新并将上述两列更改为“NULL”,因为其是由ODI手动更新的,而不是在APEX上。

溶液

  • 对于每个“可编辑列”,应有一个检查“新”的逻辑:〈〉:旧的,但由于我有15列需要写大量的代码.
    是否有其他方法可以实现这一目标?
create or replace TRIGGER DW.TRG BEFORE
    UPDATE ON DW.TABLE
    REFERENCING
            NEW AS new
            OLD AS old
    FOR EACH ROW
BEGIN
    IF updating  THEN
        SELECT
            SYSDATE,
            v('APP_USER')
        INTO
            :new.changed_on_dt,
            :new.changed_by
        FROM
            dual;
    END IF;
END;
slmsl1lt

slmsl1lt1#

检查当前数据库会话是否存在apex会话,并仅在存在apex会话时执行。

create or replace TRIGGER DW.TRG BEFORE
    UPDATE ON DW.TABLE
    REFERENCING
            NEW AS new
            OLD AS old
    FOR EACH ROW
BEGIN
  IF SYS_CONTEXT('APEX$SESSION','APP_SESSION') IS NOT NULL AND updating  THEN
    :new.changed_on_dt := SYSDATE;
    :new.changed_by := SYS_CONTEXT('APEX$SESSION','APP_USER');
  END IF;
END;

附注

  • 避免使用SELECT FROM DUAL,您可以只在触发器中赋值。
  • “V”函数非常慢。有一段时间,有存储会话和用户数据的sys_context设置。这些设置比调用“V”函数快得多。
5t7ly7z5

5t7ly7z52#

你可以让它永远不会用空值覆盖非空值:

IF v('APP_USER') IS NOT NULL
THEN
  :new.changed_by := v('APP_USER');
  :new.changed_on_dt := SYSDATE;
END IF;

相关问题