Просмотры только для чтения и изменяемые

Просмотры только для чтения и изменяемые

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

Через просмотр значения могут передаваться только тем столбцам, которые были поименованы в просмотре. Firebird сохраняет NULL во всех других столбцах. Просмотр не будет изменяемым, если в нем не указаны столбцы, которые не допускают значения NULL.

Просмотр только для чтения может быть сделан изменяемым с помощью триггеров.

Просмотры только для чтения

Просмотр будет просмотром только для чтения, если его оператор SELECT имеет любую из следующих характеристик:

* указывает квантификатор строк, отличный от ALL (т. е. DISTINCT, FIRST, SKIP);

* содержит поля, определенные через подзапросы или другие выражения;

* содержит поля, определенные через агрегатные функции, и/или содержит предложение GROUP BY;

* включает спецификации UNION;

* соединяет несколько таблиц;

* включает не все столбцы NOT NULL из базовой таблицы;

* выбирает данные из существующего просмотра, который не является изменяемым.

Преобразование просмотров только для чтения в изменяемые

Вы можете написать триггеры, которые будут выполнять корректные изменения в базовых таблицах, когда для просмотра запрашиваются операции DELETE, UPDATE или INSERT. Такая возможность Firebird может перевести неизменяемые просмотры в изменяемые.

Следующий скрипт создает две таблицы, создает просмотр, который является соединением этих двух таблиц, а затем создает три триггера (для операций DELETE, UPDATE, INSERT), которые будут передавать все изменения в просмотре базовым таблицам:

CREATE TABLE Table1 (

ColA INTEGER NOT NULL,

ColB VARCHAR(20),

CONSTRAINT pk_table PRIMARY KEY(ColA) );

COMMIT;

CREATE TABLE Table2 (

ColA INTEGER NOT NULL,

ColC VARCHAR(20),

CONSTRAINT fk_table2 FOREIGN KEY REFERENCES Table1(ColA) ) ;

COMMIT;

CREATE VIEW TableView AS

SELECT Table1.ColA, Table1.ColB, Table2.ColC

FROM Table1, Table2

WHERE Table1.ColA = Table2.ColA;

COMMIT;

SET TERM ^;

CREATE TRIGGER TableView_Delete FOR TableView

ACTIVE BEFORE DELETE AS

BEGIN

DELETE FROM Table1

WHERE ColA = OLD. ColA;

DELETE FROM Table2

WHERE ColA = OLD. ColA;

END ^

CREATE TRIGGER TableView_Update FOR TableView

ACTIVE BEFORE UPDATE AS

BEGIN

UPDATE Table1

SET ColB = NEW.ColB

WHERE ColA = OLD.ColA;

UPDATE Table2

SET ColC = NEW.ColC

WHERE ColA = OLD.ColA;

END ^

CREATE TRIGGER TableView_Insert FOR TableView

ACTIVE BEFORE INSERT AS

BEGIN

INSERT INTO Table1 values (NEW.ColA,NEW.ColB);

INSERT INTO Table2 values (NEW.ColA,NEW.ColC);

END ^

COMMIT ^

SET TERM ;^

При определении триггеров для просмотров проследите, чтобы они не создавали конфликтов или неожиданных условий в отношении триггеров, определенных для базовых таблиц. Выполнение триггера для просмотра предшествует выполнению триггера для таблицы соответствующей фазы (BEFORE/AFTER).

Предположим, у вас есть триггер BEFORE INSERT (перед вставкой) для базовой таблицы, который получает значение генератора для первичного ключа, если его NEW. VALUE имеет значение NULL. ЕСЛИ триггер для просмотра включает оператор INSERT для базовой таблицы, не указывайте столбец первичного ключа в этом операторе в просмотре. Это приведет к тому, что для NEW.VALUE первичного ключа будет передано значение NULL, давая возможность триггеру таблицы выполнить свою работу.

О триггерах и контекстных переменных NEW.* см. главу 31.

Безнадежные случаи

Не все просмотры могут быть сделаны изменяемыми путем создания для них триггеров. Например, следующий удобный маленький просмотр только для чтения читает контекстную переменную с сервера, но несмотря ни на какие триггеры, которые вы определите для него, все операции за исключением SELECT не будут выполняться:

CREATE VIEW SYSTRANS

(CURR_TRANSACTION) AS

SELECT CURRENT_TRANSACTION FROM RDB$DATABASE;

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Другие настройки реестра, изменяемые оснасткой

Из книги автора

Другие настройки реестра, изменяемые оснасткой Теперь вкратце рассмотрим настройки других диалогов Свойства, представляющих интерес с точки зрения их взаимодействия с реестром Windows XP.? Чтобы запретить вывод сообщений об ошибках в работе устройств, подключенных к


Отчет Просмотры/Заказы

Из книги автора

Отчет Просмотры/Заказы Вы можете измерить эффективность продаж, отслеживая показатели отказов и показатели Просмотры/Заказы для определенного товара или группы товаров. Этот анализ позволяет узнать, как хорошо страницы с описанием товаров и страницы категорий


Изменяемые и неизменяемые объекты; адресная арифметика и ссылки

Из книги автора

Изменяемые и неизменяемые объекты; адресная арифметика и ссылки Объекты в Питоне бывают двух разновидностей - изменяемые и неизменяемые. Списки, например - объекты изменяемые, их содержимое и длину можно менять. Поскольку ключами словарей могут быть только неизменяемые


Статические поля только для чтения

Из книги автора

Статические поля только для чтения В отличие от данных-констант, доступные только для чтения поля не причисляются автоматически к группе статических. Если вы хотите использовать значения доступных только для чтения полей на уровне классов, используйте ключевое слово


Свойства, доступные только для чтения, и свойства, доступные только для записи

Из книги автора

Свойства, доступные только для чтения, и свойства, доступные только для записи При создании типов класса можно создавать свойства, доступные только для чтения. Для этого просто создайте свойство без соответствующего блока set. Точно так же, если вы хотите иметь свойство,


Преобразование базы данных в режим только для чтения

Из книги автора

Преобразование базы данных в режим только для чтения Требуется исключительный доступ для переключения базы данных между режимами чтения/записи и только для чтения- см. разд. "Исключительный доступ" главы 39. Переключение режима может быть выполнено владельцем базы данных


ГЛАВА 24. Просмотры.

Из книги автора

ГЛАВА 24. Просмотры. В терминологии SQL-89 и SQL-92 просмотр является стандартным типом таблицы, он также называется просматриваемой или виртуальной таблицей. Он характеризуется как виртуальный, потому что вместо того, чтобы хранить табличный объект и выделять страницы для


Просмотры только для чтения

Из книги автора

Просмотры только для чтения Просмотр будет просмотром только для чтения, если его оператор SELECT имеет любую из следующих характеристик:* указывает квантификатор строк, отличный от ALL (т. е. DISTINCT, FIRST, SKIP);* содержит поля, определенные через подзапросы или другие выражения;*


Системные просмотры

Из книги автора

Системные просмотры Следующие системные просмотры являются подмножеством просмотров, определенных в стандарте SQL-92. Они предоставляют полезную информацию о ваших данных. Вы можете скопировать эти тексты в скрипты и инсталлировать просмотры во всех ваших базах


Установка атрибутов –=Только для чтения=– у столбцов компонента StringGrid

Из книги автора

Установка атрибутов –=Только для чтения=– у столбцов компонента StringGrid Манипулирование вышеуказанным атрибутом возможно в обработчике события OnSelectCell:if Col mod 2 = 0 then grd.Options:= grd.Options + [goEditing]else grd.Options:= grd.Options –


14.2.7. Как сделать переменную доступной только для чтения

Из книги автора

14.2.7. Как сделать переменную доступной только для чтения Если переменной присваивается значение, то может потребоваться, чтобы это значение не изменялось. Для этого достаточно сделать переменную доступной только для чтения. Если пользователь попытается изменить