Как мога да проверя, че ако синонимът вече съществува, тогава не създавайте синоним

Използвам Oracle SQL developer 2.1 за създаване на синоним.

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

Как мога да проверя, че ако този синоним вече съществува, тогава не създавайте синоним, ако съществува.


person SOF User    schedule 07.05.2012    source източник


Отговори (2)


Моето решение е изчезнало, защото сте абсолютно прав, че не е едно. Ще работи, но дори не е близо до правилния подход.
person Ben    schedule 07.05.2012

Мисля, че ако премахнете ключовата дума 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; 
person shareef    schedule 07.05.2012
comment
можете ли да ми кажете синтаксис за опция 2. Това е, което търся. - person SOF User; 07.05.2012
comment
тук пример за ръководство snipplr.com/view/39190/create-synonyms сигурен съм това е, което искаш, надявам се да ми дадеш отговор, благодаря предварително - person shareef; 07.05.2012
comment
Хей, брато, това е по-сложно и според мен ще копира всички обекти. - person SOF User; 07.05.2012
comment
моля, предоставете повече информация, въпросът ви е двусмислен: ако искате да създадете един syn и да откриете съществуването, изберете опция 1 по-горе, ако искате да създадете syn за обекти в схемата, изберете опция 2 и поставете подходящото място, моля, дайте ми проблема си с повече подробности !! и редактирайте въпроса си - person shareef; 07.05.2012
comment
Можете ли просто да публикувате скрипт според моя сценарий, където мога по-горе да създам синоним с проверка дали вече съществува, след което не създавайте. - person SOF User; 07.05.2012
comment
Ако премахнете замяната, няма да ви подкани, вашият блок никога няма да изведе грешка и никога, никога dbms_output.put_line грешки. Изобщо няма смисъл и просто покрива грешки, с които трябва да се справите. - person Ben; 07.05.2012
comment
моето обяснение може да бъде разбрано погрешно по какъвто и да е начин, имах предвид в sql редактор CREATE или REPLACE SYNONYM ETKS_PR_RW.SQ_CLDOS_ATCHMNT_ID FOR CLDOS_ONLINE_DBA.SQ_CLDOS_ATCHMNT_ID tiwce ще покаже ora грешка, това е първата опция и втората опция, която публикувах, тествах я на жаба и ми даде грешка в dbms изходен прозорец! благодари ти - person shareef; 07.05.2012
comment
@shareef, не бях аз този, който те отхвърли, но не съм съгласен с това, което казваш. Вторият може да ви даде грешка, но само ако нямате правилните разрешения. dbms_output.put_line е много лош начин за справяне с грешки. Трябва да си там, за да ги забележиш! Освен това наистина не разбирам мотивите за последната ви актуализация. Това е изключително сложно. - person Ben; 07.05.2012
comment
@Ben, добре, благодаря, научих нещо за dbms и предполагам, че си прав за правилните разрешения ... трябва да съм по-опитен в разбирането на въпросите, но все още мисля, че въпросът беше общ :) - person shareef; 07.05.2012