The requirement was to log changes to columns on any table
to a common table. The information to be recorded was Table Name, Column Name,
Action (Deletion, Insertion, and Modification), Old Value, New Value, Modified
User, Modified Time and Modified PC.
The solution I came up with is to create the triggers on
table using a script that trigger that fires on Update Delete and Insert. This
trigger sends the information to a function that checks for changes. In the function
if there are changes it will be logged to the Audit table. When calling the
function I checked for the ‘Action’ and according to that change the
information send to it.
The functions are in a pakage and the script to create the package is below
create or replace package audit_pkg
as
procedure check_val( l_tname in varchar2,
l_cname in varchar2,
l_new in varchar2,
l_old in varchar2 ,l_action in varchar2,l_user in varchar2, l_date in varchar2,l_machine in varchar2);
procedure check_val( l_tname in varchar2,
l_cname in varchar2,
l_new in date,
l_old in date ,l_action in varchar2,l_user in varchar2, l_date in varchar2,l_machine in varchar2);
procedure check_val( l_tname in varchar2,
l_cname in varchar2,
l_new in number,
l_old in number ,l_action in varchar2,l_user in varchar2, l_date in varchar2,l_machine in varchar2);
end;
/
create or replace package body audit_pkg
as
procedure check_val( l_tname in varchar2,
l_cname in varchar2,
l_new in varchar2,
l_old in varchar2
,l_action in varchar2,l_user in varchar2, l_date in varchar2,l_machine in varchar2 )
is
begin
if ( l_new <> l_old or
(l_new is null and l_old is not NULL) or
(l_new is not null and l_old is NULL) )
then
insert into imago_admin_audit values
( upper(l_tname), upper(l_cname),l_action,
l_old, l_new ,l_user,l_date,l_machine);
end if;
end;
procedure check_val( l_tname in varchar2, l_cname in varchar2,
l_new in date, l_old in date
,l_action in varchar2,l_user in varchar2, l_date in varchar2,l_machine in varchar2 )
is
begin
if ( l_new <> l_old or
(l_new is null and l_old is not NULL) or
(l_new is not null and l_old is NULL) )
then
insert into imago_admin_audit values
( upper(l_tname), upper(l_cname),l_action,
to_char( l_old, 'dd-mon-yyyy hh24:mi:ss' ),
to_char( l_new, 'dd-mon-yyyy hh23:mi:ss' ) ,l_user,l_date,l_machine);
end if;
end;
procedure check_val( l_tname in varchar2, l_cname in varchar2,
l_new in number, l_old in number
,l_action in varchar2,l_user in varchar2, l_date in varchar2,l_machine in varchar2)
is
begin
if ( l_new <> l_old or
(l_new is null and l_old is not NULL) or
(l_new is not null and l_old is NULL) )
then
insert into imago_admin_audit values
(upper(l_tname), upper(l_cname),l_action,
l_old, l_new ,l_user,l_date,l_machine);
end if;
end;
end audit_pkg;
/
these are three over loaded functions according by the data type of changed columns.
This is the script to create the trigger. If it is in "C:\Scripts\" , it is named as "mytrigger.sql" and the table we want to create the triger on is "Table1", then run a something this command in sql command window >@C:\Scripts\mytrigger.sql Table1
set serveroutput on
set feedback off
set verify off
set embedded on
set heading off
spool tmp.sql
prompt create or replace trigger aud#&1
prompt after update or delete or insert on &1
prompt for each row
prompt declare
prompt action varchar2(255) := 'Added';;
prompt begin
prompt if updating then
prompt begin
prompt action := 'Modified';;
select ' audit_pkg.check_val( ''&1'', ''' || column_name ||
''', ' || ':new.' || column_name || ', :old.' ||
column_name || ',action , :new.modifieduser, :new.modifieddatetime, :new.modifiedmachine ' || ');'
from user_tab_columns where table_name = upper('&1') ;
prompt end;;
prompt else if deleting then
prompt begin
prompt action := 'deleted';;
select ' audit_pkg.check_val( ''&1'', ''' || column_name ||
''', ' || ':new.' || column_name || ', :old.' ||
column_name || ',action , '''', '''', '''' ' || ');'
from user_tab_columns where table_name = upper('&1') ;
prompt end;;
prompt else if inserting then
prompt begin
prompt action := 'Added';;
select ' audit_pkg.check_val( ''&1'', ''' || column_name ||
''', ' || ':new.' || column_name || ', :old.' ||
column_name || ',action , :new.createduser, :new.createddatetime, :new.createdmachine ' || ');'
from user_tab_columns where table_name = upper('&1') ;
prompt end;;
prompt end if;;
prompt end if;;
prompt end if;;
Explanation:
If updating then
This line checks whether this is updating so the table
according to that you can set the action. Same way you can get if it is inserting or deleting.
;;
This is used to print the semicolon,otherwise it will be considered as the command, not as string to print.
Information like 'createduser' are columns in the table that filled with the insert query and modifieduser is filled with update query.
There are lots of information about oracle have spread around the web, but this is a unique one according to me. The strategy you have updated here will make me to get to the next level in oracle. Thanks for sharing this.
ReplyDeleteOracle Course in Chennai | Oracle Training in Chennai | hadoop training in chennai
Excellent post!!!. The strategy you have posted on this technology helped me to get into the next level and had lot of information in it.
ReplyDeleteSAS Training in Chennai | SAS Course in Chennai
Much obliged to you for requiring significant investment to give us a portion of the valuable and restrictive data with us.
ReplyDeleteRegards,
SAS Training Institute in Chennai | SAS Training
Chennai | SAS Courses in Chennai
Thanks admin, I had spent more time with your website, because this is one of the best resources I have found it. Your information is really useful to me.
ReplyDeleteRegards,
oracle Training in Chennai | oracle Training center in Chennai | oracle courses in Chennai
You start to squeeze the trigger... and it jerks. There goes your aim, the deer you were targeting runs off into the trees, frightened but unscathed. How do you control your trigger? BRIAN
ReplyDeleteOracle VM is the x86 server virtualization solution from Oracle, designed to be the best virtualization platform to run Oracle technologies. It is Oracle's only tested, certified and supported x86 virtualization solution.
ReplyDeletesalesforce datawarehouse
It has been simply incredibly generous with you to provide openly what exactly many individuals would’ve marketed for an eBook to end up making some cash for their end, primarily given that you could have tried it in the event you wanted "Oracle Training in Bangalore"."Devops Training in Bangalore"
ReplyDeleteYour info is really amazing with impressive content..Excellent blog with informative concept. Really I feel happy to see this useful blog, Thanks for sharing such a nice blog..
ReplyDeleteIf you are looking for any python Related information please visit our website Python classes in pune page!
I appreciate for this useful blog...keep sharing
ReplyDeleteDOT NET Training in Chennai
DOT NET Training in Bangalore
.net coaching centre in chennai
dot net training institutes in bangalore
aws training in bangalore
Data Science Courses in Bangalore
DevOps Training in Bangalore
PHP Training in bangalore
spoken english classes in bangalore
dot net training institute in marathahalli
Really nice post. Thank you for sharing amazing information.
ReplyDeleteaws Training in Bangalore
python Training in Bangalore
hadoop Training in Bangalore
angular js Training in Bangalore
bigdata analytics Training in Bangalore
python Training in Bangalore
aws Training in Bangalore
Keep reading to find out why you should never pay money for an essay online. thanks a lot guys.
ReplyDeleteAi & Artificial Intelligence Course in Chennai
PHP Training in Chennai
Ethical Hacking Course in Chennai Blue Prism Training in Chennai
UiPath Training in Chennai
Remain from the dullness of wedded life and do anything unique which will include more joy to your husband’s day. Change this fuzzy morning a wonderful one and welcome him an extremely special morning Love Husband Good Morning Images
ReplyDelete