Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
unsuccessful metadata update
STORE RDB$RELATION_FIELDS failed
attempt to store duplicate value (visible to active transactions)
in unique index "RDB$INDEX_15"
(ISC ERROR CODE:335544351 неудачное изменение
метаданных невозможно сохранить RDB$RELATION_FIELDS
попытка сохранить дубликат значения (видимый в активных транзакциях) в уникальном индексе "RDB$INDEX_15")
Индекс RDB$INDEX_15 является уникальным индексом для имени отношения и имени поля.
Необходимо именовать все столбцы в этом просмотре:
CREATE VIEW VJOB_LISTING (
EMP_NO, FIRST_NAME, LAST_NAME,
PHONE_EXT, HIRE_DATE, DEPT_NO,
EMP_JOB_CODE, /* альтернативное имя */
JOB_GRADE, JOB_COUNTRY, SALARY, FULL_NAME,
JOB_JOB_CODE, /* альтернативное имя * /
JOB_TITLE)
AS
SELECT
E.*,
J. JOB_CODE,
J. JOB_TITLE
FROM EMPLOYEE E
JOIN JOB J
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 DISTINCT также допустим.
Предложение FROM вместе с любыми предложениями JOIN или подзапросами определяет базовые таблицы просмотра.
! ! !
ПРИМЕЧАНИЕ. Выражение SELECT * FROM <отношение> допустимо, однако для просмотров не рекомендуется, если в ваших планах эффективная документируемое?. Если используется такое выражение, то порядок следования столбцов будет соответствовать порядку в базовой таблице. Важно помнить, что вам нужно использовать предложение именования столбцов (см. разд. "Задание имен столбцов просмотра").
. ! .
Вы можете включить предложение WHERE,
Те же самые правила, которые применяются к любым выражениям для определения полей времени выполнения в запросах, также применимы к столбцам времени выполнения в спецификациях просмотров. Выход просмотра почти такой же, что и вычисляемые столбцы в таблице. При этом вычисляемый столбец имеет свои собственные отличные эффекты в просмотре:
* он требует, чтобы обязательно присутствовал список столбцов;
* он делает запрос неизменяемым.
Предположим, что вы хотите создать просмотр, который выводит гипотетическое увеличение на 10 процентов окладов всех служащих компании. Следующий пример создает просмотр только для чтения, который отображает всех служащих и их возможные новые оклады:
CREATE VIEW RAISE_BY_10
(EMPLOYEE, NEW_SALARY)
AS
SELECT EMP_NO, SALARY * 1.1 FROM EMPLOYEE;
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,