2012-05-07 15 views

risposta

20

che si sta utilizzando la parola chiave replace non v'è alcuna necessità di verificare se il sinonimo esiste prima. Sovrascriverete qualunque sinonimo esistesse con il nome precedente.

L'unico motivo per diffidare dell'utilizzo di replace è se si potrebbe avere un sinonimo diverso con lo stesso nome. Se il tuo database è organizzato bene, questo non dovrebbe accadere. Dovresti sempre sapere quali sono tutti i tuoi oggetti e dove puntano i sinonimi.

Tuttavia, se si vuole ci sono un paio di opzioni:

  1. Rimuovere replace. L'istruzione genererà un errore se il sinonimo esiste già e non verrà sovrascritto.
  2. Interrogare il dizionario dei dati, dato che ci si trova in più schemi all_synonyms sembra la soluzione migliore.

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

Se si desidera combinare questi in un unico blocco, allora si può fare qualcosa di simile:

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; 
/

Su un po 'separato non Si prega di non citazione vostri nomi degli oggetti. Oracle può avere oggetti cased, ma è molto, molto raramente vale la pena. Tutti gli oggetti saranno automaticamente sovraimpressi, quindi non è necessario lo ".

-1

Penso che se è stato rimosso il O NON SOSTITUIAMO parola chiave vi verrà chiesto che esiste

oppure è possibile creare pl/codice SQL utilizzando queste tabelle

desc dba_synonyms 
desc user_synonyms 

Per renderlo più flessibile e personalizzata

Supponendo 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; 

/

Qui il costume zione per il vostro problema

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

puoi dirmi la sintassi per l'opzione 2. Questo è quello che sto cercando. –

+0

qui un esempio di guida http://snipplr.com/view/39190/create-synonyms/ sono sicuro che questo è quello che vuoi spero di darmi risposta thankx in anticipo – shareef

+0

hay bro questo è più complesso e cosa penso che sarà copia tutti gli oggetti. –