Создание синонима

Функция

Определение оператора создания синонима.

Спецификация
   
<создание публичного синонима>::=
CREATE [IF NOT EXISTS | OR REPLACE] PUBLIC SYNONYM
имя синонима FOR спецификация объекта
<создание личного синонима>::=
Синтаксические правила
  1. Объект, для которого создается синоним, должен существовать в момент создания синонима.

  2. Если в <создание личного синонима> не задано <имя схемы>, то используется текущая схема БД.

  3. Опция OR REPLACE заставляет удалять существующий в БД синоним и создавать его под тем же именем, но с указанными параметрами.

  4. Опция IF NOT EXISTS отменяет выполнение оператора, если указанный синоним уже существует в БД.

  5. Одновременное использование опций IF NOT EXISTS и OR REPLACE запрещено.

  6. <Имя синонима> не должно совпадать с именем таблиц, представлений и синонимов, в пределах <имя схемы>, если не задано ключевое слово PUBLIC, и с уже существующими общими синонимами, если это слово задано.

  7. Если указано PUBLIC, то синоним действует для всех пользователей БД, которые не создавали таблиц, представлений или синонимов с тем же именем. В противном случае этот синоним действует только для своего создателя, но другие пользователи также могут использовать его, задавая конструкцию <имя схемы>.<имя синонима>.

  8. Конструкция вида

    select ... from <имя схемы>.<имя PUBLIC-синонима> ...

    является недопустимой.

Общие правила
  1. Для создания PUBLIC-синонима требуется уровень прав DBA.

    create table "Массив случайных чисел" (d double);
    create synonym RANDEM for "Массив случайных чисел";
    select * from RANDEM, tab1 where d between 0.5 and 1.0 and randem.rowid=tab1.rowid;
    create table tab1(I int autoinc);
    insert into randem (d) values (0.2);
    insert into randem (d) values (0.4);
    insert into randem (d) values (0.7);
    insert into randem (d) values (1.0);
    insert into randem (d) values (1.6);
    select * from RANDEM, tab1 where d between 0.5 and 1.0 and randem.rowid=tab1.rowid;
    | 0.7 | 2 |
    | 1.0 | 3 |

    сравните (в этом варианте локальный синоним RANDEM известен только внутри SQL-запроса и не конфликтует с созданным в БД глобальным синонимом RANDEM):

    select * from "Массив случайных чисел" as RANDEM, tab1
     where d between 0.5 and 1.0 
       and randem.rowid=tab1.rowid;
    | 0.7 | 2 |
    | 1.0 | 3 |
  2. Для создания синонима с <имя схемы> требуется уровень прав RESOURCE.

  3. Права на выполнение DML-операций с синонимами наследуются от объектов, для которых создан синоним и проверяются на этапе выполнения операции.

  4. Длина цепочки синонимов, ссылающихся друг на друга, ограничена числом 10. При большей длине цепочки считается, что таблица не найдена.

  5. При выполнении запроса с <именем синонима> без указания <имя схемы> вначале производится поиск синонима среди личных синонимов текущей схемы, при отсутствии – поиск среди общих синонимов.