Выбрать главу

□ INSERT INTO employees_view (

employee_id, manager_id, first_name, last_name, t i t l e

) VALUES (

5 , 1 , ' J e f f ’ , ' Jones', ‘ CTO’

);

1 row created.

SELECT employee_id, first_name, last_name, salary

FROM employees

WHERE employee_id = 5;

EMPL0YEE_ID FIRST_NAME LAST_NAME SALARY

5 Jeff Jones

Создание таблиц, последовательностей, индексов и представлений 343

Столбец salary для новой строки таблицы employees имеет значение

NULL.

Создание представления с ограничением C H E C K O P T IO N

Можно указать, что операции DML над представлением должны удовлетворять

подзапросу, добавив к определению представления ограничение

WITH CHECK OPTION. Следующий оператор CREATE VIEW создает представление

cheap_products_view2, в котором имеется ограничение WITH

□ CHECK OPTION:

CREATE VIEW cheap_products_view2 AS

SELECT *

FROM products

WHERE price < 15

WITH CHECK OPTION CONSTRAINT cheap_products_view2_price;

В следующем примере показана попытка вставить строку с ценой товара

$19.50 с помощью представления cheap_products_view2. База данных выдает

сообщение об ошибке, потому что вставляемая строка не может быть

отобрана представлением:

□ INSERT INTO cheap_products_view2 (

product_id, product_type_id, name, price

) VALUES (

15, 1, ‘ Southern Front’ , 19.50

);

INSERT INTO cheap_products_view2 (

ERROR at line 1:

ORA-01402: view WITH CHECK OPTION where-clause violation

(ОШИБКА в строке 1: 0RA-01402: нарушение фразы WHERE представления с

WITH CHECK OPTION)

Создание представления с ограничением R EAD O N L Y

Можно создать представление только для чтения, добавив к нему ограничение

READ ONLY. Следующий оператор CREATE VIEW создает представление

с именем cheap_products_view3, у которого имеется ограничение READ

ONLY:

□ CREATE VIEW cheap_products_view3 AS

SELECT *

FROM products

WHERE PRICE < 15

WITH READ ONLY CONSTRAINT cheap_products_view3_read_only;

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

представление cheap_products_view3. База данных выдает сообщение об

ошибке, потому что представление является представлением только для

чтения и не допускает использования других операций DML:

□ INSERT INTO cheap_products_view3 (

product_id, product_type_id, name, price

) VALUES (

16, 1, ‘ Northern Front’ , 19.50

344 Глава 10

);

рroduct_id, product_type_id, name, price

ERROR at line 2:

ORA-42399: cannot perform a DML operation on a read-only view

(ORA-42399: невозможно выполнить DML операцию для представления только

для чтения)

Получение информации об определениях представлений

Информацию об определениях представлений можно получить, используя

команду DESCRIBE. В следующем примере используется команда DESCRIBE

для cheap_products_view3:

□ DESCRIBE cheap_products_view3

Name Null? Type

PRODUCT_ID NOT NULL NUMBER(38)

PRODUCT_TYPE_ID NUMBER(38)

NAME NOT NULL VARCHAR2(30)

DESCRIPTION ’ VARCHAR2(50)

PRICE NUMBER(5, 2)

Информацию о своих представлениях можно получить, задав запрос к

представлению user_views. В таблице 10.9 перечислены некоторые столбцы

в user_views.

Таблица 10.9. Некоторые столбцы в user_views

Столбец Тип Описание

view_name VARCHAR2(30) Имя представления.

t e x t_ le n g th NUMBER Число символов в подзапросе,

t e x t long Текст подзапроса представления.

Примечание Информацию о всех представлениях, к которым есть доступ, можно получить,

задав запрос к all_views.

Чтобы увидеть полностью определение представления, которое хранится

в столбце text, используйте команду SQI?Plus SET LONG, которая

устанавливает число отображаемых SQIfPlus символов при извлечении

столбцов LONG. Например, следующая команда устанавливает LONG на 200:

П SET LONG 200

Следующий пример отбирает из user_views столбцы view_name, text_

length и text:

□ SELECT view_name, text_length, text

FROM user_views

ORDER BY view_name;

Создание таблиц, последовательностей, индексов и представлений 345

VIEW_NAMETEXT_LENGTH

TEXT

CHEAP_PRODUCTS_VIEW 97

SELECT “PRODUCT_ID” , “PRODUCT_TYPE_ID” , “NAME” , “DESCRIPTION” , “PRICE"

FROM products

WHERE price < 15

CHEAP_PR0DUCTS_VIEW2 116

SELECT “PRODUCT_ID” , "PRODUCTTYPE_ID” , "NAME", “DESCRIPTION” , “PRICE”

FROM products

WHERE price < 15

WITH CHECK OPTION

CHEAP_PR0DUCTS_VIEW3 113

SELECT “PRODUCT_ID” , “PRODUCT_TYPE_ID” , “NAME” , “DESCRIPTION” , “PRICE”

FROM products

WHERE price < 15

WITH READ ONLY

EMPLOYEES_VIEW 75

SELECT employee_id, manager_id, first_name, last_name, t i t l e

FROM employees

Получение информации об ограничениях для представлений

К представлению можно добавить ограничения CHECK OPTION и READ ONLY.

Представление cheap_products_view2 содержит ограничение CHECK OPTION,

которое гарантирует, что цена товара меньше 15 долларов. Представление

cheap_products_view3 содержит ограничение READ 0LY, не позволяющее

модифицировать строки базовой таблицы.

Получить информацию об ограничениях для представлений можно из

user_constraints; например:

□ SELECT

constraint_name, constraint_type, status, deferrable, deferred