Общая характеристика реляционной модели данных

Автор работы: Пользователь скрыл имя, 28 Февраля 2013 в 14:56, лекция

Описание работы

Основы реляционной модели данных были впервые изложены в статье Е.Кодда в 1970 г. Эта работа послужила стимулом для большого количества статей и книг, в которых реля-ционная модель получила дальнейшее развитие. Наиболее распространенная трактовка реляционной модели данных принадлежит К.Дейту. Согласно Дейту, реляционная модель состоит из трех частей:
• Структурной части
• Целостной части
• Манипуляционной части

Файлы: 1 файл

Базовые понятия реляционной модели данных.docx

— 169.99 Кб (Скачать файл)

 спецификацию может  быть включен необязательный  список  столбцов.       

 Если   вы   включаете   список   столбцов,   то   данный триггер       

 возбуждается  по  предложению  UPDATE  лишь  тогда,  когда   это       

 предложение обновляет  один  из перечисленных столбцов.   Если вы       

 опускаете   список   столбцов,   то   триггер   возбуждается при       

 обновлении  любого  столбца  ассоциированной  таблицы.    Список       

 столбцов не может  быть специфицирован для  предложений триггера       

 INSERT или DELETE.      

   Предыдущий пример  определения триггера  DUMMY мог  бы содержать       

 список столбцов для  предложения триггера, например:        

 . . . BEFORE DELETE OR INSERT OR UPDATE OF ename ON emp . . .  

Опция FOR EACH ROW

------------------        

 Присутствие  или  отсутствие  опции  FOR  EACH  ROW  определяет,       

 является  ли  этот  триггер  триггером предложения или триггером       

 строки.   Если  эта  опция  включена,  она  указывает,  что тело       

 триггера  возбуждается  отдельно  для  каждой  строки   таблицы,       

 затрагиваемой предложением  триггера.  Отсутствие опции FOR  EACH       

ROW указывает, что данный  триггер должен возбуждаться  лишь  один       

 раз для предложения  триггера. 

Фраза WHEN

----------        

 В определение триггера  строки может быть включено  необязательное       

 ограничение   триггера,   путем   специфицирования    булевского       

 выражения SQL в фразе  WHEN (фраза WHEN не может быть включена  в       

 определение триггера  предложения).  Выражение в фразе WHEN, если        

 эта   фраза   присутствует,   вычисляется   для   каждой строки,       

 затрагиваемой триггером.  Если результат выражения дает TRUE для       

 строки, то тело триггера  исполняется для этой строки.   Однако,       

 если это выражение  вычисляется для строки как  FALSE или NULL, то       

 тело  триггера  не  исполняется  для  этой  строки.   Вычисление       

 условия фразы  WHEN не  влияет на  исполнение самого предложения       

 триггера  (т.е.  предложение  триггера  НЕ  откатывается,   если       

 выражение в фразе  WHERE вычисляется как FALSE).        

 Например, для триггера DUMMY, тело триггера не исполняется,  если       

 новое значение столбца  EMPNO нулевое, отрицательное или  NULL.  В       

 более реалистичных  примерах вы могли бы проверять,  скажем, чтобы       

 одно значение столбца  было меньше другого.        

 Выражение  в  фразе  WHEN  для  триггера  строки  может включать       

 корреляционные  имена,  которые  объясняются  ниже.  Выражение в       

 фразе WHEN должно быть  выражением SQL (но не выражением PL/SQL),        

 и не может включать  подзапрос. 

Тело триггера

-------------        

 Тело  триггера  -  это  блок  PL/SQL,  который  может  содержать       

 предложения SQL  и PL/SQL.   Эти предложения  исполняются тогда,       

 когда выдано предложение  триггера, и ограничение триггера  (если       

 оно есть) вычислено  как TRUE.  Для триггеров строк тело триггера        

 имеет  некоторые  специальные  конструкты,  которые  могут  быть       

 включены в код этого  блока PL/SQL: корреляционные имена,  опцию        

 REFERENCING, а  также условные  предикаты INSERTING,  DELETING и       

UPDATING. 

Доступ к значениям  столбцов в триггерах строки        

 Внутри тела триггера  строк,  код PL/SQL и предложения  SQL имеют       

 доступ как к  старым, так и  к новым значениям  столбцов текущей        

 строки,  затрагиваемой   предложением  триггера.    Для  каждого       

 столбца  модифицируемой  таблицы  определены  два КОРРЕЛЯЦИОННЫХ        

 ИМЕНИ:  одно  для  старого  (old),  другое - для нового значения       

 столбца (new).  В зависимости  от типа предложения триггера,  то       

 или иное корреляционное  имя может быть лишено смысла.             

*  Триггер,   возбужденный   предложением   INSERT,    имеет              

 осмысленный  доступ  лишь  к  новым  значениям  столбцов.              

 Поскольку  строка  создается  предложением INSERT, старые              

 значения столбцов  пусты (NULL).            

*  Триггер, возбужденный  предложением UPDATE,  имеет доступ              

 как к старым, так  и к новым значениям столбцов  для  обоих              

 возможных типов триггера (BEFORE или AFTER).            

*  Триггер,   возбужденный   предложением   DELETE,    имеет              

 осмысленный  доступ  лишь  к  старым  значениям столбцов.              

 Поскольку   строка   перестает   существовать   после  ее              

 удаления, новые значения  столбцов пусты (NULL).        

 Новые  значения  столбцов  адресуются  квалификатором  NEW перед   

     именем  столбца,  старые  -  квалификатором  OLD. Например, если       

 предложение триггера  ассоциировано с  таблицей EMP,  содержащей        

 столбцы SAL, COMM и т.д., то вы можете включить в  тело  триггера       

 предложения, подобные  следующим:        

 IF :new.sal > 10000 . . .        

 IF :new.sal < :old.sal . . .        

 Старые и новые значения доступны как в триггерах BEFORE, так и в       

 триггерах  AFTER.   Назначать  новое  значение  столбца  можно в       

 триггере строк BEFORE, но не в триггере строк AFTER (потому  что       

 предложение  триггера  уже  выполнено,  прежде чем триггер AFTER       

 получает  управление).   Если  триггер  строк  BEFORE   изменяет       

 значение NEW для столбца,  то триггер AFTER, возбужденный тем  же       

 самым  предложением,  видит  значение,  которое  было  назначено       

 триггером BEFORE.        

 Корреляционные  имена  могут  также  использоваться  в булевском       

 выражении фразы WHEN.  Заметьте, что перед квалификаторами OLD и       

NEW должно кодироваться  двоеточие, когда они используются  в теле       

 триггера, но двоеточие  не допускается, когда  эти квалификаторы        

 используются в фразе  WHEN или опции REFERENCING. 

Опция REFERENCING        

 Опция REFERENCING может  специфицироваться в теле триггера  строк       

 для  того,  чтобы  избежать  конфликтов  между   корреляционными       

 именами и именами  таблиц, в случае, если таблица  имеет имя "OLD"       

 или  "NEW".   Поскольку  такая  ситуация  редка, эта опция почти      

   никогда не применяется.         

 Например,  предположим,  что  у  вас  есть таблица с именем NEW,       

 содержащая  столбцы  FIELD1  (числовой)  и  FIELD2 (символьный).       

 Следующее   предложение   CREATE   TRIGGER   показывает триггер,       

 ассоциированный  с  таблицей   NEW,  который  использует   опцию       

REFERENCING,  чтобы  избежать  конфликтов  между корреляционными       

 именами и именем  таблицы:        

 CREATE TRIGGER dummy       

 BEFORE UPDATE ON new       

REFERENCING new AS newest       

FOR EACH ROW       

BEGIN           

:newest.field2 := TO_CHAR (:newest.field1);       

 END;        

 Заметьте, как квалификатор NEW  переименован в NEWEST с  помощью       

 опции REFERENCING, а затем  использован в теле триггера. 

Условные предикаты        

 Если  триггер  может  быть  возбужден  более  чем  одним   типом       

 предложения DML (например, "INSERT OR DELETE OR UPDATE OF emp"),       

 то  в  теле  триггера  можно  использовать  условные   предикаты  

      INSERTING,  DELETING  и  UPDATING,  для  того  чтобы   выполнять       

 различные  участки  кода  в  зависимости  от  типа  предложения,       

 возбудившего  триггер.   Предположим,  что  предложение триггера       

 определено следующим  образом: 

        INSERT OR UPDATE ON emp        

 В коде  внутри тела  триггера вы  можете использовать  следующие       

 условия:        

IF INSERTING THEN . . . END IF;        

IF UPDATING THEN . . . END IF;        

 Первое условие будет  вычисляться как TRUE  лишь в тех  случаях,       

 когда триггер был  возбужден предложением INSERT; второе  условие       

 будет вычисляться  как TRUE лишь в тех случаях,  когда триггер был       

 возбужден предложением UPDATE.        

 Кроме того, в триггере  UPDATE условный предикат UPDATING  можно       

 специфицировать   перед   именем   столбца,   чтобы  определять,       

 обновляется ли  этот столбец  текущим предложением,  возбудившим       

 триггер.  Например, предположим, что триггер определен следующим       

 образом:        

CREATE TRIGGER . . .       

. . . UPDATE OF sal, comm ON emp . . .       

BEGIN       

. . . IF UPDATING ('SAL') THEN . . . END IF;       

 END;        

 Код в фразе THEN выполняется  лишь в том случае, если предложение        

UPDATE, возбудившее  триггер, обновляет  столбец SAL.  Например,       

 следующее  предложение  возбудит   показанный  выше  триггер   и       

 заставит условный  предикат вычислиться как TRUE:        

 UPDATE emp SET sal = sal + 100;  

Условия ошибок и исключения в теле триггера        

 Если  во  время  исполнения  тела  триггера  возникает   условие       

 предопределенной   или    определенной   пользователем    ошибки       

(исключение),  то  все  действия   как  тела  триггера,  так   и       

 предложения,  возбудившего   триггер,  откатываются   (если  это       

 исключение не обрабатывается  специально).  Поэтому тело триггера       

 может  сознательно   воспрепятствовать  исполнению   предложения       

 триггера  путем  возбуждения  исключения.   Обычно  в  триггерах       

 используются  определяемые  пользователем  исключения,   которые       

 реализуют  комплексные   проверки  полномочий   или  ограничения       

 целостности.        

 Для дополнительной  информации об обработке ошибок  в  программных

        единицах  PL/SQL  обратитесь  к  секциям  "Обработка  ошибок"  и       

"Объявление  исключений  и  программы  обработки  исключений" на       

 страницах 7-11 и 7-12. 

Ограничения на создание триггеров         

 Следующие секции  обсуждают ограничения,  которые налагаются  на       

 триггеры.        

 ЧИСЛО  ТРИГГЕРОВ  НА  ТАБЛИЦУ.   Лишь  один триггер каждого типа       

 может существовать  на таблицу.  Это позволяет иметь для  таблицы       

 двенадцать возможных  триггеров:        

 BEFORE UPDATE строк             AFTER UPDATE строк        

BEFORE DELETE строк             AFTER DELETE строк        

BEFORE INSERT предложения       AFTER INSERT предложения       

BEFORE INSERT строк             AFTER INSERT строк        

 BEFORE UPDATE предложения       AFTER UPDATE предложения       

BEFORE DELETE предложения       AFTER DELETE предложения        

 Если вы  попытаетесь повторно  создать любой  тип триггера,  уже       

 существующий для таблицы,  вы получите ошибку времени  компиляции.        

 Замечание:  Каждая  таблица  может  иметь  до  четырех триггеров       

UPDATE (BEFORE/AFTER,  предложения/строки), независимо  от того,       

 возбуждаются  ли  эти  триггеры  при  обновлении   специфических       

Информация о работе Общая характеристика реляционной модели данных