如何检查同义词是否已存在,则不要创建同义词

时间:2012-05-07 07:59:38

标签: sql oracle synonym

我正在使用Oracle SQL developer 2.1创建同义词。

CREATE OR REPLACE SYNONYM "ETKS_PR_RW"."SQ_CLDOS_ATCHMNT_ID" 
    FOR "CLDOS_ONLINE_DBA"."SQ_CLDOS_ATCHMNT_ID";

如果此同义词已经存在,我该如何检查,如果确实存在,则不要创建同义词。

2 个答案:

答案 0 :(得分:25)

当您使用replace关键字时,无需先检查同义词是否存在。您将覆盖以前名称存在的任何同义词。

警惕使用replace的唯一原因是,如果您的同义词具有相同的同名词。如果您的数据库组织良好,则不应发生这种情况。您应该始终知道所有对象是什么以及同义词指向的位置。

但是,如果您确实想要有几个选项:

  1. 删除replace。如果同义词已经存在且不会被覆盖,则该语句将抛出错误。
  2. 查询数据字典,因为您处于多个模式all_synonyms似乎是最好的选择。

    select *
      from all_synonyms
     where owner = 'ETKS_PR_RW'
       and synonym_name = 'SQ_CLDOS_ATCHMNT_ID';
    
  3. 如果你想将它们组合成一个块,那么你可以这样做:

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

    稍微单独而不是请不要引用您的对象名称。 Oracle可以使用套接字的对象,但这非常非常值得麻烦。所有对象都将自动为大写,因此您不需要"

答案 1 :(得分:0)

我认为如果你删除了OR REPLACE关键字,它会提示你它存在

或者您可以使用这些表创建pl / sql代码

desc dba_synonyms
desc user_synonyms

使其更加灵活和定制

假设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;

/ 

这里是您的问题的自定义

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;