Удаление представления
Функция
Определение оператора удаления представления.
Спецификация
::=
Синтаксические правила
-
При отсутствии
< имени схемы >
будет произведена попытка поиска и удаления представления в текущей схеме.
Общие правила
-
Удалить представление может только его владелец. Администратор БД имеет возможность удалить одновременно все объекты некоторого пользователя с помощью команды
DROP USER < имя пользователя > CASCADE
. -
Удаление представления возможно также с помощью предложения
DROP TABLE < имя представления >
; это удобно, когда пользователь не знает характера удаляемого объекта (базовая таблица или представление). -
При указании опции
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;
-
При изменении объектов, на основе которых создано представление, все ссылки в БД у представления (и на представление) от этих объектов удаляется и представление помечается как «представление, нуждающееся в обновлении зависимостей». Зависимости обновляются при первом обращении к представлению за данными (возможно, в составе сложного запроса со многими таблицами (представлениями) или при обращении к представлению, которое основано на этом представлении), поэтому до обновления зависимостей каскадное удаление не выполняется.
Пример (с использованием утилиты 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”;
-
Удаление базовой таблицы, породившей представление, не приводит к удалению самого представления. Таким образом, можно пересоздавать базовую таблицу без обновления представления.
-
При запуске СУБД ЛИНТЕР с ключом
/COMPATIBILITY=STANDARD
запрещается обычное удаление представления, на которое ссылаются другие представления. При этом на консоль ядра СУБД и в файлlinter.out
выдаётся список объектов, ссылающихся на удаляемый объект и не позволяющих его удалить. Пример списка:INFO Can't delete relation '"SYSTEM"."TEST1" (#187)' because exists reference(s): "SYSTEM"."TESTV" (#188) "SYSTEM"."TESTV2" (#190).
-
Каскадное удаление таблицы, на которую ссылаются представления (VIEW), разрешено всегда.
Примечание
Механизм удаления таблиц, на которые ссылаются представления, не распространяется на таблицы, созданные до включения в ядро СУБД ЛИНТЕР данной функциональной возможности.