Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果同义词已经存在,我如何检查don';不要创造同义词_Sql_Oracle_Synonym - Fatal编程技术网

Sql 如果同义词已经存在,我如何检查don';不要创造同义词

Sql 如果同义词已经存在,我如何检查don';不要创造同义词,sql,oracle,synonym,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"; 如何检查此同义词是否已存在,如果已存在,则不要创建该同义词。我认为如果删除或替换关键字,将提示您该同义词已存在 也可以使用这些表创建pl/sql代码 desc dba_synonyms desc user

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

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

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

我认为如果删除或替换关键字,将提示您该同义词已存在

也可以使用这些表创建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; 

在使用
replace
关键字时,无需首先检查同义词是否存在。你将重写与先前名字存在的任何同义词

使用
replace
时要小心的唯一原因是,如果您可能有同名的不同同义词。如果你的数据库组织得很好,这种情况就不会发生。您应该始终知道所有对象是什么以及同义词指向何处

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

  • 删除
    更换
    。如果同义词已存在且无法重写,则语句将抛出错误
  • 查询数据字典,因为您处于多个模式中似乎是最佳选择

    select *
      from all_synonyms
     where owner = 'ETKS_PR_RW'
       and synonym_name = 'SQ_CLDOS_ATCHMNT_ID';
    
  • 如果要将这些组合成单个块,则可以执行以下操作:

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

    在一个稍微分开的表格上,请不要引用您的对象名称。甲骨文可以使用cased对象,但它很少值得这么麻烦。所有对象都将自动大写,因此您不需要

    您能告诉我选项2的语法吗。这就是我要找的。这里是一个指南示例。我确定这是您想要的我希望给我接受答案提前感谢Hay bro这更复杂,我认为它会复制所有对象。请提供更多信息您的问题是模糊的:如果您希望创建一个syn并检测存在,请选择上面的选项1如果您想要创建syn对于模式中的对象,请选择选项2,并将适当的位置放在“请告诉我您的问题”中的更多详细信息!!编辑你的问题,你可以根据我的场景发布脚本,我可以在上面创建同义词,检查它是否已经存在,然后不创建。