oracle - 如何在触发器函数中排除数据库列 (Oracle)

标签 oracle plsql oracle11g triggers ddl

我在某个表(例如 TABLE_TRIGGER)中创建了一个非常简单的触发器,它将调用一个过程(处理所有逻辑)。该表有一列(例如 AUDITID),我想在触发函数中排除,我的意思是,如果更新仅在AUDITID 列,不应执行该过程。

下面是触发器:

CREATE OR REPLACE TRIGGER TABLE_TRIGGER_FUNCTION
   AFTER INSERT OR UPDATE
   ON TABLE_TRIGGER
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
    -- procedure();
END;

除了这里建议的方法之外,还有其他方法可以做到这一点:Oracle: excluding updates of one column for firing a trigger

这里提供的答案是我想要的Fire trigger on updates (excluding certain fields change)但我不确定这是否也可以使用 Oracle PL/SQL 语法来完成。

顺便说一句,我尝试通过排除 AUDITID 列来使用以下 WHEN 语句,但触发器根本不起作用,并且过程未执行。

WHEN (NEW.FILEID != OLD.FILEID OR
        NEW.DESCRIPTION != OLD.DESCRIPTION OR
        NEW.IMAGEID != OLD.IMAGEID OR
        NEW.STATETYPEID != OLD.STATETYPEID OR
        NEW.ACCESSLEVELID != OLD.ACCESSLEVELID OR
        NEW.FILETYPEID != OLD.FILETYPEID)

最佳答案

我不知道如何从更新触发器中排除列,但您可以定义它触发的列列表,并列出除之外的所有列审核ID:

CREATE OR REPLACE TRIGGER TABLE_TRIGGER_FUNCTION
   AFTER INSERT OR UPDATE
   OF FILEID, -- Field list starts here...
      DESCRIPTION,
      IMAGEID,
      STATETYPEID,
      ACCESSLEVELID,
      ACCESSLEVELID,
      FILETYPEID -- ... and ends here
   ON TABLE_TRIGGER
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
    -- procedure();
END;

关于oracle - 如何在触发器函数中排除数据库列 (Oracle),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37924714/

相关文章:

java - 升级到 Oracle 12c 后,sqlnet.ora 更改未生效

oracle - 什么是 Oracle 中的倾斜列

oracle - SQL/Oracle:何时可以使用多列上的索引

java - 转义 JDBCPreparedStatement 参数中的两个单引号

oracle - pl/sql 程序中的错误计数 (*)

oracle - 如何填充具有默认值的用户定义记录?

oracle - ORA-01461 : can bind a LONG value only for insert into a LONG column-Occurs when querying

database - 如何停止 Oracle dbms_job

MySQL-Oracle桥接

sql - "index by table"和 "index by table of records"有什么区别?