programing

동의어가 이미 존재하는 경우 동의어를 만들지 않는지 확인하려면 어떻게 해야 합니까?

linuxpc 2023. 8. 24. 21:51
반응형

동의어가 이미 존재하는 경우 동의어를 만들지 않는지 확인하려면 어떻게 해야 합니까?

저는 동의어를 만들기 위해 Oracle SQL developer 2.1을 사용하고 있습니다.

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

이 동의어가 이미 존재하는 경우 동의어를 만들지 않는지 확인하려면 어떻게 해야 합니까?

사용 중인 경우replace키워드 동의어가 먼저 존재하는지 확인할 필요가 없습니다.이전 이름의 동의어가 있으면 덮어씁니다.

사용을 경계해야 하는 유일한 이유는replace같은 이름의 동의어가 다를 수 있습니다.데이터베이스가 잘 구성되어 있으면 이런 일이 발생해서는 안 됩니다.모든 개체가 무엇인지, 동의어가 어디를 가리키는지 항상 알아야 합니다.

하지만 원하는 경우 다음과 같은 몇 가지 옵션이 있습니다.

  1. 제거한다.replace동의어가 이미 존재하고 덮어쓰지 않으면 문에서 오류가 발생합니다.
  2. 여러 스키마에 있으므로 데이터 사전을 쿼리하는 것이 가장 좋습니다.

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

약간 다른 경우에는 개체 이름을 따옴표로 묶지 마십시오.Oracle은 케이스 객체를 포함할 수 있지만, 이는 매우, 매우 드물게 발생합니다.모든 개체는 자동으로 대문자로 표시되므로 필요하지 않습니다.".

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; 

언급URL : https://stackoverflow.com/questions/10478625/how-can-i-check-that-if-synonym-already-exist-then-dont-create-synonym

반응형