Удаление представления

Функция

Определение оператора удаления представления.

Спецификация
   
< удаление представления >::=
Синтаксические правила
  1. При отсутствии < имени схемы > будет произведена попытка поиска и удаления представления в текущей схеме.

Общие правила
  1. Удалить представление может только его владелец. Администратор БД имеет возможность удалить одновременно все объекты некоторого пользователя с помощью команды DROP USER < имя пользователя > CASCADE.

  2. Удаление представления возможно также с помощью предложения DROP TABLE < имя представления >; это удобно, когда пользователь не знает характера удаляемого объекта (базовая таблица или представление).

  3. При указании опции CASCADE одновременно с удаляемым представлением удаляются и все представления, порожденные на его основе.

    create or replace table test(i int, c char(10));
    create or replace view testv1 as select * from test;
    create or replace view testv2 as select * from testv1  where i=100;
    create or replace view testv3 as select * from testv2  where c='abc';
    drop view testv1 cascade;
  4. При изменении объектов, на основе которых создано представление, все ссылки в БД у представления (и на представление) от этих объектов удаляется и представление помечается как «представление, нуждающееся в обновлении зависимостей». Зависимости обновляются при первом обращении к представлению за данными (возможно, в составе сложного запроса со многими таблицами (представлениями) или при обращении к представлению, которое основано на этом представлении), поэтому до обновления зависимостей каскадное удаление не выполняется.

    Пример (с использованием утилиты inl): каскадное удаление не выполняется, т.к. зависимости между объектами не восстановлены:

    create or replace table test(i int);
    create or replace view testv as select * from test;
    !Выполняется разрыв зависимости между таблицей и порожденным на её основе представлением.
    drop table test;
    
    create or replace table test(i int);
    !Хотя таблица, на основе которой создано представление, вновь существует в БД, зависимость
    !между ней и порожденным на её основе представлением не восстановлена (не было обращения
    !к данным представления). Каскадное удаление не выполняется.
    
    drop table test cascade;
    
    !Т.к. зависимости не  восстановлены, то каскадное удаление не было выполнено.
    !Представление все еще существует в БД.
    show test
    Характеристика столбца
     I                                     INTEGER
    Запрос для представления
    SELECT * FROM ”TEST”;
  5. Удаление базовой таблицы, породившей представление, не приводит к удалению самого представления. Таким образом, можно пересоздавать базовую таблицу без обновления представления.

  6. При запуске СУБД ЛИНТЕР с ключом /COMPATIBILITY=STANDARD запрещается обычное удаление представления, на которое ссылаются другие представления. При этом на консоль ядра СУБД и в файл linter.out выдаётся список объектов, ссылающихся на удаляемый объект и не позволяющих его удалить. Пример списка:

    INFO Can't delete relation '"SYSTEM"."TEST1" (#187)' because exists reference(s):
      "SYSTEM"."TESTV" (#188)
      "SYSTEM"."TESTV2" (#190).
  7. Каскадное удаление таблицы, на которую ссылаются представления (VIEW), разрешено всегда.

    Примечание

    Механизм удаления таблиц, на которые ссылаются представления, не распространяется на таблицы, созданные до включения в ядро СУБД ЛИНТЕР данной функциональной возможности.