Вставка значений в это представление не получится. Нельзя изменить более одной таблицы посредством связанного представления. Если мы попытаемся вставить только один столбец одной таблицы (employee_id), Oracle потребует вставки foreign key (department_id) и т.д. – для всех вариантов вставки столбцов. Изменение в одном варианте (update emp_dept set employee_id where employee_id…..) возможно, но только для строк служашего, у которого нет подчиненных.
Q6_3. Использование представлений для отработки запроса.
Использование представлений для отработки запроса нередко «спасает» студентов на контрольной работе по SQL. Рассмотрим такой запрос:
Получите имена всех заказчиков товара (которые оформляли заказы два или более раза), год заказа, а также фамилии торговых представителей для этих заказчиков. Выводимый список упорядочте по имени заказчика и году продаж.
Посмотрим, как этот запрос можно отработать с использованием представлений.
Имя заказчика – customer.name
Год заказа – to_char(sales_order.ship_date,'yy')
Фамилия торгового представителя – employee.last_name
Сначала найдем имена заказчиков, которые оформляли заказы два или более раза:
В отличии от создания обычной таблицы при создании таблицы кластера указывается, к какому кластеру таблица принадлежит и по какому столбцу построен кластер.
demo@10g> create index idx_loc_dept on cluster loc_dept;
Индекс создан.
Заполним таблицы данными:
demo@10g>insert into DEPARTMENT1 (select * from DEPARTMENT);
11 строк создано.
demo@10g>insert into LOCATION1 (select * from LOCATION);
4 строк создано.
Теперь при отработке запросов, включающих во фразе «…from» обе таблицы кластера, Oracle будет отрабатывать эти запросы, извлекая данные из струкутуры кластера.
Q6.8. Удаление кластера, всех таблиц, принадлежащих кластеру и всех ограничений целостности, принадлежащих ему
demo@10g>drop cluster LOC_DEPT
including tables cascade constraints;
Кластер удален.
Q6.9. Создадим синоним для таблицы department:
demo@10g>create synonym DEPT for DEPARTMENT;
create synonym DEPT for DEPARTMENT
*
ошибка в строке 1:
ORA-01031: привилегий недостаточно
Сообщение об ошибке указывает об отсутствии у пользователя DEMO привилегии создавать синонимы. Для выдачи такой привилегии пользователю DEMO из другого окна SQL*Plus соединимся пользователем SYSTEM (DBA) и выполним этим пользователем команду: system@10g> create synonym demo.dpt for demo.department;. Теперь к таблице DEPARTMENT пользователю DEMO можно обращаться по более короткому имени синонима:
demo@10g>select * from DPT;
Пользователь DEMO может дать другим пользователям привилегию для работы с таблицей своей схемы:
demo@10g>grant select on EMPLOYEE to scott;
Привилегии предоставлены.
Теперь пользователь SCOTT (предварительно сединившись с Oracle, конечно) может извлекать данные из таблицы EMPLOYEE пользователя DEMO такой, например, командой: demo@10g>select * from demo.employee; , указав владельца таблицы и название таблицы. Пользователю SCOTT обращаться к таблице EMPLOYEE пользователя DEMO, каждый раз набирая имя пользователя DEMO, не совсем удобно (лишние дествия на клавиатуре). Чтобы устранить это неудобство, администратор SYSTEM выполняет команду: system@10g>create public synonym empl for demo.employee;, после которой и пользователь DEMO, и все другие пользователи, у которых есть привилегия извлекать данные из таблицы EMPLOYEE, принадлежащей пользователю DEMO, могут извлекать данные из этой таблицы, обращаясь к ней по имени EMPL: