Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Технология проектирования и администрирования баз данных и систем данных-Конспект3

.pdf
Скачиваний:
35
Добавлен:
20.03.2016
Размер:
1 Мб
Скачать

- 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.