====== Ungültige Objekte in der DB "reparieren" ====== In einer produktiven Datenbank sollten kleine Objekte ungültig sein und die Entwickler sollten bei ungültigen Objekten diese "reparieren".\\ Folgendes Schript hilft die schlimmsten Fehler zu beseitigen, wenn z.b. der Oracle Enterprise Manager hunderte von ungültigen Objekten anmerkt.\\ SQL ausführen und erstellte Scripte sorgfältig prüfen und damit die Lage hoffentlich verbessern. -- 0. Was ist ungültig select count(*),owner,object_type from all_objects where status !='VALID' group by owner,object_type order by 2; -- 1. Alle ungültigen Objekte neu übersetzen spool alter_obj.sql select 'alter '||object_type ||' '||owner||'."'||object_name||'" compile;' from all_objects where status !='VALID' and object_type !='SYNONYM' order by owner; spool off -- 2. Alle ungültigen Synonyme in der DB löschen (Synonym zeigt auf ein Objekt das es nicht mehr gibt) spool drop_synonym.sql select 'drop '||decode (s.owner,'PUBLIC','PUBLIC SYNONYM ','SYNONYM '||s.owner||'.')||s.synonym_name||';' from dba_synonyms s where table_owner not in('SYSTEM','SYS') and db_link is null and not exists (select 1 from dba_objects o where s.table_owner=o.owner and s.table_name=o.object_name); spool off; -- 3. Invalid Synonyme wieder in den Status valid versetzen, indem das Objekt "angefasst" wird spool select_all.sql select 'desc '||decode(owner,'PUBLIC','',owner||'.')||'"'||object_name||'"' from all_objects where status !='VALID' order by owner spool off Die obigen erzeugten Skripte nun prüfen und per SQL*Plus aufrufen -- 4. Was bleibt übrig? Und muss dann im Detail repariert werden! select count(*),owner,object_type from all_objects where status !='VALID' group by owner,object_type order by 2; Script für die gelegentliche Überwachung ( siehe auch aktuellste Version unter [[http://orapowershell.codeplex.com/SourceControl/latest#sql/invalid.sql|invalid.sql]] ) ttitle center "Invaild Objects in the database" SKIP 2 column owner format a10 column object_type format a14 select owner ,object_type ,count(*) as anzahl from all_objects where status!='VALID' group by rollup (owner,object_type) / ttitle off prompt "List of invalid Objects" select 'desc '||decode (owner,'PUBLIC','',owner||'.')||object_name as TOUCH_ME from all_objects where status!='VALID' / prompt "delete Script for invalid synonym - synonym points on an not existing object" SELECT 'drop '||decode (s.owner,'PUBLIC','PUBLIC SYNONYM ','SYNONYM '||s.owner||'.')||s.synonym_name||';' as DELETE_ME FROM dba_synonyms s WHERE table_owner NOT IN('SYSTEM','SYS') AND( db_link IS NULL or db_link ='PUBLIC') AND NOT EXISTS (SELECT 1 FROM dba_objects o WHERE decode (s.table_owner,'PUBLIC',o.owner,s.table_owner)=o.owner AND s.table_name=o.object_name); {{tag>sql script}}