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

SOF*_*ser 12 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";
Run Code Online (Sandbox Code Playgroud)

如果此同义词已经存在,我该怎么检查,如果有,则不要创建同义词.

Ben*_*Ben 25

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

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

但是,如果您确实想要有以下几种选择:

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

    select *
      from all_synonyms
     where owner = 'ETKS_PR_RW'
       and synonym_name = 'SQ_CLDOS_ATCHMNT_ID';
    
    Run Code Online (Sandbox Code Playgroud)

如果您想将这些组合成一个块,那么您可以执行以下操作:

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;
/
Run Code Online (Sandbox Code Playgroud)

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