如何从 PL/SQL 中的触发器回滚列

How to rollback a column from a trigger in PL/SQL

我有一个任务触发条件。我更新了触发器,这意味着我在触发器中添加了 GL_TP 列。但在交付该部分之前,我还必须回滚它以撤消触发器中的该列。 那么如何使用 sql 查询撤消触发器中的 GL_TP 列? 我愿意接受任何想法或建议吗?

CREATE OR REPLACE TRIGGER GL_DEF_TO_TRG
 BEFORE INSERT OR DELETE OR UPDATE OF CDATE, CMPNY_DEF_ID, CUSER, DESCR, GL_DEF_ID, 
  MNY_TP_ID, ST, UDATE, UUSER, GL_TP ON FCBSADM.GL_DEF
   FOR EACH ROW
     DECLARE
     BEGIN
      IF INSERTING THEN
  INSERT INTO MTTFOD.GL_DEF_TO
    (SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE, 
      UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
  VALUES
    (MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :NEW.GL_DEF_ID, :NEW.DESCR, :NEW.MNY_TP_ID, 
    :NEW.CMPNY_DEF_ID, :NEW.ST, :NEW.CDATE, :NEW.CUSER, :NEW.UDATE, :NEW.UUSER, 'I', 
   SYSDATE, :NEW.GL_TP);
ELSIF UPDATING THEN
  INSERT INTO MTTFOD.GL_DEF_TO
    (SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE, 
     UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
  VALUES
    (MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :NEW.GL_DEF_ID, :NEW.DESCR, :NEW.MNY_TP_ID, 
   :NEW.CMPNY_DEF_ID, :NEW.ST, :NEW.CDATE, :NEW.CUSER, :NEW.UDATE, :NEW.UUSER, 'U', 
SYSDATE, 
    NEW:GL_TP);
ELSIF DELETING THEN
  INSERT INTO MTTFOD.GL_DEF_TO
    (SEQ_GLDEF_ID, GL_DEF_ID, DESCR, MNY_TP_ID, CMPNY_DEF_ID, ST, CDATE, CUSER, UDATE, 
      UUSER, CHANGE_TYPE, CHANGE_DATE, GL_TP)
  VALUES
    (MTTFOD.SEQ_GLDEF_ID.NEXTVAL, :OLD.GL_DEF_ID, :OLD.DESCR, :OLD.MNY_TP_ID, 
      :OLD.CMPNY_DEF_ID, :OLD.ST, :OLD.CDATE, :OLD.CUSER, :OLD.UDATE, :OLD.UUSER, 'D', 
    SYSDATE, NEW:GL_TP);
END IF;
    EXCEPTION
    WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20001, 'ERROR: CODE:' || SQLCODE || ' MSG:' ||
                         SQLERRM || ' TRACE:' ||
                         SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3000));
  END;

您的解释有点不清楚,但我假设这就是您要实现的目标。执行触发器后,将列 GL_TP 的值设置回旧值:

...
    SYSDATE, NEW:GL_TP); --> note the typo here !
  END IF;
  -- to revert the change in GL_TP and set it to the old value
  :NEW.GL_TP := :OLD.GL_TP; 
  -- or you could just set it to NULL like this
  -- :NEW.GL_TP := NULL;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001, 'ERROR: CODE:' || SQLCODE || ' MSG:' ||
                         SQLERRM || ' TRACE:' ||
                         SUBSTR(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(), 1, 3000));
END;

请注意,您的代码中有几个拼写错误。您有 NEW:GL_TP - 这不是有效的 oracle 语法,应该是 :NEW.GP_TP

请注意,这不是回滚。 ROLLBACK是oracle中的一个概念,表示事务的撤销。没有“回滚列”这样的东西。