[英]ORACLE Trigger on INSERT and UPDATE for table containing the trigger condition
我有一个配置表,其中包含用于控制应用程序中进程的记录。 通常,我会由应用程序控制该表,但是现在这是不可能的(没有钱,没有时间等)。 因此,目前该表将由诸如SQL Developer之类的客户端管理。 为了确保正确填充表,我需要一个触发器,因为检查约束不适用于自定义函数。 INSERT上的触发器可以正常工作,但是我对UPDATE上的触发器有麻烦,因为所有要检查触发器的条件都在表本身中,我从ORACLE中得到一个错误,该表目前正在更新,所以触发器不能被触发。
该表包含以下几列:
ID, SOURCE_SYSTEM, TARGET_SYSTEM, TABLE_ID, VALID_FROM, VALID_THROUGH
1, 2, 3, 455, 01.12.2011. 02.11.2013
条件如下:
所以我的问题是,有没有办法使这项工作也适用于UPDATE? 我已经读过关于将物化视图用于触发器的信息,但是我认为表和视图之间的数据不同步可能会出现问题。
谢谢您的帮助! 人
PS。 使用Oracle版本12.1.0.2.0
更新:这是在插入触发器:
create or replace
trigger SINGLE_QUELLSYSTEM_INSERT
BEFORE INSERT ON CTL_WEBADMIN_ABGLEICH FOR EACH ROW
DECLARE
v_count_rows NUMBER;
BEGIN
dbms_output.ENABLE (buffer_size => NULL);
dbms_output.put_line('Start...');
IF(:NEW.CLDB_QUELLSYSTEM_ID = :NEW.CLDB_ZIELSYSTEM_ID) THEN
RAISE_APPLICATION_ERROR(-20336, 'Quellsystem ist gleich dem Zielsystem. Bitte, korrigieren Sie Ihre Abfrage.');
END IF;
IF(:NEW.GUELTIG_BIS < :NEW.GUELTIG_VON) THEN
RAISE_APPLICATION_ERROR(-20338, 'Datum BIS liegt vor Datum VON. Bitte, korrigieren Sie Ihre Abfrage.');
END IF;
SELECT COUNT(*) INTO v_count_rows FROM CTL_WEBADMIN_ABGLEICH;
dbms_output.put_line('Anzahl der Zeilen in der Tabelle CTL_WEBADMIN_ABGLEICH: ' || v_count_rows);
IF (v_count_rows >=1 ) THEN
dbms_output.put_line('Mehrere Zeilen in der Tabelle CTL_WEBADMIN_ABGLEICH vorhanden. Checking trigger condition...');
-- FOR r in (SELECT DISTINCT CLDB_QUELLSYSTEM_ID,CLDB_WEBADMIN_TABLE_ID, GUELTIG_BIS, GUELTIG_VON FROM CTL_WEBADMIN_ABGLEICH where GUELTIG_VON >= sysdate )
FOR r in (SELECT DISTINCT CLDB_QUELLSYSTEM_ID,CLDB_WEBADMIN_TABLE_ID, GUELTIG_BIS, GUELTIG_VON FROM CTL_WEBADMIN_ABGLEICH)
LOOP
IF ((r.CLDB_QUELLSYSTEM_ID != :NEW.CLDB_QUELLSYSTEM_ID OR r.CLDB_QUELLSYSTEM_ID = :NEW.CLDB_QUELLSYSTEM_ID) and r.CLDB_WEBADMIN_TABLE_ID = :NEW.CLDB_WEBADMIN_TABLE_ID ) THEN
dbms_output.put_line('Ein anderes Quellsystem wurde für das System: ' || r.CLDB_QUELLSYSTEM_ID || ' schon spezifiziert. Checking Gültigkeit...');
IF (r.GUELTIG_BIS is null OR (:NEW.GUELTIG_BIS >= r.GUELTIG_VON AND :NEW.GUELTIG_BIS <= r.GUELTIG_BIS) OR
(:NEW.GUELTIG_VON >= r.GUELTIG_VON AND :NEW.GUELTIG_VON <= r.GUELTIG_BIS) OR
(:NEW.GUELTIG_VON <= r.GUELTIG_VON AND :NEW.GUELTIG_BIS >= r.GUELTIG_BIS)) THEN
RAISE_APPLICATION_ERROR(-20337, 'Gültigkeitsbereiche mit schon existierenden Einträgen kollidieren!');
END IF;
END IF;
END LOOP;
END IF;
END;
除了声明部分(即声明部分)外,on UPDATE触发器是相同的
create or replace
trigger SINGLE_QUELLSYSTEM_UPDATE
BEFORE UPDATE ON CTL_WEBADMIN_ABGLEICH FOR EACH ROW ...
我得到的错误是:
ORA-04091: table CLDBDEF.CTL_WEBADMIN_ABGLEICH is mutating, trigger/function may not see it
ORA-04091:表CLDBDEF.CTL_WEBADMIN_ABGLEICH正在突变,触发器/函数可能看不到它
当语句导致触发触发器并且该触发器引用了导致该触发器的表时,就会发生“ 变异错误” 。
如何避免:
参考:-
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.