Lab 9 Дополнительные объекты БД

advertisement
Последовательности
Триггеры
Представления
Последовательности
Последовательность - это ряд чисел, в котором
каждое последующие число больше предыдущего.
Из этого следует, что каждое число в
последовательности встречается всего один раз.
Следовательно, последовательности очень хорошо
подходят для генерации первичных ключей для
идентификации объектов внутри базы данных.
 В Oracle последовательности представлены в виде
отдельных сущностей базы данных. Для
последовательности следующие параметры имеют
важные значения:
 1) Начальное значение последовательности
 2) Шаг последовательности
 3) Минимальное значение последовательности
Последовательность можно создавать используя
средство проектирования или работы с БД, а также
напрямую кодом DDL.
В данном примере 2 суррогатных ключа
формируемых из последовательностей.
Создадим последовательность в ErWin:
1. В дереве объектов найдите соответствующую
строку и в контекстном меню нажмите «New».
2. Дайте имя объекту. Имя необходимо выбирать
такое чтобы было понятно для чего
используется объект.
3. Далее в меню выберете «Proporties»
определите минимально необходимые
параметры, такие как начальное значение и
шаг.
4. при генерации кода DDL в отделе «Schema»
поставьте галочку для создания
последовательности и посмотрите
сгенерированный код.
5. Создания последовательности не достаточно
для формирования первичного ключа
автоматически. Для этого необходимо указать
это действие в триггере.
-это именованные блоки кода SQL, которые заранее
откомпилированы и хранятся на сервере для того,
чтобы быстро производить выполнение запросов,
валидацию данных и выполнять другие, часто
вызываемые функции.
Все программные блоки разрабатываются с применением
процедурного языка PL/SQL, представляющий собой расширение
стандарта ANSI языка SQL, разработанного фирмой Oracle.
Собственно SQL, не является процедурным языком, да и, по
большому
счету,
он
вообще
не
относится
к
языкам
программирования.
PL/SQL - это процедурный язык пошагового программирования,
инкапсулирующий язык SQL. В результате получается хорошо
развитый язык программирования третьего поколения (3GL),
подобный языкуC++, Pascal и т. д. В своей сути PL/SQL блочно
ориентирован.
Блоки PL/SQL, могут быть "именованными" и "не
именованными".
Блок PL/SQL является фундаментальной
программной конструкцией! Программирование
модулями позволяет разрабатывать легко
читаемый код и программировать сверху вниз.
Стандартная конструкция неименованного блока:
DECLARE -- объявления
…
BEGIN -- выполняемый код
…
EXCEPTION -- обработка исключений
…
END; / -- символ завершения для запуска блока на
компиляцию
Такой блок каждый раз при выполнении
компилируется. Так же он не хранится в базе
данных и не может быть вызван из другого
блока.
Процедур и функций – это именованные блоки. Такие блоки
хранятся в базе данных и могут быть использованы повторно.
Синтаксис объявления процедуры:
CREATE [OR REPLACE] PROCEDURE - имя_процедуры (аргумент
[IN] [OUT] [IN OUT] тип, ..... )
AS [IS]
тело процедуры
где:
(имя_процедуры) - имя создаваемой процедуры,
(аргумент) - имя параметра процедуры,
(тип) - это тип соответствующего параметра,
(тело процедуры) - это блок PL/SQL в котором содержится текст процедуры.
Для изменения программного кода процедуры ее необходимо удалить,
а затем создать вновь, для того, чтобы делать это за один проход
применяется дополнительный оператор объявления REPLACE, что
буквально понимается, как заменить. Если его не применять, то
процедуру необходимо удалить с помощью оператора DROP
PROCEDURE имя. Вот таким образом, определяется данная
конструкция. Далее мы с вами поучимся создавать процедуры.



Поскольку эти команды сохраняются на сервере, то
код создается только один раз, а не в каждом
приложении, работающем с базой данных. Это
экономит время при написании программ.
Поскольку коды хранятся на сервере, то их не
требуется пересылать по сети из клиентского
приложения, что значительно снижает сетевой
трафик.
Сохраняя коды на сервере, Вы тем самым
гарантируете, что целостность данных и правила
(business rules) поддерживаются единым образом,
независимо от того, какое именно клиентское
приложение обращается к данным.
Триггер может выполняться при вставке, изменении или
удалении строки в существующей таблице и сообщает СУБД,
как нужно выполнять команды SQL INSERT, UPDATE или DELETE,
чтобы выполнялись нормальные правила (business rules)
организации.
Так же триггеры имеют определенные правила
активации
(firing):
До момента (BEFORE) срабатывания одного из операторов DML
После момента (AFTER) срабатывания одного из операторов DML
Если триггер является строковым он активируется один раз для
каждой из строк, на которую воздействует оператор вызывающий
срабатывания триггера (опция FOR EACH ROW). Если триггер
является операторным то он активируется один раз до или после
оператора.
Триггер ссылочной целостности - особый вид
триггера, используемый для поддержания
целостности
между
двумя
таблицами,
которые связаны между собой.
Если строка в одной таблице вставляется,
изменяется или удаляется, то триггер
ссылочной целостности сообщает СУБД, что
нужно делать с теми строками в других
таблицах, у которых значение внешнего
ключа совпадает со значением первичного
ключа вставленной (измененной, удаленной)
строки
Существуют так же так называемые системные триггеры,
которые
срабатывают на события самой БД.
В триггеры используются для:





Реализации сложных ограничений целостности
данных, которые невозможно
осуществить через описательные ограничения,
устанавливаемые при создании
таблиц.
Организации всевозможных видов аудита.
Например, слежения за изменениями в
какой-либо важной таблице БД.
Автоматического оповещения других модулей о
том, что делать в случае
изменения информации содержащейся в
таблице БД.
Для реализации так называемых "бизнес
правил".
Для организации каскадных воздействий на
таблицы БД.
Синтаксис команды для создания триггера
CREATE [OR REPLACE] TRIGGER имя_триггера ….
BEFORE | AFTER активизирующее_событие
ON ссылка_на_таблицу
FOR EACH ROW [WHEN условие_срабатывания] …
тело_триггера …






Где:
имя_триггера - собственно имя вашего триггера.
активизирующее_событие - указывает момент активации
триггера
BEFORE до срабатывания оператора DML, AFTER после
срабатывания оператора DML.
ссылка_на_таблицу - собственно таблица, для которой
создан триггер.
FOR EACH ROW - если указано активируется от воздействия
на строку если нет, то после любого оператора DML.
условие_срабатывания - если TRUE триггер срабатывает,
если FALSE нет.
тело_триггера - собственно тело триггера.
Именование триггеров.
Триггеры имеют собственное пространство имен
(namespace). В пределах одного пространства
имен, как известно, не может быть двух
функций или процедур с одинаковым именем.
Для удобства чтения кода БД следует давать
триггеру имя указывающее на то, что он
производит.( хотя имя не важно, так как триггер
нельзя "позвать" из процедуры или функции это запрещено)
Группа разработчиков может придерживаться
своего принципа наименования объектов ,
например:
customer_ins_trg (имя таблицы_запрос
DML_триггер)
Когда Вы создаете физическую схему базы
данных, ERwin автоматически создает все
триггеры и хранимые процедуры,
определенные в Вашей модели данных, с
соблюдением синтаксиса SQL для Вашей СУБД.
Для генерации триггеров и хранимых процедур
дайте команду меню Server “<DB> Schema
Generation...”. ERwin открывает редактор
Schema Generation Report.
Задание: сгенерируйте триггер для таблицы и представьте код
в окне «Schema Generation Preview»
Во вкладке «Code» измените этот триггер,
прописав следующее в его тело:
В созданную
переменную tmpVar
получаем следующее
значение из
последовательности и
присваиваем атрибуту
«ID»
CREATE or REPLACE TRIGGER Sotrudnik_ins_trg
BEFORE INSERT ON Sotrudnik FOR EACH ROW
DECLARE NUMROWS INTEGER;
tmpVar NUMBER;
BEGIN
tmpVar := 0;
SELECT Sotrudnik_SEQ.NEXTVAL INTO tmpVar FROM dual;
:new.ID:=tmpVar;
END;
После генерации кода и вставки его в окно
SQLDeveloper сравните его с этим примером.
После создания триггера введите несколько
новых строк не указывая атрибут «ID»
Представления (VIEW) - это специализированный
способ представления данных, содержащихся в
одной или более таблиц, или в одном или
нескольких представлениях. Результат запроса
представляется в виде обычной таблицы.
Для создания представлений используется оператор
CRAETE VIEW. Любое представление определяется
запросом, который обращается к одной или более
таблиц, материализованных представлений или
других представлений
CREATE VIEW имя представления
AS (далее запрос Select из одной или нескольких таблиц)
SELECT
FROM
WHERE .. И тд
Представление – это виртуальная таблица. В действительности
представление – всего лишь результат выполнения
оператора SELECT, который хранится в структуре памяти,
напоминающей SQL таблицу, например,Oracle.
Для тех, кто работает с представлением, манипулирование его
данными ничем не отличается от манипулирования данными
таблицы. В некоторых случаях пользователь может вводить
данные в представление, как если бы оно было таблицей.
Работая с представлением нужно помнить, что:



Представления добавляют уровень защиты данных (например,
можно создать представление для таблицы, где пользователю,
выполняющему SELECT над представлением, видны только сведения
о зарплате)
Представления могут скрывать сложность данных, комбинируя
нужную информацию из нескольких таблиц
Представления могут скрывать настоящие имена столбцов, порой
трудные для понимания, и показывать более простые имена.
Создадим представление, которое содержит все
задания и их исполнителей
Создадим представление в ErWin:
1. В дереве объектов найдите соответствующую
строку и в контекстном меню нажмите «New».
2. Дайте имя объекту. Имя необходимо выбирать
такое чтобы было понятно для чего
используется объект. Новое представление
появится на поле с таблицами.
3. Далее в меню выберете «Proporties»во вкладке
«From» определим из каких таблиц будет
производится выборка, во вкладке «Select» столбцы представления, а также укажите
условия соединения во вкладке «Where»/
4. Код DDL можно увидеть во вкладке «SQL», а
также при генерации кода в соответствующем
разделе.
5. Запустите код в базу и посмотрите созданное
представление в дереве объектов в
SQLDevelopere.



Создайте последовательности для 2х
таблиц из прошлой работы.
Создайте триггеры для автоматического
формирования первичного ключа,
получаемого из последовательности.
Создайте представление на основе Ваших
2х таблиц.
Download