2012-05-07 25 views

Trả lời

20

Vì bạn đang sử dụng từ khóa replace không cần kiểm tra xem từ đồng nghĩa có tồn tại trước hay không. Bạn sẽ ghi đè lên bất kỳ từ đồng nghĩa nào tồn tại với tên trước đó.

Lý do duy nhất để cảnh giác khi sử dụng replace là nếu bạn có thể có một từ đồng nghĩa khác có cùng tên. Nếu cơ sở dữ liệu của bạn được tổ chức tốt thì điều này sẽ không xảy ra. Bạn nên luôn luôn biết tất cả các đối tượng của bạn là gì và nơi mà các từ đồng nghĩa trỏ đến.

Tuy nhiên, nếu bạn muốn có một vài lựa chọn:

  1. Di replace. Tuyên bố sẽ ném một lỗi nếu từ đồng nghĩa đã tồn tại và sẽ không bị ghi đè.
  2. Truy vấn từ điển dữ liệu, vì bạn đang ở nhiều sơ đồ all_synonyms có vẻ giống như đặt cược tốt nhất.

    select * 
        from all_synonyms 
    where owner = 'ETKS_PR_RW' 
        and synonym_name = 'SQ_CLDOS_ATCHMNT_ID'; 
    

Nếu bạn muốn kết hợp chúng thành một khối duy nhất sau đó bạn có thể làm một cái gì đó như thế này:

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

Trên một hơi tách không xin đừng quote tên đối tượng của bạn. Oracle có thể có các đối tượng có vỏ, nhưng nó rất, rất hiếm khi đáng giá. Tất cả các đối tượng sẽ được tự động đặt ở trên để bạn không cần ".

-1

Tôi nghĩ rằng nếu bạn loại bỏ OR REPLACE từ khóa nó sẽ nhắc nhở bạn rằng nó tồn tại

Hoặc bạn có thể tạo pl/code sql sử dụng các bảng

desc dba_synonyms 
desc user_synonyms 

Để làm cho nó linh hoạt hơn và tùy biến

Giả sử 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; 

/

Ở đây, tùy chỉnh ization cho vấn đề của bạn

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; 
+0

bạn có thể cho tôi biết cú pháp cho tùy chọn 2. Đây là điều tôi đang tìm kiếm hay không. –

+0

ở đây một ví dụ hướng dẫn http://snipplr.com/view/39190/create-synonyms/ chắc chắn đây là những gì bạn muốn tôi hy vọng cho tôi chấp nhận câu trả lời thankx trước – shareef

+0

hay bro này phức tạp hơn và những gì tôi nghĩ rằng nó sẽ sao chép tất cả các đối tượng. –

Các vấn đề liên quan