ट्रिगर्स में होने वाले नुकसानों में से है::new / :old बहुत विशिष्ट ट्रिगर हैं और संभालने के लिए कठिन हैं। समाधान का एक तरीका स्पष्ट रूप से xmltype का निर्माण करना होगा:
create or replace TRIGGER EVAL_CHANGE_TRIGGER
AFTER INSERT OR UPDATE OR DELETE
REFERENCING NEW AS NEW OLD AS OLD
ON ResearchTable
DECLARE
log_action varchar(10);
p_xmldata XMLtype;
p_newrowdata clob;
BEGIN
select XMLElement("ResearchTable",
XMLElement("myColumn1", :NEW.myColumn1),
XMLElement("myColumn2", :NEW.myColumn2),
....)
into p_xmldata from dual;
p_newrowdata:=p_xmldata.getClobVal();
IF INSERTING THEN
log_action := 'Insert';
ELSIF UPDATING THEN
log_action := 'Update';
ELSIF DELETING THEN
log_action := 'Delete';
ELSE
DBMS_OUTPUT.PUT_LINE('This code is not reachable.');
END IF;
INSERT INTO auditsResearch (table_name, transaction_name, by_user, transaction_date,XMLDATA)
VALUES('PROJ_TEST', log_action, USER, SYSDATE,p_newrowdata);
END;
एक्सएमएल-पीढ़ी बहुत टेबल-विशिष्ट है (नई-सीमाओं के कारण), मैं लक्ष्य तालिका के मेटा-डेटा को क्वेरी करके कुछ कोड-जनरेशन का उपयोग करूंगा:
select 'XMLElement("'||cols.column_Name||'", :NEW.'||cols.column_name||'),'
from SYS.ALL_TAB_COLS cols
where upper(cols.owner)=upper('MY_TARGET_SCHEMA')
and upper(cols.table_name)=upper('MY_TABLE')
order by column_id
;