Powered By Blogger

রবিবার, ৫ এপ্রিল, ২০২০

Procedure to create auditing trigger

CREATE OR REPLACE PROCEDURE dp_xx_trgscript (
   in_table_name   VARCHAR2,
   in_table_desc   VARCHAR2
)
AUTHID CURRENT_USER
IS
      /*
   v_script1      VARCHAR2 (4000);
   v_script2      VARCHAR2 (4000);
   v_scritp3      VARCHAR2 (4000);
   */
   v_oldvalue     VARCHAR2 (4000);
   v_changvalue   VARCHAR2 (4000);
   v_recordkey    VARCHAR (1024);
BEGIN
   FOR i IN (SELECT   column_name, reckeyfg
                 FROM xx_triggtab_c
                WHERE sequnumb = (SELECT sequnumb
                                    FROM xx_triggtab_p
                                   WHERE table_name = UPPER (in_table_name))
                  AND slctflag = 1
             ORDER BY column_sequ)
   LOOP
      v_oldvalue :=
            v_oldvalue
         || '||'
         || ''' ; '''
         || '||'
         || ''''
         || i.column_name
         || '= '''
         || '||'
         || ':old.'
         || i.column_name;
      v_changvalue :=
            v_changvalue
         || '||df_xx_checkval ('
         || ''''
         || i.column_name
         || ''''
         || ','
         || ':old.'
         || i.column_name
         || ', '
         || ':new.'
         || i.column_name
         || ')';

      IF i.reckeyfg = 1
      THEN
         v_recordkey :=
               v_recordkey
            || '||'
            || ''' ; '''
            || '||'
            || ''''
            || i.column_name
            || '= '''
            || '||'
            || ':old.'
            || i.column_name;
      END IF;
   END LOOP;

   v_oldvalue := SUBSTR (v_oldvalue, 10);
   v_changvalue := SUBSTR (v_changvalue, 3);
   v_recordkey := SUBSTR (v_recordkey, 10);

   EXECUTE IMMEDIATE    'CREATE OR REPLACE TRIGGER '
                     || 'XX_AUDIT_'
                     || in_table_name
                     || ' BEFORE UPDATE OR DELETE
   ON '
                     || in_table_name
                     || ' FOR EACH ROW
DECLARE
   oldvalue        VARCHAR2 (4000) := NULL;
   changedvalue    VARCHAR2 (4000) := NULL;
   v_table_name varchar2(30) := '
                     || ''''
                     || in_table_name
                     || ''''
                     || ';'
                     || CHR (10)
                     || 'v_table_desc varchar2(50) := '
                     || ''''
                     || in_table_desc
                     || ''''
                     || ';'
                     || CHR (10)
                     || ' v_action_type   VARCHAR2 (1);
   v_audit_id      INTEGER;
   v_sid           NUMBER;
   v_serial        NUMBER;
   v_schemaname    VARCHAR2 (30);
   v_username      VARCHAR2 (30);
   v_appusrid VARCHAR2 (30);
   v_appuser       VARCHAR2 (30);
   v_osuser        VARCHAR2 (30);
   v_machine       VARCHAR2 (64);
   v_program       VARCHAR2 (30);
   v_client_ip     VARCHAR2 (30);
BEGIN
   IF UPDATING
   THEN
      v_action_type := ''U'';
   ELSIF DELETING
   THEN
      v_action_type := ''D'';
   END IF;
   BEGIN
      SELECT a.SID, a.serial#, a.schemaname, a.username, a.osuser,
             a.machine, a.program, (SELECT emp_no
                                FROM sa_session
                               WHERE sid = a.SID AND serial# = a.serial#),
             (SELECT user_name
                FROM hr_emp
               WHERE emp_no =
                             (SELECT emp_no
                                FROM sa_session
                               WHERE sid = a.SID AND serial# = a.serial#)),
             SYS_CONTEXT (''USERENV'', ''IP_ADDRESS'')
        INTO v_sid, v_serial, v_schemaname, v_username, v_osuser,
             v_machine, v_program, v_appusrid,
             v_appuser,
             v_client_ip
        FROM v$session a
       WHERE a.audsid = SYS_CONTEXT (''USERENV'', ''SESSIONID'');
   EXCEPTION
      WHEN OTHERS
      THEN
         NULL;
   END;
 
   SELECT NVL (MAX (audit_id), 0) + 1
     INTO v_audit_id
     FROM xx_audit_log;

   INSERT INTO xx_audit_log
               (sysid, audit_id,
                table_name, table_desc, action_type,
                action_date, record_key, old_value,
                changed_value, schema_name,
                db_user_name, app_user_id, app_user_name, os_user_name, program_used,
                logon_pc_name, logon_pc_ip, org_id, cre_by, cre_dt
               )                             
   VALUES (v_audit_id, v_audit_id,
            v_table_name, v_table_desc, v_action_type,
            SYSDATE, '
                     || v_recordkey
                     || ', '
                     || v_oldvalue
                     || ',
            DECODE (v_action_type, ''D'', '''', '
                     || v_changvalue
                     || '), v_schemaname,
            v_username, v_appusrid, v_appuser, v_osuser, v_program,
            v_machine, v_client_ip, 1, v_appusrid, sysdate
           );
END;';
/*
DBMS_OUTPUT.put_line (   v_script1
                      || CHR (10)
                      || v_script2
                      || CHR (10)
                      || v_scritp3
                      || CHR (10)
                      || 'END;'
                     );
*/

/*
EXECUTE IMMEDIATE    v_script1
                  || CHR (10)
                  || v_script2
                  || CHR (10)
                  || v_scritp3
                  || CHR (10)
                  || 'END;';
*/
EXCEPTION
   WHEN OTHERS
   THEN
      raise_application_error (-20000,
                               'Program Unit Error...' || CHR (10) || SQLERRM
                              );
END;
/

কোন মন্তব্য নেই:

একটি মন্তব্য পোস্ট করুন

Row-level “Add” icon using a virtual column (APEX-safe)

1️⃣ Enable Insert in the Interactive Grid IG → Attributes Edit → Allowed Add Row → Yes 2️⃣ Add a New Column (Icon column) Column...