Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Mailing Lists -> Oracle-L -> Recording Destructive SQL Trapping "Alter Table Drop Column" So
Yes, but how does one do that? I was really hoping someone would post an answer since there were other people wanting to be able to the same or something very similar. Failing to get a response. I wrote my own; actually, I took some code provided by Steve Adams for a different purpose and put "instr" and "sessionid" restrictions on it. Be warned the code provided below has not been thoroughly tested.
select
'x'
from
sys.x$_kglpn p,
sys.x$_kglcursor c,
v$_session s
where
p.kglpnhdl = c.kglhdadr and
p.kglpnses = s.saddr and
instr(lower(replace(c.kglnaobj,' ', null)),'dropcolumn') > 0 and instr(lower(c.kglnaobj),'select') = 0 and s.audsid = sys_context('USERENV', 'SESSIONID');
All this does is to make sure "drop column" was part of the statement and "select" is not. The check for the "alter table" is done in the event trigger. The full text of the trigger is
pcolumn_name dba_tab_columns.column_name%type; cursor get_column_name is
select column_name from dba_tab_columns where owner = ora_dict_obj_owner and table_name = ora_dict_obj_name;sql_dummy varchar2(1);
sys.x$_kglpn p, sys.x$_kglcursor c,
Begin
if (((ora_sysevent = 'DROP') and (ora_dict_obj_type = 'TABLE')) or ora_sysevent = 'TRUNCATE') and ora_dict_obj_owner != 'SYS' THEN
object_security.record_destructive_ddl(null); elsif ora_sysevent = 'ALTER' and ora_dict_obj_type = 'TABLE' and ora_dict_obj_owner != 'SYS' THEN
open is_drop_column; fetch is_drop_column into sql_dummy; close is_drop_column; if sql_dummy = 'x' then open get_column_name; loop fetch get_column_name into pcolumn_name; exit when get_column_name%notfound; if ora_is_drop_column(pcolumn_name) then object_security.record_destructive_ddl(pcolumn_name); end if; end loop; end if; close get_column_name;
Create or replace package object_security is
procedure RECORD_destructive_ddl(cname varchar2);
end object_security;
/
create or replace package body object_security is
procedure RECORD_destructive_ddl(cname varchar2) is
PRAGMA AUTONOMOUS_TRANSACTION;
Begin
INSERT INTO oracle.DESTRUCTIVE_DDL_JOURNAL VALUES (ora_login_user, ora_dict_obj_owner, ora_dict_obj_name, ora_dict_obj_type, cname,ora_sysevent,ora_client_ip_address, sysdate); commit;
Ian MacGregor
Stanford Linear Accelerator Center
ian_at_slac.stanford.edu
-----Original Message-----
Sent: Monday, June 11, 2001 11:26 AM
To: Multiple recipients of list ORACLE-L
You are getting current SQL but you need to go thru all SQL for this session to find out if there was alter table drop (column).
Alex Hillman
-- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: MacGregor, Ian A. INET: ian_at_SLAC.Stanford.EDU Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051 San Diego, California -- Public Internet access / Mailing Lists -------------------------------------------------------------------- To REMOVE yourself from this mailing list, send an E-Mail message to: ListGuru_at_fatcity.com (note EXACT spelling of 'ListGuru') and in the message BODY, include a line containing: UNSUB ORACLE-L (or the name of mailing list you want to be removed from). You may also send the HELP command for other information (like subscribing).Received on Mon Jun 11 2001 - 17:10:50 CDT