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

Я использую 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)


Поскольку вы используете ключевое слово replace, нет необходимости сначала проверять, существует ли синоним. Вы перезапишете любой существующий синоним с предыдущим именем.

Единственная причина, по которой следует опасаться использования replace, заключается в том, что у вас может быть другой синоним с тем же именем. Если ваша база данных организована хорошо, этого не должно произойти. Вы всегда должны знать, что представляют собой все ваши объекты и куда указывают синонимы.

Однако, если вы хотите, есть несколько вариантов:

  1. Удалить replace. Оператор выдаст ошибку, если синоним уже существует и не будет перезаписан.
  2. Запросите словарь данных, поскольку вы находитесь в нескольких схемах all_synonyms. кажется лучшей ставкой.

    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 могут быть объекты в корпусе, но это очень, очень редко стоит хлопот. Все объекты будут автоматически отображаться в верхнем регистре, поэтому вам не нужен ".

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
пожалуйста, предоставьте дополнительную информацию, ваш вопрос неоднозначен: если вы хотите создать один синхрон и обнаружить существование, вы выбираете вариант 1 выше, если вы хотите создать синхрон для объектов в схеме, вы выбираете вариант 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