SQL1

ПРОВЕРКА ПРЕДСТАВЛЕНИЙ, КОТОРЫЕ БАЗИРУЮТСЯ НА ДРУГИХ ПРЕДСТАВЛЕНИЯХ


Еще одно надо упомянуть относительно предложения WITH CHECK OPTION в ANSI: оно не делает каскадированного изменения: оно применяется только в представлениях, в которых оно определено, но не в представлениях, основанных на этом представлении. Например, в предыдущем примере

CREATE VIEW Highratings AS SELECT cnum, rating FROM Customers WHERE rating = 300 WITH CHECK OPTION;

попытка вставить или модифицировать значение оценки, не равное 300, потерпит неудачу. Однако мы можем создать второе представление (с идентичным содержанием), основанное на первом:

CREATE VIEW Myratings AS SELECT * FROM Highratings;

Теперь мы можем модифицировать оценки, не равные 300:

UPDATE Myratings SET rating = 200 WHERE cnum = 2004;

Эта команда, выполняемая так, как если бы она выполнялась как первое представление, будет допустима. Предложение WITH CHECK OPTION просто гарантирует, что любая модификация в представлении произведет значения, которые удовлетворяют предикату этого представления.

Модификация других представлений, базирующихся на первом текущем, является всё ещё допустимой, если эти представления не защищены предложениями WITH CHECK OPTION внутри этих представлений. Даже если такие предложения установлены, они проверяют только те предикаты представлений, в которых они содержатся. Так, например, даже если представление Myratings создавалось следующим образом,

CREATE VIEW Myratings AS SELECT * FROM Highratings WITH CHECK OPTION;

проблема не будет решена. Предложение WITH CHECK OPTION будет исследовать только предикат представления Myratings. Пока у Myratings фактически не имеется никакого предиката, WITH CHECK OPTION ничего не будет делать. Если используется предикат, то он будет проверяться всякий раз, когда представление Myratings будет модифицироваться, но предикат Highratings все равно будет проигнорирован. Это - дефект в стандарте ANSI, который у большинства программ исправлен. Вы можете попробовать использовать представление наподобие последнего примера и посмотреть, избавлена ли ваша система от этого дефекта. (Попытка выяснить это самостоятельно может иногда оказаться проще и яснее, чем поиск ответа в документации системы.)



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