Frage

Ich bin vertraut mit dem Problem hinter der ORA-01775:looping Kette von Synonymen, aber gibt es irgendeinen trick, um zu Debuggen, oder muss ich nur noch auf "create or replace" my way out of it?

Gibt es eine Möglichkeit, die Abfrage der schema-oder was auch immer, um herauszufinden, was die aktuelle definition einer öffentlichen synonym ist?

Noch beeindruckender wäre ein grafisches tool, aber an diesem Punkt, alles andere wäre hilfreich.

War es hilfreich?

Lösung

Wie sich herausstellt, ist das Problem nicht wirklich eine Looping-Kette von Synonymen, sondern die Tatsache, dass das Synonym zu einer Ansicht deutete, das nicht existiert.

Oracle offenbar Fehler aus als Schleifenkette in diesem Zustand.

Andere Tipps

Wenn Sie TOAD verwenden, gehen Sie zu Ansicht> Toad Optionen> Oracle> Allgemein und entfernen TOAD_PLAN_TABLE von PLAN Abschnitt EXPLAIN und setzen PLAN_TABLE

Das Data Dictionary Tabelle DBA_SYNONYMS hat Informationen über alle Synonyme in einer Datenbank. So können Sie die Abfrage ausführen

SELECT table_owner, table_name, db_link
  FROM dba_synonyms 
 WHERE owner        = 'PUBLIC'
   AND synonym_name = <<synonym name>>

, um zu sehen, was die Öffentlichkeit Synonym zur Zeit deutet auf.

Je weniger intuitive Lösung für diesen Fehlercode scheint Probleme mit den Objekten zu sein, die das Synonym verweist.

Hier ist meine SQL für Synonyme zu finden, die zu fehlerhaften Objekten zeigen.

SELECT S.OWNER as SYN_OWNER, S.SYNONYM_NAME as SYN_NAME,
    S.TABLE_OWNER as OBJ_OWNER, S.TABLE_NAME as OBJ_NAME,
    CASE WHEN O.OWNER is null THEN 'MISSING' ELSE O.STATUS END as OBJ_STATUS
FROM DBA_SYNONYMS S
    LEFT JOIN DBA_OBJECTS O ON S.TABLE_OWNER = O.OWNER AND S.TABLE_NAME = O.OBJECT_NAME
WHERE O.OWNER is null
    OR O.STATUS != 'VALID';

Versuchen Sie, diese wählen Sie die problematische um Synonyme zu finden, es listet alle Synonyme, die auf ein Objekt verweisen, die nicht existieren (Tabellen, Views, Sequenzen, die Pakete, Prozeduren, Funktionen)

SELECT *
FROM dba_synonyms
WHERE table_owner = 'USER'
    AND (
        NOT EXISTS (
            SELECT *
            FROM dba_tables
            WHERE dba_synonyms.table_name = dba_tables.TABLE_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_views
            WHERE dba_synonyms.table_name = dba_views.VIEW_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_sequences
            WHERE dba_synonyms.table_name = dba_sequences.sequence_NAME
            )
        AND NOT EXISTS (
            SELECT *
            FROM dba_dependencies
            WHERE type IN (
                    'PACKAGE'
                    ,'PROCEDURE'
                    ,'FUNCTION'
                    )
                AND dba_synonyms.table_name = dba_dependencies.NAME
            )
        )

Heute habe ich diesen Fehler, und nach dem Debuggen ich herausgefunden, dass die tatsächlichen Tabellen wurden misssing, die ich mit Synonymen bezog. Also schlage ich vor - zunächst, dass prüfen, ob die Tabellen vorhanden !! : -))

Ein Entwickler versehentlich Code geschrieben hat, die die folgende SQL-Anweisung CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL"; erzeugt und lief die select * from dba_synonyms where table_name = 'DUAL'; verursacht PUBLIC DUAL SOME_USER DUAL statt PUBLIC DUAL SYS DUAL zurückzukehren.

Wir waren in der Lage, es zu beheben (dank href="https://stackoverflow.com/questions/30504918/how-to-recreate-public-synonym-dual"> auf ), indem Sie

ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=FALSE SCOPE=MEMORY;
CREATE OR REPLACE PUBLIC SYNONYM DUAL FOR SYS.DUAL;
ALTER SYSTEM SET "_SYSTEM_TRIG_ENABLED"=true SCOPE=MEMORY;

Ich hatte ein ähnliches Problem, das durch fehlende doppelte Anführungszeichen aus dem Tabellen- und Schemanamen verursacht werden erwies sich.

Wir hatten die gleichen ORA-01775 Fehler, aber in unserem Fall wurde der Schema-Benutzer auf ein paar des öffentlichen Synonyme einig ‚Zuschuss wählt‘ fehlt.

Schritt 1) zu Sehen, welche Objekte vorhanden sind, mit dem Namen:

select * from all_objects where object_name = upper('&object_name');

Es könnte sein, dass ein Synonym vorhanden ist, aber kein Tisch?


Schritt 2) Wenn, dass ist nicht das problem, untersuchen Synonym:

select * from all_synonyms where synonym_name = upper('&synonym_name');

Es könnte sein, dass einer zugrunde liegenden Tabelle oder Sicht, die Synonym fehlt?

Wir stießen auf diesen Fehler heute. Dies ist, wie wir ausgetestet und fixiert es.

  1. Paket ging Zustand aufgrund dieses Fehlers ORA-01775 auf ungültig.

  2. Mit der Fehlerzeilennummer, gingen wir durch den package Körper-Code und den Code gefunden, die Daten in eine table einfügen wollte.

  3. Wir liefen unter Abfragen zu überprüfen, ob die oben table und synonym vorhanden ist.

    SELECT * FROM DBA_TABLES WHERE TABLE_NAME = '&TABLE_NAME';  -- No rows returned
    
    SELECT * FROM DBA_SYNONYMS WHERE SYNONYM_NAME = '&SYNONYM_NAME'; -- 1 row returned
    
  4. Damit schlossen wir, dass die Tabelle wieder- erstellt werden muss. Da die synonym deutete auf eine table, das nicht existiert.

  5. DBA Team neu erstellt die Tabelle und das das Problem behoben.

ORA-01775: Schleifen Kette von Synonymen Ich stand vor den oben genannten Fehlern, während ich versuche, ein Paket zu erstellen, die ein Objekt wurde mit für das Synonym jedoch erstellt wurde Aufgabe zugrunde, war nicht verfügbar.

Ich verwende die folgenden SQL-Einträge in all_synonyms zu finden, wo es kein entsprechendes Objekt für das object_name ist (in user_objects):

 select * 
   from all_synonyms 
   where table_owner = 'SCOTT' 
     and synonym_name not like '%/%'
     and table_name not in (
       select object_name from user_objects
         where object_type in (
           'TABLE', 'VIEW', 'PACKAGE', 'SEQUENCE',
           'PROCEDURE', 'FUNCTION', 'TYPE'
         )
    );

http://ora-01775.ora-code.com/ schlägt vor:

ORA-01775 : Looping Kette von Synonymen
Ursache : Durch eine Reihe von Synonym Anweisungen CREATE wurde ein Synonym definiert, die auf sich selbst bezeichnet. Zum Beispiel sind die folgenden Definitionen Kreis:
CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1
Aktion : Ändern Sie eine Synonymdefinition, so dass es auf eine Basistabelle oder Ansicht gilt und wiederholen Sie den Vorgang

.

Wenn Sie eine Prozedur kompilieren, möglicherweise wird dies unter Bezugnahme auf eine Tabelle oder Sicht, die nicht existiert, wie es in dem gleichen Verfahren erstellt wird. In diesem Fall ist die Lösung die Abfrage als String zB v_query: = 'insert into table select * from table2 erklärt zu machen und dann sofort auf v_query auszuführen;

Das ist, weil der Compiler noch nicht das Objekt erkennen und daher nicht die Referenz nicht findet. Grüße.

Ich hatte eine Funktion in dem falschen Schema definiert und ohne öffentliches Synonym. D. h mein proc war in Schema "Dogs" und die Funktion war in Schema "Cats". Die Funktion hat kein öffentliches Synonym darauf mußte Hunde erlauben Funktion die Katzen zugreifen zu können.

Für mich ist der Tabellenname und das Synonym sowohl existierte aber unter verschiedenen Namen Eigentümer. Ich neu erstellt die Tabellen unter dem Besitzernamen, die den Namen des Besitzers in Synonyme abgestimmt.

Ich habe die gebuchten Abfragen von @ Mahi_0707

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top