如何在触发器函数中排除数据库列 (Oracle)
How to Exclude DB Column in a Trigger Function (Oracle)
我在某个 table(例如 TABLE_TRIGGER)中创建了一个非常简单的触发器,它将调用一个过程(handles所有的逻辑)。这个table有一个列(例如AUDITID)我想在触发函数中排除,我的意思是,如果update 仅在 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)
我不知道有什么方法可以从更新触发器中排除列,但是您可以定义它触发的列的列表,并列出所有列除了 auditid
:
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;
在插入期间,插入事件对 OLD 的所有引用都将导致 NULL,因此您的过程不会 运行。
考虑并参考以下代码块:
我想这就是您要找的东西。
create table hr.test(id1 int,id2 int);
create or replace procedure hr.test_proc
as
begin
dbms_output.put_line('trigger');
end;
CREATE OR REPLACE TRIGGER test_trg
AFTER INSERT OR UPDATE
ON hr.test
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
if updating and :old.id1 !=:new.id1 then
null;--do nothing just as you want
else
hr.test_proc;--call your proc
end if;
END;
我在某个 table(例如 TABLE_TRIGGER)中创建了一个非常简单的触发器,它将调用一个过程(handles所有的逻辑)。这个table有一个列(例如AUDITID)我想在触发函数中排除,我的意思是,如果update 仅在 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)
我不知道有什么方法可以从更新触发器中排除列,但是您可以定义它触发的列的列表,并列出所有列除了 auditid
:
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;
在插入期间,插入事件对 OLD 的所有引用都将导致 NULL,因此您的过程不会 运行。
考虑并参考以下代码块: 我想这就是您要找的东西。
create table hr.test(id1 int,id2 int);
create or replace procedure hr.test_proc
as
begin
dbms_output.put_line('trigger');
end;
CREATE OR REPLACE TRIGGER test_trg
AFTER INSERT OR UPDATE
ON hr.test
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
if updating and :old.id1 !=:new.id1 then
null;--do nothing just as you want
else
hr.test_proc;--call your proc
end if;
END;