MINI MINI MANI MO
@@?/rdbms/admin/sqlsessstart.sql
alter session set current_schema=MDSYS;
create or replace trigger sdo_sem_drop_trigger
before drop on database
declare
type vcurType is REF CURSOR;
vcur vcurType;
stmt VARCHAR2(4000);
stm2 VARCHAR2(4000);
rdt VARCHAR2(270);
rsid number;
cnt number;
m_id number;
model varchar2(100);
rdf_exception EXCEPTION;
pragma exception_init(rdf_exception, -55331);
e_cannot_multi_mod EXCEPTION;
PRAGMA EXCEPTION_INIT (e_cannot_multi_mod, -30512);
begin
if sys.dbms_standard.dictionary_obj_type = 'USER' THEN
BEGIN
EXECUTE IMMEDIATE
'begin ' ||
'mdsys.rdf_apis_internal.' ||
'notify_drop_user( :don ); ' ||
'end;'
USING sys.dbms_standard.dictionary_obj_name;
EXCEPTION
WHEN rdf_exception THEN RAISE;
WHEN OTHERS THEN
SYS.DBMS_SYSTEM.KSDWRT(SYS.DBMS_SYSTEM.TRACE_FILE,
'EXCEPTION[sdosemtrig.sql(' || $$PLSQL_LINE || ')1]: ' || SQLERRM); RAISE;
END;
RETURN;
end if;
if (sys.dbms_standard.dictionary_obj_type <> 'TABLE') then
return;
end if;
if (sys.dbms_standard.dictionary_obj_owner = 'MDSYS') then
if (sys.dbms_standard.dictionary_obj_name like 'RDF_%') or
(sys.dbms_standard.dictionary_obj_name like 'RDF#%') then
return;
end if;
end if;
stmt := 'select count(*) from sys.all_views ' ||
' where owner = ''MDSYS'' and view_name = ''RDF_MODEL$'' ';
execute immediate stmt into cnt;
if (cnt = 1) then
begin
cnt := 0;
stmt := 'SELECT count(*) FROM MDSYS.RDF_MODEL$ ' ||
' WHERE OWNER = :1 AND TABLE_NAME = :2';
begin
execute immediate stmt into cnt using sys.dbms_standard.dictionary_obj_owner,
sys.dbms_standard.dictionary_obj_name;
exception
when e_cannot_multi_mod then
if (substr(sys.dbms_standard.dictionary_obj_name, 1, 4)='BIN$' or
substr(sys.dbms_standard.dictionary_obj_name, 1,13)='SYS_IOT_OVER_') then
return;
else
raise;
end if;
end;
if (cnt > 0) then
raise_application_error(-20000,
'Cannot drop table "' || sys.dbms_standard.dictionary_obj_name ||
'" because this table owns RDF objects');
end if;
end;
end if;
end;
/
show errors;
create or replace trigger sdo_sem_alter_trigger
before ALTER on database
declare
type vcurType is REF CURSOR;
vcur vcurType := null;
stmt VARCHAR2(4000);
stm2 VARCHAR2(4000);
rdt VARCHAR2(270);
rsid number;
cnt number;
m_id number;
model varchar2(100);
cname varchar2(130);
e_cannot_multi_mod EXCEPTION;
PRAGMA EXCEPTION_INIT (e_cannot_multi_mod, -30512);
begin
if (sys.dbms_standard.sysevent <> 'ALTER' or sys.dbms_standard.dictionary_obj_type <> 'TABLE') then
return;
end if;
if (sys.dbms_standard.dictionary_obj_owner = 'MDSYS') then
if (sys.dbms_standard.dictionary_obj_name like 'RDF_%') or
(sys.dbms_standard.dictionary_obj_name like 'RDF#%') then
return;
end if;
end if;
stmt := 'select count(*) from sys.all_views ' ||
' where owner = ''MDSYS'' and view_name = ''RDF_MODEL$'' ';
execute immediate stmt into cnt;
if (cnt = 1) then
begin
cnt := 0;
stmt := 'SELECT count(*) FROM MDSYS.RDF_MODEL$ ' ||
' WHERE OWNER = :1 AND TABLE_NAME = :2';
begin
execute immediate stmt into cnt using sys.dbms_standard.dictionary_obj_owner,
sys.dbms_standard.dictionary_obj_name;
exception
when e_cannot_multi_mod then
if (substr(sys.dbms_standard.dictionary_obj_name, 1, 4)='BIN$' or
substr(sys.dbms_standard.dictionary_obj_name, 1,13)='SYS_IOT_OVER_') then
return;
else
raise;
end if;
end;
if (cnt > 0) then
open vcur for 'SELECT model_name, model_id, column_name ' ||
' FROM MDSYS.RDF_MODEL$ ' ||
' WHERE OWNER = :1 AND TABLE_NAME = :2'
using sys.dbms_standard.dictionary_obj_owner, sys.dbms_standard.dictionary_obj_name;
loop
fetch vcur into model, m_id, cname;
exit when vcur%NOTFOUND;
if (sys.dbms_standard.is_drop_column(cname) or sys.dbms_standard.is_alter_column(cname)) then
if (vcur%isopen) then
close vcur;
end if;
raise_application_error(-20000,
'Cannot alter or drop column "' || cname ||
'" because this column owns RDF objects');
end if;
end loop;
close vcur;
end if;
end;
end if;
end;
/
show errors;
@?/rdbms/admin/sqlsessend.sql
OHA YOOOO