WITH LOCAL CHECK option

AS

AS

AS

SELECT * FROM T1 WHERE TName LIKE 'A%'

Тогда оба приведенных выше предложения INSERT выполнятся успешно, но строку, вставленную с помощью второго предложения INSERT, нельзя будет получить, используя представление V1.

В определении представления могут быть использованы другие (вложенные) представления, каждое из которых может использовать конструкцию WHERE. Тип, указанный в конструкции WITH CHECK OPTION, указывает, наследует ли представление все условия отбора от вложенных представлений или нет. Если указано CASCADED или ничего не указано, тогда для вставляемых и/или обновляемых записей проверяются все условия отбора. Например, если определено следующее представление:

CREATE VIEW V2

SELECT * FROM V1 WHERE TId > 25

WITH CHECK OPTION -- или WITH CASCADED CHECK OPTION

И рассматриваются следующие три предложения INSERT:

INSERT INTO V2 VALUES(32, 'ABC')

INSERT INTO V2 VALUES(12, 'ABC')

INSERT INTO V2 VALUES(32, 'BBC')

Тогда первое предложение будет выполнено успешно, тогда как второе и третье выполнены не будут. Во втором предложении нарушено условие отбора, указанное в определении V2, а в третьем – условие отбора, указанное во вложенном представлении V1.

Если в качестве типа указано LOCAL, тогда условия отбора, указанные во вложенных представлениях, не проверяются. Например, если представление V2 определено следующим образом:

CREATE VIEW V2

SELECT * FROM М1 WHERE TId > 25

И рассматриваются те же три предложения INSERT, тогда не будет выполнено только второе предложение, в котором нарушено (локальное) условие отбора, указанное в определении представления V2. В этом случае данные, вставленные в таблицу с помощью третьего предложения INSERT, нельзя будет получить, используя представление V2.

Модифицируемые представления могут накладывать ограничения на то, какие колонки представления могут обновляться. Например, представление, в котором содержатся вычисляемые данные, не могут использоваться для обновления таких вычисляемых данных (например, в таблице есть год рождения, а представление вычисляет возраст сотрудника).

Когда представление используется для вставки строк в таблицу, в определении представления должны быть указаны все обязательные колонки базовой таблицы (т.е. колонки, для которых не допускаются null значения и для которых не определены значения по умолчанию). Вставляемая строка должна предоставлять значения для всех таких колонок.

Если представление используется для обновления, можно обновлять только те колонки, которые включены в определение представления. Нельзя обновлять вычисляемые колонки, даже если они включены в представление.

Если выполняется операция удаления для представления, удаляются одна или несколько строк базовой таблицы целиком, а не только та часть строки таблицы, которая видна через представление.

Модифицируемое представление является объектом для ссылочных ограничений и проверки других ограничений в таблице, на которой данное представление, в конечном счете, базируется.

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

Рассмотрим примеры.

Пример 1. Пусть определены две таблицы, имеющие одинаковую структуру:

CREATE TABLE EMP1 (

EmpNo CHAR(6) NOT NULL CHECK(EmpNo > ' '),

LastName VARCHAR(20),

WorkDept CHAR(3)

)

и

CREATE TABLE EMP2 (

EmpNo CHAR(6) NOT NULL CHECK(EmpNo = ' '),

LastName VARCHAR(20),

WorkDept CHAR(3)

)

На основе этих таблиц создается представление:

CREATE VIEW CEMP(EmpNo, LastName, WorkDept) AS

SELECT * FROM EMP1

UNION ALL

SELECT * FROM EMP2

Если теперь выполняется следующая операция вставки:

INSERT INTO CEMP VALUES (' ', 'NewDept', 'D99'),

('000099', 'Miller', 'D99')

Первая строка будет вставлена в таблицу EMP2, так как для нее выполняется ограничение этой таблицы, а вторая строка – в таблицу EMP1.

Пример 2. Пусть определен следующий фрагмент схемы:

T1(id1, …)

T2(id2, …)

T3(…, id1(FK1), id2(FK2), …)

Отношения Т1 и Т2 имеют одинаковую схему отношения (совместимы по объединению).

Созданы таблицы Т1, Т2, Т3, соответствующие приведенному фрагменту схемы.

На базовых таблицах T1 и T2 определяется представление:

CREATE VIEW V1(ID) AS

SELECT * FROM T1

UNION ALL

SELECT * FROM T2

Выполняется предложение DELETE FROM V1

Вариант 1. Пусть при определении таблицы T3 для внешнего ключа, ссылающегося на таблицу Т1, определено правило удаления RESTRICT. Тогда, если в Т1 есть строки, на которые ссылаются из Т3, удаление не будет выполнено.

Вариант 2. Пусть при определении таблицы Т3 для внешнего ключа, ссылающегося на таблицу Т1, определено правило удаления NO ACTION, а для внешнего ключа, ссылающегося на таблицу Т2, определено правило удаления CASCADE. Строки из Т3 могут быть удалены по правилу CASCADE при удалении строк из Т2, после чего удаление может завершиться успешно (NO ACTION проверяет после выполнения операции).

Например, в таблицах имеются следующие данные:

Т1 Id1     T2 Id2   V1 Id
                 
                 
                 
                 
T3 Id1 Id2            
                 
                 

Вариант 1. Правило удаления RESTRICT: в Т3 есть ссылка на Т1, удаление выполнено не будет

Вариант 2. Правило удаления NO ACTION: удалится из V1, для Т2 – удалятся строки из Т3, после чего успешно выполнится операция удаления и из T1.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: