René Nyffenegger's collection of things on the web | |
René Nyffenegger on Oracle - Most wanted - Feedback
- Follow @renenyffenegger
|
PL/SQL procedure to create an external table to read the alert.log in Oracle | ||
The following procedure creates an external table that
can be used to read the alert.log.
The user executing the procedure must have the create any directory privilege
to execute external_alert_log.
create or replace procedure external_alert_log as path_bdump varchar2(4000); name_alert varchar2(100); begin select value into path_bdump from sys.v_$parameter where name = 'background_dump_dest'; select 'alert_' || value || '.log' into name_alert from sys.v_$parameter where name = 'db_name'; execute immediate 'create or replace directory background_dump_dest_dir as ''' || path_bdump || ''''; execute immediate 'create table alert_log_external ' || ' (line varchar2(4000) ) ' || ' organization external ' || ' (type oracle_loader ' || ' default directory background_dump_dest_dir ' || ' access parameters ( ' || ' records delimited by newline ' || ' nobadfile ' || ' nologfile ' || ' nodiscardfile ' || ' fields terminated by ''#$~=ui$X''' || ' missing field values are null ' || ' (line) ' || ' ) ' || ' location (''' || name_alert || ''') )' || ' reject limit unlimited '; end; /
Executing the procedure
begin external_alert_log; end; /
Reading the alert log's content:
select * from alert_log_external; ErrorsORA-00942 when compiling
If an ORA-00942: table or view does not exist is thrown when
the procedure is compiled, it is most likely because the user compiling the procedure does not have the
select privilege on v_$parameter.
It should then be granted by sys to the user
compiling the procedure:
SQL> grant select on sys.v_$parameter to rene; ORA-01031 when executing
If Oracle throws an ORA-01031: insufficient privileges when
external_alert_log is called, the user executing this procedure probably lacks the
create any directory and/or create table privilege:
SQL> grant create any directory to rene; SQL> grant create table to rene; Links
See also On reading trace files with PL/SQL where a trace file is read using
a directory.
See also this script to read the alert log which doesn't create a procedure.
Thanks
Thanks to Karl Reitschuster who pointed out a security issue: I used
grant create any table instead of
grant create table . This is now fixed.
|