
- •7.4.3. Операции модификации строк
- •7.4.4. Операции удаления строк
- •7.5. Построение выражений
- •7.6. Средства определения, модификации и удаления представлений
- •7.7. Средства определения, модификации и удаления синонимов
- •7.8. Средства определения, модификации и удаления последовательностей
- •7.9. Средства определения, модификации и удаления пользователей
7.6. Средства определения, модификации и удаления представлений
После того как были рассмотрены вопросы, связанные с построением запросов к таблицам, появляется возможность снова вернуться к рассмотрению возможностей языка определения данных DDL (Data Definition Language).
Как отмечалось ранее, представление представляет собой поименованную, динамически поддерживаемую СУБД выборку из одной или нескольких таблиц или других представлений. Оператор SELECT, определяющий выборку, ограничивает видимые пользователем данные. Кроме того, представление позволяет эффективно ограничить данные, которые пользователь может модифицировать. Используя представления, администратор базы данных ограничивает доступную пользователям часть логического пространства базы данных только теми данными, которые реально им необходимы.
Оператор определения (создания) представлений в Oracle имеет в упрощенном виде следующий синтаксис:
CREATE [OR REPLACE] [FORCE|NO FORCE]
VIEW [имя_схемы.]имя_представления AS запрос
WITH READ ONLY|CHECK OPTION [CONSTRAINT имя_ограничения]
Ключевые слова OR REPLACE указывают на принудительное замещение старого представления новым. Использование конструкции CREATE OR REPLACE вместо просто CREATE позволяет не выполнять повторного предоставления привилегий (доступа пользователей к данному представлению), которое было бы необходимо, если использовать команды DROP VIEW и CREATE VIEW для уничтожения и создания представления заново.
Параметры имя_схемы и имя_представления указывают схему, в которой будет создано новое представление, и название нового представления.
Необязательное ключевое слово FORCE указывает на принудительное создание представления вне зависимости от того, существуют ли базовые таблицы представления, и есть ли у пользователя, создающего представление, привилегии на выборку из базовых таблиц. Если предложение CREATE VIEW не имеет синтаксических ошибок, то СУБД Oracle может создать представление даже в том случае, когда определяющий представление запрос не может быть выполнен.
По умолчанию в команде создания представлений используется конструкция NO FORCE, которая указывает на обязательность существования базовых таблиц и представлений и наличия у пользователя, создающего представление, привилегий на доступ к базовым таблицам. При нарушении какого-либо из этих условий представление не создается.
Параметр запрос, указанный после ключевого слова AS, используется для обозначения любого синтаксически правильного запроса, не содержащего конструкцию сортировки результата с ключевыми словами ORDER BY.
Представление может использоваться в командах вставки, модификации и удаления данных. При этом указанные операции выполняются над строками базовых таблиц, на которых основано представление. По умолчанию представление создается с возможностью модификации таблиц, на которых оно построено.
Использование конструкции WITH READ ONLY указывает на запрещение для базовых таблиц операций модификации данных с указанием представления.
Использование конструкции WITH CHECK OPTION указывает на то, что строки в базовых таблицах, изменяемые и вставляемые через представление, должны соответствовать критерию отбора в запросе, определяющем представление. Для этих целей создается специальное ограничение целостности, связанное с представлением. Для указания конкретного названия ограничения целостности после конструкции WITH CHECK OPTION возможно использование ключевого слова CONSTRAINT, после которого задается имя создаваемого ограничения. В противном случае СУБД Oracle автоматически присвоит ограничению целостности имя.
Представление является изменяемым, то есть по отношению к нему можно использовать команды DELETE, INSERT и UPDATE, в том случае, если для образующего представление запроса выполняются следующие условия:
в запросе, образующем представление, отсутствует ключевое слово DISTINCT;
каждое выражение в перечне отбираемых колонок представляет собой имя колонки и каждая колонка фигурирует в перечне не более одного раза;
в условии выборки после ключевого слова WHERE не используются подзапросы;
в запросе отсутствуют конструкции с использованием ключевых слов GROUP BY и HAVING.
Для удаления представлений используется команда DROP VIEW, имеющая следующий синтаксис:
DROP VIEW [имя_схемы.]имя_представления
Рассмотрим создание и использование представлений на примере.
Пример 24. Создать представление, содержащее информацию о проектах, реализуемых отделом с номером 3.
Известно, что таблица project содержит информацию, представленную на рисунке 39.
Рис. 39. Содержимое таблицы project
Команда для создания необходимого представления может выглядеть следующим образом:
CREATE VIEW project3 AS
SELECT * FROM project WHERE dept_no = 3
WITH CHECK OPTION CONSTRAINT check_project3
или
CREATE OR REPLACE VIEW project3 AS
SELECT * FROM project WHERE dept_no = 3
WITH CHECK OPTION CONSTRAINT check_project3
Если при дальнейшей работе выполнить запрос вида
SELECT * FROM project3
то будет получен результат, показанный на рисунке 40.
Рис. 40. Результат запроса данных из представления project3
Кроме того, в момент создания представления будет создано ограничение целостности с названием check_project3, которое не позволит вставлять новые записи, которые не будут соответствовать условию WHERE, и модифицировать существующие записи, входящие в представление, таким образом, что они перестанут соответствовать условию WHERE. Например, попытаемся выполнить следующую команду вставки строки:
INSERT INTO project3 (proj_no, proj_name, bdate,
budget, dept_no) VALUES (10,'Проект 10', to_date('01.01.2009','DD.MM.YYYY'),1000, 4)
Выполнение представленной выше команды INSERT приведет к возникновению ошибки вида:
ORA-01402: представление WITH CHECK OPTION не соответствует фразе WHERE
Если же представление будет создано с использованием команды
CREATE OR REPLACE VIEW project3 AS
SELECT * FROM project WHERE dept_no = 3
то созданное представление будет позволять модифицировать данные без проверки изменяемых или вставляемых строк на соответствие условию, указанному после ключевого слова WHERE. То есть выполнение представленной выше команды INSERT не приведен к возникновению ошибки.