동의어가 이미 존재하는 경우 동의어를 만들지 않는지 확인하려면 어떻게 해야 합니까?
저는 동의어를 만들기 위해 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
같은 이름의 동의어가 다를 수 있습니다.데이터베이스가 잘 구성되어 있으면 이런 일이 발생해서는 안 됩니다.모든 개체가 무엇인지, 동의어가 어디를 가리키는지 항상 알아야 합니다.
하지만 원하는 경우 다음과 같은 몇 가지 옵션이 있습니다.
- 제거한다.
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;
/
약간 다른 경우에는 개체 이름을 따옴표로 묶지 마십시오.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
'programing' 카테고리의 다른 글
if 문을 사용한 이해력 나열 (0) | 2023.08.24 |
---|---|
우리가 시뮬레이터에서 푸시 알림을 확인할 수 있습니까? (0) | 2023.08.24 |
다른 테이블을 참조하여 제약 조건을 확인 (0) | 2023.08.24 |
업데이트 쿼리에서 최대 절전 모드를 사용하도록 강제하는 방법은 무엇입니까? (0) | 2023.08.24 |
엑셀 vba를 이용한 유튜브 자막 다운로드 (0) | 2023.08.24 |