Читать интересную книгу Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 107 108 109 110 111 112 113 114 115 ... 238

ON E.JOB CODE = J.JOB_CODE ;

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

CREATE VIEW VJOB_ALTNAMES

AS

SELECT JOB_СODE || 'for ' || JOB_TITLE AS ALTNAME

FROM JOB;

ISC ERROR CODE:335544569

Invalid command

mast specify column name for view select expression

(ISC ERROR CODE:335544569 Неверная команда,

нужно задать имя столбца для выражения в операторе SELECT в просмотре)

Следующее будет правильным:

CREATE VIEW VJOB_ALTNAMES

(ALTNAME)

AS

SELECT JOB_CODE || ' for ' || JOB_TITLE

FROM JOB;

Список имен столбцов просмотра должен соответствовать порядку и количеству столбцов, указанных в операторе SELECT.

Задание SELECT

Спецификация SELECT- это обычный оператор SELECT, который может включать соединения, поля выражений, спецификации группирования и условия поиска- но не условия упорядочения.

Выходной список в предложении SELECT определяет типы, позиции и (если не заданы явно) имена столбцов просмотра.

Запрос SELECT DISTINCT также допустим.

Предложение FROM вместе с любыми предложениями JOIN или подзапросами определяет базовые таблицы просмотра.

! ! !

ПРИМЕЧАНИЕ. Выражение SELECT * FROM <отношение> допустимо, однако для просмотров не рекомендуется, если в ваших планах эффективная документируемое?. Если используется такое выражение, то порядок следования столбцов будет соответствовать порядку в базовой таблице. Важно помнить, что вам нужно использовать предложение именования столбцов (см. разд. "Задание имен столбцов просмотра").

. ! .

Вы можете включить предложение WHERE, если вам нужно задать условия поиска. Также может быть включено предложение GROUP BY вместе с необязательным предложением HAVING.

Определение вычисляемых столбцов

Те же самые правила, которые применяются к любым выражениям для определения полей времени выполнения в запросах, также применимы к столбцам времени выполнения в спецификациях просмотров. Выход просмотра почти такой же, что и вычисляемые столбцы в таблице. При этом вычисляемый столбец имеет свои собственные отличные эффекты в просмотре:

* он требует, чтобы обязательно присутствовал список столбцов;

* он делает запрос неизменяемым.

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

CREATE VIEW RAISE_BY_10

(EMPLOYEE, NEW_SALARY)

AS

SELECT EMP_NO, SALARY * 1.1 FROM EMPLOYEE;

WITH CHECK OPTION

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

Предположим, вы создаете просмотр, который предоставляет доступ ко всем отделам с бюджетами от $10 000 до $500 000. Просмотр V_SUB_DEPT может быть определен следующим образом:

CREATE VIEW V_SUB_DEPT (

DEPT_NAME,

DEPT_NO,

SUB_DEPT_NO,

LCW_BUDGET)

AS SELECT

DEPARTMENT,

DEPT_NO,

HEAD_DEPT,

BUDGET

FROM DEPARTMENT

WHERE BUDGET BETWEEN 10000 AND 500000

WITH CHECK OPTION;

Пользователь с привилегиями INSERT К этому просмотру может добавлять новые данные в столбцы DEPARTMENT, DEPT_NO, HEAD_DEPT и BUDGET базовой таблицы через этот просмотр, WITH CHECK OPTION гарантирует, что все значения бюджетов, вводимые через этот просмотр, будут находиться в указанном для просмотра диапазоне.

Следующий оператор добавляет новую строку отдела Publications через просмотр

V_SUB_DEPT:

INSERT INTO V_SUB_DEPT (

DEPT_NAME,

DEPT_NO,

SUB_DEPT_NO,

LOW_BUDGET)

VALUES ('Publications', '999', '670', 250000);

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

INSERT INTO V_SUB_DEPT (

DEPT_NAME,

DEPT_NO,

SUB_DEPT_NO,

LOW_BUDGET)

VALUES ('Publications', '999', '670', 750000);

ISC ERROR CODE:335544558

Operation violates CHECK constraint on view or table V_SUB_DEPT

(ISC ERROR CODE:335544558

Операция нарушает ограничение CHECK для просмотра или таблицы V_SUB_DEPT)

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

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

Когда над просмотром выполняется операция 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;

Естественно изменяемые просмотры

Просмотр является естественно изменяемым, если выполняются следующие два условия:

* спецификация просмотра является подмножеством одной таблицы или другого изменяемого просмотра;

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

1 ... 107 108 109 110 111 112 113 114 115 ... 238
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри.
Книги, аналогичгные Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Оставить комментарий