シノニムの作成にOracleSQLDeveloper2.1を使用しています。
CREATE OR REPLACE SYNONYM "ETKS_PR_RW"."SQ_CLDOS_ATCHMNT_ID"
FOR "CLDOS_ONLINE_DBA"."SQ_CLDOS_ATCHMNT_ID";
この同義語がすでに存在する場合、存在する場合は同義語を作成しないことを確認するにはどうすればよいですか。
キーワードを使用しているreplace
ため、同義語が最初に存在するかどうかを確認する必要はありません。以前の名前で存在していた同義語を上書きします。
使用に注意する唯一の理由replace
は、同じ名前の別の同義語がある可能性がある場合です。データベースが適切に編成されている場合、これは発生しないはずです。すべてのオブジェクトが何であり、同義語がどこを指しているかを常に知っておく必要があります。
ただし、必要に応じて、いくつかのオプションがあります。
replace
ます。同義語がすでに存在し、上書きされない場合、ステートメントはエラーをスローします。複数のスキーマを使用しているため、データディクショナリをクエリするのall_synonyms
が最善の策のようです。
select *
from all_synonyms
where owner = 'ETKS_PR_RW'
and synonym_name = 'SQ_CLDOS_ATCHMNT_ID';
これらを1つのブロックに結合する場合は、次のようにすることができます。
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;