Oracle उत्परिवर्तित ट्रिगर त्रुटि तब होती है जब कोई ट्रिगर उस तालिका को संदर्भित करता है जो ट्रिगर का मालिक होता है, जिसके परिणामस्वरूप "ORA-04091:तालिका का नाम बदल रहा है, ट्रिगर/फ़ंक्शन इसे नहीं देख सकता है" संदेश।
आइए मौजूदा समाधान पर एक नजर डालते हैं।
पैकेज के माध्यम से पहला, प्राचीन है और प्रभावी प्रतीत होता है, हालांकि, इसे तैयार करने और चलाने में काफी समय लगता है। दूसरा सरल है और यौगिक ट्रिगर का उपयोग करके किया जाता है।
create table turtles as select 'Splinter' name, 'Rat' essence from dual union all select 'Leonardo', 'Painter' from dual union all select 'Rafael', 'Painter' from dual union all select 'Michelangelo', 'Painter' from dual union all select 'Donatello', 'Painter' from dual;

जब स्प्लिंटर चूहे से सेंसेई में बदल जाता है, तो चित्रकारों को स्वचालित रूप से निंजा में बदलना होगा। यह ट्रिगर उपयुक्त प्रतीत होता है:
create or replace trigger tr_turtles_bue
before update of essence
on turtles
for each row
when (
new.name = 'Splinter' and old.essence = 'Rat' and new.essence = 'Sensei'
)
begin
update turtles
set essence = 'Ninja'
where essence = 'Painter';
end; हालांकि, रिकॉर्ड अपडेट करते समय:
update turtles set essence = 'Sensei' where name = 'Splinter'
निम्न त्रुटि होती है:
ORA-04091:तालिका SCOTT.TURTLES उत्परिवर्तित हो रही है, ट्रिगर/फ़ंक्शन इसे नहीं देख सकता है
आइए इस ट्रिगर को हटा दें:
drop trigger tr_turtles_bue;
विधि 1: पैकेज और निर्देश-स्तरीय ट्रिगर का उपयोग करना।
create or replace package pkg_around_mutation
is
bUpdPainters boolean;
procedure update_painters;
end pkg_around_mutation;
/
create or replace package body pkg_around_mutation
is
procedure update_painters
is
begin
if bUpdPainters then
bUpdPainters := false;
update turtles
set essence = 'Ninja'
where essence = 'Painter';
end if;
end;
end pkg_around_mutation;
/
create or replace trigger tr_turtles_bue
before update of essence
on turtles
for each row
when (
new.name = 'Splinter' and old.essence = 'Rat' and new.essence = 'Sensei'
)
begin
pkg_around_mutation.bUpdPainters := true;
end tr_turtles_bue;
/
create or replace trigger tr_turtles_bu
after update
on turtles
begin
pkg_around_mutation.update_painters;
end tr_turtles_bu;
/ विधि 2: कंपाउंड डीएमएल ट्रिगर्स का उपयोग करना (Oracle 11g से शुरू होकर उपलब्ध)।
create or replace trigger tr_turtles_ue
for update of essence
on turtles
compound trigger
bUpdPainters boolean;
before each row is
begin
if :new.name = 'Splinter' and :old.essence = 'Rat' and :new.essence = 'Sensei' then
bUpdPainters := true;
end if;
end before each row;
after statement is
begin
if bUpdPainters then
update Turtles
set essence = 'Ninja'
where essence = 'Painter';
end if;
end after statement;
end tr_turtles_ue; आइए निम्नलिखित प्रयास करें:
update turtles set essence = 'Sensei' where name = 'Splinter'

यहां तक कि अगर आपको उत्परिवर्तन के अधिक जटिल मामले का सामना करना पड़ा है, तो आप उपर्युक्त विचार को समाधान के रूप में उपयोग कर सकते हैं। निर्देश-स्तरीय ट्रिगर में, पंक्ति-स्तरीय ट्रिगर के विपरीत, कोई उत्परिवर्तन नहीं होता है। आप अतिरिक्त पैकेज में या तो वैरिएबल (टैग, लैच, पीएल एसक्यूएल टेबल) का उपयोग कर सकते हैं, या वे वैरिएबल जो कंपाउंड ट्रिगर के सभी सेक्शन के लिए ग्लोबल हैं, जो कि ओरेकल 11 जी के संस्करण से शुरू होने के लिए बेहतर है। तो, अब आप कुंग फू भी जानते हैं।
आपको ट्रिगर्स के बारे में अतिरिक्त जानकारी यहां मिल सकती है:कंपाउंड डीएमएल ट्रिगर्स
कोई भी टिप्पणी जोड़ने के लिए स्वतंत्र महसूस करें।