trigger etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
trigger etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

20 Haziran 2012 Çarşamba

Oracle database trigger order


Oracle Database fires multiple triggers in an unspecified, random order, if more than one trigger of the same type exists for a given statement; that is, triggers of the same type for the same statement are not guaranteed to fire in any specific order.

Execution steps of trigger.
http://docs.oracle.com/cd/B28359_01/server.111/b28318/triggers.htm#CNCPT418


 DBA_TRIGGER_ORDERING description
http://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_2107.htm#REFRN20581

sample:

create or replace trigger trigger_01
before insert on test
for each row
follows trigger_02
....


create or replace trigger trigger_02
before insert on test
for each row




30 Aralık 2011 Cuma

ORA-04091: table appuser.holidays is mutating, trigger/function may not see it

When you insert a row to table which have trigger to insert another table in remote db.
You have to care about insert statement in trigger.

for example

if you use this statement for insert to remote table


INSERT INTO appuser.holidays@otherdb SELECT * FROM holidays WHERE HOL_NAME = :New.HOL_NAME;


statement raises an error like below

ORA-04091: table appuser.holidays is mutating, trigger/function may not see it
ORA-02063: preceding line from PRODDB
ORA-02063: preceding 2 lines from OTHERDB
ORA-06512: at "APPUSER.HOLIDAYS_IUD", line 6
ORA-04088: error during execution of trigger 'APPUSER.HOLIDAYS_IUD'


to aviod tihs problem you can use table columns for inserting. like below


INSERT INTO appuser.holidays@otherdb values (:New.HOL_NAME,:New.HOL_START,:New.HOL_END,:New.HOL_TYPE);



--source of trigger


CREATE OR REPLACE TRIGGER APPUSER.HOLIDAYS_IUD
 AFTER
  INSERT OR DELETE OR UPDATE
 ON appuser.holidays
REFERENCING NEW AS NEW OLD AS OLD
 FOR EACH ROW
DECLARE
BEGIN
 IF DELETING then
     DELETE FROM appuser.holidays@otherdb WHERE HOL_NAME =:Old.HOL_NAME;
 ELSIF INSERTING then
     INSERT INTO appuser.holidays@otherdb values (:New.HOL_NAME,:New.HOL_START,:New.HOL_END,:New.HOL_TYPE);
 ELSIF UPDATING then
     DELETE FROM appuser.holidays@otherdb WHERE HOL_NAME = :Old.HOL_NAME;
     --raise error like below
     --INSERT INTO appuser.holidays@otherdb SELECT * FROM holidays WHERE HOL_NAME = :New.HOL_NAME;
     INSERT INTO appuser.holidays@otherdb values (:New.HOL_NAME,:New.HOL_START,:New.HOL_END,:New.HOL_TYPE);
 END IF;
END;
/