Технология проектирования и администрирования баз данных и систем данных-Конспект3
.pdf
- 41 -
таблиц ?
2.Каким целям служат представления ?
3.Каким образом достигается актуальность содержимое представления ?
4.На чем основано наименование представления виртуальной (просматриваемой) таблицей ?
5.Должно ли представление иметь одинаковое имя с таблицей, от которой порождено ?
6.Возможно ли создание представления, включающего информацию из нескольких таблиц одновременно ?
1.15.Независимость данных
Виды освобождают пользователя от необходимости знать, в каких таблицах находятся данные, c которыми он работает. Это разница в том, какие данные пользователь видит и как они хранятся, носит название независимость данных; эта разница упрощает доступ к данным в БД. Но можно использовать виды и для хранения пользовательских запросов, программ и так далее, предохраняя их от устаревания при изменениях базы данных.
Текущая структура БД позволяет связать несколько работников с проектом, однако каждый должен работать только по одному проекту - это известное соотношение 'многие к одному'. Предположим, что процедуры по персоналу изменились и сейчас есть необходимость связать работников с несколькими проектам. Чтобы это выполнить, необходимо пересмотреть структуру базы данных, преследуя две цели.
Первая цель - предохранить старые виды БД, чтобы можно было продолжать работы со всеми прикладными системами, отчетами и программами, зависящими от исходной структуры базы данных. Вторая цель заключается в том, чтобы иметь возможность использовать новые данные (дополнительные проекты) для построения новых прикладных систем. Ниже приведены этапы достижения поставленной цели.
Сначала создадим новую таблицу, |
соотносящую работников с |
|
проектами и содержащую информацию об участии конкретных работников в |
||
конкретном проекте (например, введем |
новый столбец - часы работы |
|
WORKHPS. Новая структура базы данных |
будет поддерживать соотношения |
|
типа 'многие-к-многим'): |
|
CREATE TABLE PE (EMPNO |
NUMBER (4), |
PROJNO |
NUMBER (3), |
WORKHPS |
NUMBER (4)); |
Далее присоединим работников к проектам путем введения строк в таблицу РЕ. Отметим, что работник под номером 7369 имеет две строки в этой
- 42 -
таблице: одна для проекта 101 и другая - для 102. Присоединение работников к проектам выполняется многократным использованием INSERT:
INSERT INTO PE VALUES (7369, 101, 0);
INSERT INTO PE VALUES (7369, 102, 0);
INSERT INTO PE VALUES (7399, 101, 0);
INSERT INTO PE VALUES (7521, 101, 0);
INSERT INTO PE VALUES (7366, 101, 0);
INSERT INTO PE VALUES (7554, 101, 0);
INSERT INTO PE VALUES (7698, 102, 0);
INSERT INTO PE VALUES (7782, 102, 0);
INSERT INTO PE VALUES (7788, 101, 0);
INSERT INTO PE VALUES (7839, 102, 0);
INSERT INTO PE VALUES (7844, 101, 0);
INSERT INTO PE VALUES (7876, 101, 0);
INSERT INTO PE VALUES (7900, 102, 0);
INSERT INTO PE VALUES (7902, 101, 0);
INSERT INTO PE VALUES (7934, 102, 0);
В будущем, если работник будет присоединен ко второму или третьему проекту, достаточно ввести дополнительную строку для этого работника в таблицу РЕ.
Поскольку теперь используется таблица РЕ для соотношения работников с проектами, больше не нужна информация, хранимая в колонке PROJNO таблицы ЕМР. Можно удалить эти данные путем установки значений этой колонки в пустые:
UPDATE EMP
SET PROJNO = NULL;
Вспомним, что отсутствие клаузы |
WHERE приказывает обновить |
все строки в таблице. |
|
Поскольку все PROJNO установлены в |
NULL, больше невозможно |
использовать вид PERSONNEL, который использует колонку PROJNO для связи таблиц ЕМР и PROJ. Для генерации этой информации снова нужно соединить таблицу ЕМР с новой таблицей РЕ и соединить таблицу РЕ с нашей таблицей PROJ. Но возможно спрятать это изменение от пользователей, использующих вид PERSONNEL, просто изменив определение вида. Первый шаг в изменении вида PERSONNEL - уничтожить старый вид:
DROP VIEW PERSONNEL;
- 43 -
Теперь создадим новый вид PERSONNEL, объединяющий таблицу ЕМР и таблицу PROJ через таблицу РЕ :
CREATE VIEW PERSONNEL AS
SELECT ENAME,JOB,PNAME
FROM EMP,PROJ,PE
WHERE EMP.EMPNO = PE.EMPNO
AND PE.PROJNO = PROJ.PROJNO;
Теперь программы, использующие старый вид PERSONNEL, могут продолжать работу без модификации и пользователи могут работать со старыми данными в общем случае, не боясь изменений в базе данных.
Запрашивая новый вид PERSONNEL, увидим такую же информацию, как для старого вида PERSONNEL плюс второй проект для работника SMITH:
SELECT *
FROM PERSONNEL
ORDER BY ENAME;
ENAME |
JOB |
PNAME |
|
ADAMS |
CLERK |
ALPHA |
|
ALLEN |
SALESMAN |
ALPHA |
|
BLAKE |
MANAGER |
ALPHA |
|
CLARK |
MANAGER |
ALPHA |
|
FORD |
ANALYST |
ALPHA |
|
JAMES |
CLERK |
BETA |
|
JONES |
MANAGER |
ALPHA |
|
KING |
PRESIDENT |
BETA |
|
MARTIN |
SALESMAN |
ALPHA |
|
MILLER |
CLERK |
BETA |
|
SCOTT |
ANALYST |
ALPHA |
|
SMITH |
CLERK |
ALPHA |
SMITH работает по двум |
SMITH |
CLERK |
BETA |
проектам - ALPHA и BETA |
TURNER |
SALESMAN |
ALPHA |
|
WARD |
SALESMAN |
ALPHA |
|
Только что был продемонстрирован пример, как можно легко изменить структуру базы данных без изменений пользовательских программ, хранимых запросов и др. Это возможно именно потому, что SQL является непроцедурным языком и позволяет иметь разные виды (представления) одних и тех же данных.
Контрольные вопросы
-44 -
1.В чем заключается независимость данных ?
2.Допустимо ли использовать представления для хранения не только традиционных данных, но и текстов пользовательских запросов, программ
идр. ?
3.Каким образом с помощью представлений можно обеспечить функционирование старых программ без их модификации ?
1.16.Разделение данных и защита |
|
Поддерживающие язык SQL системы |
дают возможность |
многочисленным пользователям иметь доступ к |
одной базе данных. Это |
позволяет разделять (по желанию) свои данные с другими пользователями.
Вданном разделе обсуждается, как использовать SQL для:
*ГАРАНТИИ привилегий в таблицах и видах для других пользователей
*ОТМЕНЯТЬ привилегии, которые ранее были гарантированы
другим |
пользователям |
Данный пользователь является полновластным владельцем любой созданной им таблицы (обладает всеми привилегиями доступа к ней - на чтение, изменение, уничтожение данных). Для регулирования доступа к данным для других пользователей служит инструкция GRANT.
Команда GRANT состоит из трех базовых клауз:
GRANT привилегия
ON таблица или вид
ТО пользователь или группа пользователей;
Предположим, что текущий пользователь является создателем таблицы ЕМР и желает дать пользователю по имени ADAMS право на запросы к ней. Для этого следует задать команду:
GRANT SELECT
ON EMP
TO ADAMS;
Возможно гарантировать любую комбинацию привилегий функционирования в таблицах или видах, включая:
Привилегии для таблиц |
Привилегии для видов |
||
SELECT |
выбрать |
SELECT |
выбрать |
INSERT |
ввести |
INSERT |
ввести |
UPDATE |
обновить |
UPDATE |
обновить |
- 45 -
DELETE |
удалить |
DELETE |
удалить |
ALTER |
изменить |
|
|
INDEX |
индексировать |
|
|
CLUSTER |
кластер |
|
|
В предыдущем примере пользователю ADAMS гарантированы привилегии на выборку из всей таблицы EMP. Но что будет, если необходимо обеспечить всем пользователям доступ ко всей таблице, за исключением колонок SAL и СОММ ?
Вопрос может быть решен путем гарантирования привилегий к видам, а не таблицам. Можно ограничить доступ к заданным строкам и колонкам таблицы. Сначала определим вид EMP, который не содержит колонки SAL и СОММ:
CREATE VIEW EMPS AS
SELECT EMPNO,ENAME,JOB,HIREDATE,DEPTNO FROM EMP;
Теперь легко гарантировать привилегии на доступ к виду EMPS для всех пользователей при помощи ключевого слова PUBLIC:
GRANT SELECT
ON EMPS
TO PUBLIC; --- PUBLIC значит ‘ДЛЯ ВСЕХ’
Еще одна возможность SQL - он позволяет создавать виды,
возвращающие разные результаты разным пользователям ! Создадим вид таблицы EMP, возвращающий данные только о тех пользователях, номера отдела которых совпадают с номером отдела персоны, использующей данный вид:
CREATE VIEW MYEMPS AS SELECT *
FROM EMP WHERE DEPTNO IN
(SELECT DEPTNO FROM EMP
WHERE ENAME = USER);
Ключевое слово USER |
(используемое в конструкции |
WHERE ENAME=USER) возвращает |
имя текущего вошедшего в систему |
пользователя. Если это JONES, работающий в отделе 10, то он имеет доступ к виду MYEMPS, где перечислены только работники отдела 10. Если это BLAKE (из отдела 30), то он увидит только работников отдела 30. Другими
- 46 -
словами, вид становится чувствительным к тем, кто его использует. Несложно гарантировать доступ и привилегии обновления к виду
MYEMPS для всех трех менеджеров отделов для разрешения им читать и изменять любые данные о работниках только их отделов:
GRANT SELECT,UPDATE ON MYEMPS
ТО JONES, BLAKE, CLARK;
Таким образом, если работник переведен в другой отдел (то есть значение в поле DEPTNO изменилось), новый менеджер автоматически получает доступ к сведениям по окладу данного работника, а старый менеджер отдела автоматически теряет к нему доступ. Сочетание возможностей VIEW и GRANT, а также ключевого слова USER, дает поддерживающим SQL системам способность осуществлять защиту, чувствительную к содержимому БД.
Команда REVOKE
После предоставления привилегии всегда можно ее отменить при помощи команды REVOKE.
Например, для отмены привилегий ADAMS на введение значений в таблицу DEPT следует задать следующую SQL-инструкцию:
REVOKE INSERT
ON DEPT
FROM ADAMS;
Контрольные вопросы
1.Каким образом подтверждаются и отменяются привилегии пользователей на доступ к конкретной таблице БД ?
2.Какими привилегиями обладает пользователь по отношению к созданной по его требованию таблице ?
3.Каким образом осуществляется разделение привилегий на доступ к отдельным столбцам таблицы ?
4.В чем заключается принцип защиты информации, чувствительный к содержимому БД ?
1.17.Понятие транзакции
Транзакция - логическая единица работы, определяемая пользователем. Важнейшим свойством транзакции является ее атомарность - транзакция
- 47 -
должна или завершиться полностью и успешно, или не завершиться совсем. В качестве логической единицы может выступать любое количество операторов SQL (однако целесообразно включать в единичную транзакцию логически связанные запросы). Смысл реализации транзакций - повышение уровня целостности информации в БД в критических ситуациях (например, в случае потери связи с удаленной БД, при сбое питания и др.).
Транзакцию (или логическую единицу работы) можно определить как последовательность ряда таких операций, которые преобразуют некоторое непротиворечивое состояние базы данных в другое непротиворечивое состояние (но не гарантируют сохранения непротиворечивости во все промежуточные моменты времени).
Транзакция начинается выдачей команды BEGIN TRANSACTION (т.е. начать вести журнал транзакции, в который записываются все необходимые
изменения в БД). Далее |
следуют команды |
изменения БД (‘тело’ |
|
транзакции). |
Транзакция может завершиться успешно (для чего выдается |
||
команда COMMIT) или может быть проведен 'откат’ данной транзакции (по |
|||
команде ROLLBACK) к исходному (до момента начала транзакции) |
|||
состоянию БД. Команды |
COMMIT или |
ROLLBACK могут являться |
|
условными; по умолчанию COMMIT выполняется в случае успешного |
|||
выполнения |
тела транзакции (что определяется |
согласно записям в журнале |
|
транзакций), |
в противном случае выполняется ROLLBACK. Естественно, |
||
пользователь |
(обычно привилегированный) имеет возможность ‘откатить’ |
||
все зарегистрированные в журнале транзакции.
Контрольные вопросы
1.Дать определение транзакции. Для применяются транзакции ?
2.В чем заключается основное свойство транзакции ?
3.Что такое журнал транзакций и какие функциональные возможности осуществляются с его помощью ?
1.18.Понятие триггера
Триггер (понятие было введено в Oracle) является разновидностью хранимой (т.е. сохраняемой отдельно, а не входящей в код выполняемой программы) процедуры, срабатывающей автоматически при наступлении определенного события и возвращающей логическое значение.
Различают триггеры уровня блоков (активируются при выполнении запросов) и триггеры уровня записей (активируются в моменты изменений в полях БД). Триггеры также разделяются на пред-триггеры (активируются перед выполнением некоего действия) и пост-триггеры (активируются после выполнения действия)
Тело триггера может содержать любое число SQL-операторов,
- 48 -
возвращающих значение ИСТИНА при выполнении заложенного в теле триггера условия или ЛОЖЬ в противоположном случае.
Простейший случай использования триггера - обеспечение ссылочной целостности БД. Например, в случае попытки удаления записи в MASTERтаблице триггер должен проверить наличие соответствующих ссылок в DETAIL-таблице (вернув значение ИСТИНА при их наличии и ЛОЖЬ в случае отсутствия); программа пользователя при получении значении ИСТИНА от данного триггера обязана отменить удаление записи.
Триггеры являются интуитивно понятным и мощнейшим средством обеспечения корректности функционирования СУРБД.
Контрольные вопросы
1.Что такое триггер (в понятиях SQL) ?
2.Триггеры каких уровней и типов существуют ?
3.Привести пример использования триггера при работе с БД.
СПИСОК ЛИТЕРАТУРЫ
Грабер M. SQL. -M.: Лори, 2001. -643 C.
Пейдж В. Использование ORACLE 8/8i (специальное издание). -М.: Диалектика, 1999. -464 C.
Мещеряков Е.В., Хомоненко А.Д. Публикация баз данных в Интернете. - CПб.: BHV-Петербург, 2001, -560 С.
Codd E.F. Normalized database structure: A brief tutorial. ACM SIGFIDET Workshop on datadescription, access and control. Nov. 1971.
Мaier D. The Theory of Relational Databases. ComputerScience Press, 1983.
Гофман В., Хомоненко А. Delphi 5. -CПб.: BHV-Петербург, 2000. -800 С. Елманова Н.З.Borland С++Builder. -М.: Диалог-МИФИ, 1998. - 240 C. TUXEDO System: разработка систем клиент-сервер. Ладыженский Г.М.. В сб. 'Системы управления базами данных', 1996, № 1,2.
