2012-05-07 5 views

Antwort

20

Wie Sie das replace Schlüsselwort verwenden es keine Notwendigkeit, zu prüfen, ob das Synonym zuerst existiert. Sie überschreiben das Synonym, das mit dem vorherigen Namen existiert.

Der einzige Grund, vorsichtig zu sein, mit replace ist, wenn Sie ein anderes Synonym mit dem gleichen Namen haben könnte. Wenn Ihre Datenbank gut organisiert ist, sollte dies nicht passieren. Sie sollten immer wissen, was alle Ihre Objekte sind und wo die Synonyme zeigen.

Wenn Sie jedoch wollen, um dort ein paar Optionen sind:

  1. entfernen replace. Die Anweisung wird einen Fehler ausgeben, wenn das Synonym bereits existiert und nicht überschrieben wird.
  2. Abfrage der Daten-Wörterbuch, wie Sie in mehreren Schemas sind scheint all_synonyms wie die beste Wette.

    select * 
        from all_synonyms 
    where owner = 'ETKS_PR_RW' 
        and synonym_name = 'SQ_CLDOS_ATCHMNT_ID'; 
    

Wenn Sie diese in einem einzigen Block kombinieren möchten, dann können Sie etwas tun:

declare 

    l_exists number; 

begin 
    -- check whether the synonym exists 
    select 1 
    into l_exists 
    from all_synonyms 
    where owner = 'ETKS_PR_RW' 
     and synonym_name = 'SQ_CLDOS_ATCHMNT_ID'; 

-- an error gets raise if it doesn-t. 
exception when no_data_found then 
    -- DDL has to be done inside execute immediate in a block. 
    execute immediate 'CREATE OR REPLACE SYNONYM ETKS_PR_RW.SQ_CLDOS_ATCHMNT_ID 
        FOR CLDOS_ONLINE_DBA.SQ_CLDOS_ATCHMNT_ID'; 

end; 
/

auf einem leicht trennen nicht bitte nicht Zitat Ihre Objektnamen tun. Oracle kann Objekte verkapselt haben, aber es ist sehr, sehr selten den Aufwand wert. Alle Objekte werden automatisch in Großbuchstaben, so dass Sie nicht die " benötigen.

-1

Ich denke, wenn Sie die OR REPLACE Schlüsselwort entfernt werden Sie aufgefordert, dass es

existieren Oder Sie können PL/SQL-Code erstellen, um diese Tabellen mit

desc dba_synonyms 
desc user_synonyms 

Um es flexibler und kundenspezifische

Unter der Annahme, Oracle PL/SQL

DECLARE 
    src_schema VARCHAR2(256) := 'EMPIK_DYNAMO_01'; 
    target_schema VARCHAR2(256) := 'EMPIK_PORTAL_BETA_1'; 
    CURSOR src_objects IS 
     SELECT table_name AS object_name 
     FROM all_all_tables 
     WHERE owner = src_schema 
     UNION 
     SELECT sequence_name AS object_name 
     FROM all_sequences 
     WHERE sequence_owner = src_schema; 
BEGIN 
    FOR next_row IN src_objects LOOP 
     BEGIN 
      EXECUTE IMMEDIATE 'CREATE or REPLACE SYNONYM '|| target_schema|| '.' 
      || 
      next_row.object_name|| ' for '|| src_schema|| '.'|| 
      next_row.object_name; 
     EXCEPTION 
      WHEN OTHERS THEN 
       dbms_output.Put_line('ERROR WHILE CREATING SYNONYM FOR: ' 
            || next_row.object_name); 

       dbms_output.Put_line(SQLERRM); 
     END; 
    END LOOP; 
END; 

/

Hier ist der Brauch isierung für Ihr Problem

BEGIN 
    EXECUTE IMMEDIATE 'CREATE or REPLACE SYNONYM ETKS_PR_RW.SQ_CLDOS_ATCHMNT_ID FOR CLDOS_ONLINE_DBA.SQ_CLDOS_ATCHMNT_ID'; 
EXCEPTION 
    WHEN OTHERS THEN 
     dbms_output.Put_line ('ERROR WHILE CREATING SYNONYM FOR: SQ_CLDOS_ATCHMNT_ID'); 
     dbms_output.Put_line (SQLERRM); 
END; 
+0

können Sie mir sagen, Syntax für die Option 2. Dies ist, was ich suche. –

+0

hier ein Führungs Beispiel http://snipplr.com/view/39190/create-synonyms/ bin sicher, das ist, was Sie wollen, ich mir Hoffnung geben Antwort thankx im Voraus – shareef

+0

Heu akzeptieren bro dies komplexer ist und was ich denke, es wird Kopiere alle Objekte. –