در صورتی که حجم لاگ ایجاد شده توسط قابلیت unified auditing نسبتا زیاد باشد، برای مراجعه و نگهداری اطلاعات audit trail، ممکن است با مشکل پرفورمنس و کمبود استوریج مواجه شویم بنابرین auditing باید طوری پیکربندی شود که حتی المقدور، اطلاعات اضافه ای در جدول مربوطه، ثبت نگردد.
ویژگی جدید اوراکل 19c که Auditing Only Top-Level SQL Statements نام دارد، می تواند در این زمینه موثر واقع شود.
با کمک این ویژگی، می توان صرفا auditing را برای دستوراتی که مستقیما توسط کاربر اجرا می شوند(اصطلاحا دستورات Top-Level)، فعال کرد و از audit کردن دستوراتی که به تبع فراخوانی پروسیجر اجرا می شوند، صرف نظر نمود.
برای استفاده از این ویژگی، صرفا باید عبارت ONLY TOPLEVEL را به دستور CREATE AUDIT POLICY اضافه کرد همچنین با رجوع به ستون AUDIT_ONLY_TOPLEVEL در ویوی AUDIT_UNIFIED_POLICIES، می توان اسامی audit policyهایی که از این قابلیت استفاده می کنند را مشاهده نمود.مثال زیر را ببینید.
مثال: پروسیجر زیر را در نظر بگیرید:
create or replace procedure myproc1 as
begin
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
insert into mytbl select * from v$datafile;
commit;
end;
قصد داریم بعضی از اقدامات کاربر usef را audit کنیم به این منظور، با دستور زیر، audit policyای را ایجاد می کنیم:
SQL> create audit policy actions_all_pol actions all;
Audit policy created.
سپس audit policy ایجاد شده را برای کاربر usef فعال می کنیم:
SQL> audit policy actions_all_pol by usef;
Audit succeeded.
کاربر usef، پروسیجر myproc1 را اجرا می کند:
SQL> exec myproc1;
PL/SQL procedure successfully completed
با رجوع به ویوی unified_audit_trail خواهیم دید که 11 رکورد برای اجرای این دستور، به audit trail اضافه شده است:
SQL>select count(*) from unified_audit_trail f where f.unified_audit_policies=’ACTIONS_ALL_POL’;
11
اطلاعات ثبت شده را با اجرای دستور زیر می بینیم:
SQL> select f.sessionid,f.action_name,f.object_schema,f.object_name from unified_audit_trail f where f.unified_audit_policies=’ACTIONS_ALL_POL’;
همانطور که قابل مشاهده است، متن دستورات insertای که در پروسیجر myproc1 موجود هستند در audit trail ثبت شده اند.
حال قصد داریم از ویژگی Auditing Only Top-Level SQL Statements کمک گرفته و از ثبت اطلاعات اضافی جلوگیری کنیم. پس روال را مجددا تکرار می کنیم.
—حذف اطلاعاتی فعلی جدول aud$unified و غیرفعال سازی audit policy ایجاد شده:
SQL>begin
dbms_audit_mgmt.clean_audit_trail(audit_trail_type=>dbms_audit_mgmt.audit_trail_unified,use_last_arch_timestamp=>false);
end;
/
SQL> noaudit policy actions_all_pol by usef;
Noaudit succeeded.
—ایجاد audit policy جدید همراه با عبارت ONLY TOPLEVEL:
SQL> create audit policy TOPLEVEL_on actions all ONLY TOPLEVEL;
Audit policy created.
—فعال سازی audit policy ایجاد شده برای کاربر usef:
SQL> audit policy TOPLEVEL_on by usef;
Audit succeeded.
—اجرای پروسیجر توسط کاربر usef:
SQL> exec myproc1;
PL/SQL procedure successfully completed
—با اجرای این پروسیجر، صرفا 1 رکورد به audit trail اضافه خواهد شد:
SQL> select f.sessionid,f.action_name,f.sql_text from unified_audit_trail f where f.unified_audit_policies=’TOPLEVEL_ON’;
همانطور که می بینید، با کمک ویژگی Auditing Only Top-Level SQL Statements، تنها دستوری که مستقیما توسط کاربر اجرا شده است، در audit trail ثبت خواهد شد.
Comment (1)