2012-05-07 31 views

Respuesta

20

usted está utilizando la palabra clave replace no hay necesidad de comprobar si el sinónimo existe en primer lugar. Sobreescribirá cualquier sinónimo que exista con el nombre anterior.

La única razón para desconfiar de usar replace es si puede tener un sinónimo diferente con el mismo nombre. Si su base de datos está bien organizada, esto no debería suceder. Siempre debe saber cuáles son todos sus objetos y hacia dónde apuntan los sinónimos.

Sin embargo, si usted quiere, hay un par de opciones:

  1. Retire replace. La declaración arrojará un error si el sinónimo ya existe y no se sobrescribirá.
  2. Consulta el diccionario de datos, ya que estás en esquemas múltiples all_synonyms parece ser la mejor opción.

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

Si desea combinar estos en un solo bloque, entonces usted puede hacer algo como esto:

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

En un separar ligeramente no Por favor, no cita sus nombres de objeto. Oracle puede haber encauzado objetos, pero muy, muy raramente, vale la pena la molestia. Todos los objetos se colocarán en mayúsculas automáticamente, por lo que no necesita el ".

-1

Creo que si ha quitado OR REPLACE palabra clave se le pedirá que existe

o puede crear código PL/SQL con estas tablas

desc dba_synonyms 
desc user_synonyms 

Para hacerlo más flexible y personalizada

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

/

Aquí la costumbre zación para su 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

me puede decir sintaxis para la opción 2. Esto es lo que estoy buscando. –

+0

aquí un ejemplo de guía http://snipplr.com/view/39190/create-synonyms/ estoy seguro de que esto es lo que quieres espero que me dejes aceptar la respuesta gracias de antemano – shareef

+0

hay bro esto es más complejo y lo que creo que lo hará copia todos los objetos. –

Cuestiones relacionadas