Benutzer-Werkzeuge

Webseiten-Werkzeuge


Action disabled: index
dba:invalid_objects

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 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);
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
dba/invalid_objects.txt · Zuletzt geändert: 2013/08/14 10:20 von gpipperr