SQL1

ОПРЕДЕЛЕНИЕ МОДИФИЦИРУЕМОСТИ ПРЕДСТАВЛЕНИЯ


Если команды модификации могут выполняться в представлении, представление, как уже говорилось, будет модифицируемым; в противном случае оно предназначено только для чтения при запросе. Не противореча этой терминологии, мы будем использовать выражение "модифицировать представление" (updating a view), что означает возможность выполнения в представление любой из трёх команд модификации DML (Вставить, Изменить и Удалить), которые могут изменять значения.

Как вы определите, является ли представление модифицируемым? В теории базы данных, это - пока обсуждаемая тема. Основной принцип таков: модифицируемое представление это представление, в котором команда модификации может выполниться, чтобы изменить одну, и только одну, строку основной таблицы в каждый момент времени, не воздействуя на любые другие строки любой таблицы. Использование этого принципа на практике, однако, затруднено.

Кроме того, некоторые представления, которые теоретически являются модифицируемыми, на самом деле не являются модифицируемыми в SQL.

Вот критерии, по которым определяют, является ли в SQL-представление модифицируемым, или нет:

  • Оно должно выводиться из одной, и только из одной, базовой таблицы.
  • Оно должно содержать первичный ключ этой таблицы (это технически не предписывается стандартом ANSI, но было бы неплохо придерживаться этого).
  • Оно не должно иметь никаких полей, которые являлись бы агрегатными функциями.
  • Оно не должно содержать DISTINCT в своем определении.
  • Оно не должно использовать GROUP BY или HAVING в своем определении.
  • Оно не должно использовать подзапросы (это ANSI-ограничение, которое не предписано для некоторых реализаций).
  • Оно может быть использовано в другом представлении, но это представление должно также быть модифицируемым.
  • Оно не должно использовать константы, строки или выражения для значений (например: comm * 100) среди выбранных полей вывода.
  • Для INSERT оно должно содержать любые поля основной таблицы, которые имеют ограничение NOT NULL, если другое ограничение по умолчанию не определено.


  • Содержание раздела