Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ट्रिगर के अंदर गतिशील संचालन के लिए पुराने और नए ऑब्जेक्ट का उपयोग करना

एक विकल्प:यह जांचने के लिए लॉजिक को पुश करें कि क्या कोई कॉलम f_log प्रक्रिया में ट्रैक किया जा रहा है और फिर सभी कॉलमों को पार करें।

उदाहरण के लिए, यदि आपके ट्रैक_टेबल में प्रत्येक कॉलम के लिए मान (table_name, column_name, allow) है जिसे आप ट्रैक करना चाहते हैं तो कुछ इस तरह है

 CREATE OF REPLACE PROCEDURE f_log(  p_id          varchar2  
                                    ,p_table_name  varchar2
                                    ,p_column_name varchar2
                                    ,p_old_val     varchar2
                                    ,p_new_val     varchar2)
 as
    l_exists number;
    cursor chk_column_track IS
        SELECT  1
        FROM    track_TABLE           
        WHERE   upper(TABLE_NAME)  = upper(p_table_name)              
        AND     UPPER(column_name) = upper(p_column_name)
        AND     upper(allow) = 'Y'; 
 begin
    open chk_column_track;
    fetch chk_column_track into l_exists;
    if chk_column_track%found then
       --do the insert here
    end if;
    close chk_column_track;
 end;
 /

 CREATE OR REPLACE TRIGGER trg_TRACK 
 AFTER INSERT OR UPDATE OR DELETE ON ABC 
 FOR EACH ROW 
 DECLARE   
      n_id varchar(50); 
 BEGIN   
    n_id := NVL(:old.id, :new.id);   
    -- send all of the values to f_log and have it decide whether to save them
    f_log(:old.id,'COL1',:old.col1,:new.col1);   
    f_log(:old.id,'COL2',:old.col2,:new.col2);   
    f_log(:old.id,'COL3',:old.col3,:new.col3);   
    ... 
 END; 

और भलाई के लिए, अपने ट्रैक_टेबल में मानों को सम्मिलित करने पर अपर-केस करें ताकि आपको UPPER() संग्रहीत मानों की आवश्यकता न हो और इस प्रकार उन मानों पर कोई अनुक्रमणिका बेकार हो जाए!

अब, यह प्रत्येक ऑपरेशन पर प्रत्येक कॉलम नाम की जाँच करने वाले कुछ संसाधनों को चबाएगा, लेकिन यदि आप उच्च-वॉल्यूम नहीं चला रहे हैं तो यह प्रबंधनीय हो सकता है।

अन्यथा आपको अधिक सुरुचिपूर्ण समाधान की आवश्यकता होगी। जैसे संग्रह की शक्ति का लाभ उठाना और TABLE() क्लॉज को ट्रैक_टेबल लुकअप करने के लिए बल्क ऑपरेशन में करना। ध्यान रखें कि मैं इस समय अपने डेटाबेस से दूर हूं, इसलिए मैंने इस कोड का परीक्षण-संकलन नहीं किया है।

    CREATE OR REPLACE TYPE t_audit_row AS OBJECT (
   p_table_name   varchar2(30)
  ,p_column_name  varchar2(30)
  ,p_id           varchar2(50)
  ,p_old_val      varchar2(2000)
  ,p_new_val      varchar2(2000)
);

CREATE OR REPLACE TYPE t_audit_row_table AS TABLE OF t_audit_row;

CREATE OR REPLACE PROCEDURE f_log (p_audit_row_table t_audit_Row_table)
AS
begin
   -- see how we can match the contents of the collection to the values
   -- in the table all in one query. the insert is just my way of showing
   -- how this can be done in one bulk operation. Alternately you could make
   -- the select a cursor and loop through the rows to process them individually.
   insert into my_audit_log (table_name, column_name, id, old_val, new_val)
   select  p_table_name
          ,p_column_name
          ,p_id
          ,p_old_val
          ,p_new_val
   FROM   track_TABLE TT
         ,table(p_audit_row_table) art
   WHERE  tt.TABLE_NAME   = art.p_table_name                       
   AND    tt.column_name  = art.p_column_name         
   AND    tt.allow        = 'Y';
end;
/

CREATE OR REPLACE TRIGGER trg_TRACK   
AFTER INSERT OR UPDATE OR DELETE ON ABC   
FOR EACH ROW   
DECLARE          
  l_id           varchar(50);   
  l_audit_table  t_audit_row_table;
BEGIN        
  l_id := NVL(:old.id, :new.id);        
  -- send all of the values to f_log and have it decide whether to save them   
  l_audit_table := t_audit_row_table (
                      t_audit_row ('ABC','COL1',l_id, :old.col1, :new.col1)  
                      ,t_audit_row ('ABC','COL2',l_id, :old.col2, :new.col2)  
                      ,t_audit_row ('ABC','COL3',l_id, :old.col3, :new.col3)  
                      ,...  
                      ,t_audit_row ('ABC','COLn',l_id, :old.coln, :new.coln)  
                   );
  f_log(l_audit_table);
end;
/


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. उत्परिवर्तित तालिका को हटाने पर SQL ट्रिगर

  2. ओरेकल क्वेरी को कैसे अनुकूलित करें जिसमें तारीख के लिए खंड में to_char है

  3. Oracle से SQL सर्वर माइग्रेशन करने के बाद मैंने अपना SysDB डेटाबेस खो दिया। मैं इसे फिर से कैसे बना सकता हूं?

  4. क्या Oracle अस्थायी तालिका पर अनुक्रमणिका डालना सुरक्षित है?

  5. इकाई फ्रेमवर्क डेटाबेस-पहले Oracle डाटाबेस के साथ