首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查如果同义词已经存在,则不创建同义词

如何检查如果同义词已经存在,则不创建同义词
EN

Stack Overflow用户
提问于 2012-05-07 15:59:38
回答 2查看 95.7K关注 0票数 14

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

代码语言:javascript
复制
CREATE OR REPLACE SYNONYM "ETKS_PR_RW"."SQ_CLDOS_ATCHMNT_ID" 
    FOR "CLDOS_ONLINE_DBA"."SQ_CLDOS_ATCHMNT_ID";

我如何检查如果这个同义词已经存在,那么如果它已经存在,就不要创建这个同义词。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-07 17:44:49

因为您使用的是replace关键字,所以不需要先检查同义词是否存在。您将覆盖与先前名称存在的任何同义词。

谨慎使用replace的唯一原因是您可能有相同名称的不同同义词。如果你的数据库组织得很好,这种情况就不应该发生。你应该总是知道你所有的对象是什么,以及同义词指向哪里。

但是,如果您确实想这样做,有几个选择:

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

select * from owner where owner= 'ETKS_PR_RW‘和synonym_name = 'SQ_CLDOS_ATCHMNT_ID';

如果你想把它们组合成一个块,那么你可以这样做:

代码语言:javascript
复制
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可以有大小写的对象,但很少值得这么麻烦。所有对象都将自动大小写,因此您不需要"

票数 29
EN

Stack Overflow用户

发布于 2012-05-07 16:04:06

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

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

代码语言:javascript
复制
desc dba_synonyms
desc user_synonyms

使其更加灵活和定制化

假设Oracle PL/SQL

代码语言:javascript
复制
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;

/ 

这里是针对您的问题的定制

代码语言:javascript
复制
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; 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10478625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档