- •Лекция №9- Безопасность Привилегии в базах данных
- •Идентификаторы пользователей и права владения
- •Привилегии
- •Предоставление привилегий другим пользователям (оператор grant)
- •Отмена предоставленных пользователям привилегий (оператор revoke)
- •Перезагрузка привилегий (оператор flush)
- •Представления в базах данных
- •Создание представлений (оператор create view)
- •Удаление представлений (оператор drop view)
- •Замена представлений
- •Использование конструкции with check option
- •Преимущества и недостатки представлений
Удаление представлений (оператор drop view)
Представление удаляется из базы данных с помощью оператора DROP VIEW, имеющего следующий формат:
DROP VIEW ViewName [RESTRICT | CASCADE]
При выполнении оператора DROP VIEW определение представления удаляется из базы данных. Например, представление Manager3Staff можно удалить с помощью следующего оператора:
DROP VIEW Manager3Staff;
Если указано ключевое слово CASCADE, при выполнении оператора DROP VIEW будут также удалены все связанные с ним или зависящие от него объекты. Другими словами, будут удалены все объекты, содержащие ссылки на удаляемое представление. Это означает, что такой оператор DROP VIEW удаляет также все представления, которые определены на основе удаляемого представления. Если указывается ключевое слово RESTRICT и существуют любые прочие объекты, зависящие от существования удаляемого представления, выполнение этого оператора блокируется. По умолчанию принимается значение RESTRICT.
Замена представлений
Ознакомившись с тем, как создаются и используются представления, проанализируем более подробно процедуру выполнения запроса, обращающегося к некоторому представлению. Для иллюстрации процесса замены представления оператором SQL рассмотрим приведенный ниже запрос, предназначенный для подсчета сдаваемых в аренду объектов, за которые отвечает каждый из работников отделения компании с номером 'В00З'. Этот запрос обращается к представлению StaffPropCnt, определение которого приведение в описании примера "Представление, формируемое путем группирования и соединения":
SELECT staffNo, cnt
FROM StaffPropCnt
WHERE branchNo = 'В00З'
ORDER BY staffNo;
Замена представления заключается в слиянии приведенного выше запроса с определяющим запросом представ пения Staff PropCnt и выполняется следующим образом:
1. Имена столбцов, указанные з списке конструкции SELECT запроса, преобразуются в соответствующие им имена столбцов определяющего запроса. В результате конструкция SELECT приобретает следующий вид:
SELECT s.staffNo AS staffNo, COUNT(*) AS cnt
2. Имена представлений, указанные в конструкции FROM запроса, замещаются соответствующими списками из конструкций FROM определяющего запроса:
FROM Staff s, PropertyForrRent p
3. Конструкция WHERE исходного запроса пользователя объединяется с конструкцией WHERE из определяющего запроса представления с помощью логического оператора AND:
WHERE s.staffNo = p.staffNo AND branchNo = 'B003'
4. Конструкции GROUP BY и HAVING из определяющего запроса представления просто копируются в исходный запрос. В нашем примере в определяющем запросе присутствует только конструкция GROUP BY:
GROUP BY s.staffNo, s.branchNo
5. В объединенный запрос копируется конструкция ORDER BY из исходного запроса, в котором имена столбцов представления преобразованы в имена столбцов определяющего запроса:
ORDER BY s.staffNo
6. В результате всех перечисленных выше операций объединенный запрос приобретает следующий вид:
SELECT s.staffNo AS staffNo, COUNT ( * ) AS cnt
FROM Staff s, PropertyForRent p
WHERE s.staffNo = p.staffNo AND branchNo = 'B003'
GROUP BY s.staffNo, s.branchNo
ORDER BY S.staffNo;
Результаты выполнения объединенного запроса представлены в таблице
staffNo |
cnt |
SG14 |
1 |
SG37 |
2 |
Ограничения на использование представлений |
Стандарт ISO налагает несколько важных ограничений на создание и использование представлений, хотя в этом отношении между разными диалектами языка SQL существуют значительные отличия.
SELECT COUNT(cnt) FROM StaffPropCnt; Ошибка состоит в том, что сделана попытка применить к значениям столбца cnt агрегирующую функцию, в то время как она уже использовалась для определения значений в этом столбце. Аналогичным образом, еще один запрос также является некорректным: SELECT * FROM StaffPropCnt WHERE cnt > 2; В данном случае ошибка заключается в том, что в конструкцию WHERE запроса помещен столбец cnt представления, создаваемый с помощью агрегирующей функции.
|
Обновление данных в представлениях |
Все обновления, выполненные в таблице базы данных, немедленно отражаются на всех представлениях, предусматривающих обращения к этой таблице. Подобным же образом, можно ожидать, что если данные были изменены в представлении, то это изменение будет отображено и в той таблице (таблицах) базы данных, на которой оно построено. Однако такое условие не всегда соблюдается. Еще раз обратимся к представлению StaffPropCnt. Рассмотрим, что произойдет, если будет предпринята попытка вставить с использованием следующего оператора INSERT запись, содержащую данные о том, что в отделении В00З работник с табельным номером SG5 управляет двумя объектами недвижимости: INSERT INTO StaffPropCnt VALUES ('В00З', 'SG5', 2); При обработке этого оператора потребуется вставить в таблицу PropertyForRent две записи, отмечающие тот факт, что работник с табельным номером 'SG5' отвечает за два объекта недвижимости. Однако это невозможно будет сделать, поскольку неизвестно, за какие именно сдаваемые в аренду объекты отвечает данный работник. Ведь мы не знаем даже значений первичного ключа записей таблицы PropertyForRent, не говоря уже о других ее столбцах. Попробуем изменить определение представления и заменить столбец с количеством записей столбцом с номерами сдаваемых в аренду объектов: CREATE VIEW StaffPropLiat (branchNo, staffNo, propertyNo) AS SELECT s.branchNo, s.staffNo, p.propertyNo FROM Staff s, PropertyForRent p WHERE s.staffNo = p. staff No; А теперь попробуем добавить в представление новую запись: INSERT INTO StaffPropList VALUES ('B003' , 'SG5', 'PG19'); Однако и в этом случае вставка новой записи в таблицу окажется невозможной, поскольку в определении таблицы PropertyForRent указано, что все ее столбцы (за исключением postcode и staffNo) не могут содержать значения NULL. Однако представление StaffPropList не содержит никаких полей таблицы PropertyForRent, за исключением номера объекта недвижимости, поэтому у нас нет возможности задать значения всех остальных обязательных столбцов этой таблицы. В стандарте ISO указано, что представления могут быть обновляемыми только в тех системах, которые отвечают некоторым четко определенным требованиям. Согласно стандарту ISO представление может быть обновляемым только в том случае, если:
Кроме того, любая строка данных, добавляемая с помощью представления, не должна нарушать требования поддержки целостности данных, установленные для исходной таблицы представления. Например, при добавлении с помощью представления новой строки таблицы во все столбцы таблицы, отсутствующие в этом представлении, будут введены значения NULL. Однако при этом не должны нарушаться все требования NOT NULL, указанные в описании исходной таблицы представления. Основную концепцию, используемую при формулировании обсуждаемых ограничений, можно выразить с помощью следующего определения. Обновляемое представление.Для того чтобы представление было обновляемым, СУБД должна иметь возможность однозначно отобразить любую его строку или столбец на соответствующую строку или столбец его исходной таблицы. |