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

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

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

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

Файлы: 1 файл

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

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

 столбцов.         

 ДОПУСТИМЫЕ ПРЕДЛОЖЕНИЯ  SQL В ТЕЛЕ ТРИГГЕРА.  Тело триггера может       

 содержать  любые  предложения  DML,  включая  предложения SELECT       

(только SELECT ...  INTO  или предложения SELECT в  определениях       

 курсоров),  INSERT,  UPDATE  и   DELETE;  в  теле  триггера   не       

 допускаются предложения  DDL. Нельзя также управлять транзакциями        

 в контексте триггера.  Поэтому внутри контекста тела триггера не       

 допускаются следующие  предложения: ROLLBACK, COMMIT и SAVEPOINT.        

 Замечание:  Процедура,  вызываемая  из  триггера, также не может       

 выполнять    перечисленных    выше    предложений     управления       

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

 тела триггера.        

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

 объектам.  Однако будьте особенно внимательны, вызывая удаленные        

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

 триггера  будет  обнаружено  несовпадение  отметок  времени,  то     

   удаленная   процедура   не   выполняется,   а   триггер   станет       

 недействительным.        

 ТИПЫ  ДАННЫХ  LONG  И  LONG  RAW  В ТРИГГЕРЕ.  Следующие правила       

 объясняют особенности  использования типов данных LONG и  LONG RAW       

 внутри триггеров:            

*  Предложение SQL внутри триггера может вставлять данные  в              

 столбец типа данных LONG или LONG RAW.            

*  Если  данные  из  столбца  LONG  или  LONG RAW могут быть              

 преобразованы в ограниченный   тип данных (такой  как CHAR              

 или  VARCHAR2),  то  к  такому  столбцу LONG или LONG RAW              

 можно  обращаться  в  предложении  SQL  внутри  триггера.              

 Заметьте, что  максимальная длина  для этих  типов данных       

        равна 32K.            

*  Нельзя объявлять переменные с типом данных LONG или  LONG              

RAW.            

*  Нельзя  использовать   квалификаторы  :NEW   и  :OLD   со              

 столбцами LONG и LONG RAW.         

 ТАБЛИЦЫ С  ЖУРНАЛАМИ СНИМКОВ.   Создание журнала  снимков неявно       

 создает триггер  AFTER ROW  по главной  таблице.  Поэтому нельзя       

 создать пользовательский  триггер  AFTER ROW по  главной таблице,       

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

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

 снимков;  необходимо  сначала  удалить  этот  триггер.  Снимки и       

 журналы снимков обсуждаются  в главе 12.        

 ССЫЛКИ НА  ПАКЕТИРОВАННЫЕ ПЕРЕМЕННЫЕ.   Если предложение  UPDATE       

 или  DELETE  обнаруживает  конфликт  с  конкурирующей  операцией       

UPDATE, то ORACLE выполняет прозрачный  откат к точке  сохранения       

 и  повторно   запускает  обновление.    Это  может   повториться       

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

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

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

 не  отменяет  изменений   в  любых  пакетированных   переменных,       

 адресуемых  в  этом  триггере.   Соответствующий  пакет   должен       

 включать переменную-счетчик,  чтобы распознавать такую ситуацию.         

 ПОРЯДОК   ВЫЧИСЛЕНИЯ   СТРОК.    Реляционная   база   данных  не       

 гарантирует   определенности   порядка   строк,   обрабатываемых       

 предложением  SQL.  Поэтому  не  создавайте  триггеров,  которые       

 зависят от  того, в  каком порядке  будут обрабатываться строки.        

 Например,  не  назначайте  значения  глобальной   пакетированной       

 переменной в триггере  строк,  если это текущее значение  зависит        

 от  того,  какая  строка  сейчас обрабатывается триггером строк.       

 Кроме   того,   если    в   триггере   обновляются    глобальные       

 пакетированные  переменные,  лучше  всего инициализировать такие       

 переменные в триггере  предложения BEFORE.        

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

 триггера,  этот  эффект  называется  КАСКАДОМ ТРИГГЕРОВ.  ORACLE       

 позволяет  иметь  одновременно   до  32  каскадно   возбужденных       

 триггеров.  Однако вы  можете по существу  ограничить количество       

 каскадных     триггеров     через     параметр     инициализации       

MAX_OPEN_CURSORS;   для   каждого   исполнения   триггера должен       

 открываться курсор.        

 МУТИРУЮЩИЕ И ОГРАНИЧИВАЮЩИЕ  ТАБЛИЦЫ.  Мутирующая таблица  - это таблица,  модифицируемая  в  данный  момент предложением UPDATE,       

DELETE  или  INSERT,  или  таблица,  которая  может  потребовать       

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

 ограничения целостности  DELETE CASCADE.  Ограничивающая  таблица       

-  это  таблица,  которую  предложение, возбуждающее триггер или    

    ограничение, должно читать, -  либо явно (для предложения  SQL),       

 либо   неявно   (для   декларативного   ограничения    ссылочной       

 целостности).   Мутирующая  или  ограничивающая таблица является       

 таковой  лишь  для  той  сессии,  которая  выдает   предложение,       

 возбуждающее триггер  или ограничение.        

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

 мутирующая или  как ограничивающая;  однако для  триггеров строк       

 имеют  место  два  важных  ограничения,  касающихся мутирующих и       

 ограничивающих таблиц:             

*  Предложения  в  триггере   строк  не  могут   читать  или              

 модифицировать мутирующую  таблицу предложения  триггера.              

 Это ограничение не  позволяет триггеру строк иметь  дело  с              

 несогласованным множеством  данных.            

*  Предложения в триггере  строк не могут  изменять столбцов              

 первичного, внешнего  или уникального ключа ограничивающей               

 таблицы предложения  триггера.  Это ограничение введено  с              

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

 от порядка обработки  строк или от индекса.               

 Для  этого  правила  существует  одно исключение: триггер              

BEFORE ROW, возбужденный предложением INSERT, вставляющим              

 одиночную  строку  в  таблицу  с  внешним  ключом,  может              

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

 модификация не нарушает  никаких ограничений целостности.         

 Рис.8-1 иллюстрирует ограничение  для мутирующих таблиц. 

Рис.8-1

Мутирующие таблицы 

 

 

           Исходная     Предложение SQL,        Мутирующая          

 таблица EMP   возбуждающее триггер    таблица EMP

        --------------¬                       --------------¬       

 ¦ ENAME  SAL  ¦ UPDATE emp            ¦ ENAME  SAL  ¦       

 ¦ -----  ---  ¦ SET sal = sal * 1.1;  ¦ -----  ---  ¦       

 ¦ SMITH  1000 ¦                       ¦-SMITH--1100-¦-----¬   

      ¦ JONES  1000 ¦ -------------------- ¦ JONES  1000 ¦     ¦       

 ¦ WARD   1000 ¦                       ¦ WARD   1000 ¦     ¦       

L--------------                       L--------------     ¦                                               

 -                 ¦                                               

 ¦                 ¦        

 Не допускается, --------------------- X                 ¦        

 так как таблица  EMP                    L------------------        

 мутирует                         Возбуждаемый триггер AFTER ROW                                         

 содержит предложение:                                          

 SELECT sal FROM emp WHERE ...        

 Пример,  показанный  на  рис.8-1,  работает  следующим  образом.       

 Предложение SQL  исполняется для  первой строки  таблицы.  Затем       

 возбуждается  триггер  AFTER  ROW.  В  свою очередь, предложение       

 внутри тела триггера AFTER ROW пытается опросить  первоначальную        

 таблицу.   Однако,  поскольку  таблица  EMP  мутирует, ORACLE не       

 позволяет  этот  запрос.    Поэтому  возникает  ошибка   времени       

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

 триггер,  откатываются,  и  управление возвращается пользователю        

 или приложению.        

 Если  вам  необходимо  обновить  мутирующую  или  ограничивающую       

 таблицу,  вам  следует  использовать  временную таблицу, таблицу       

PL/SQL   или   пакетированную   переменную,   чтобы   обойти эти       

 ограничения.        

 Декларативные  ограничения  целостности  проверяются в различные       

 моменты времени  по отношению  к триггерам  строк; обратитесь  к       

 документу ORACLE7 Server Concepts  Manual за информацией о  том,       

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

Привилегии, требуемые для  создания триггеров        

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

 привилегию CREATE TRIGGER, а  также одно из:            

*  владеть   таблицей,   специфицированной   в   предложении              

 триггера, или            

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

 предложении триггера, или            

*  иметь системную привилегию ALTER ANY TABLE        

 Чтобы создать  триггер в  схеме другого  пользователя, вы должны        

 иметь системную привилегию  CREATE ANY TRIGGER.   Эта привилегия       

 позволять создать  триггер  в любой схеме  и ассоциировать его  с       

 таблицей любого пользователя.  

Привилегии для объектов схем, адресуемых в теле триггера        

 Как  и  для  хранимых  процедур,  владелец триггера должен иметь       

 объектные привилегии  для  объектов, адресуемых в  теде триггера,        

 причем эти  привилегии должны  быть получены  им явно  (не через        

 роли).  Предложения в теле триггера оперируют под доменом защиты        

 владельца  триггера,  а  не  того  пользователя,  который выдает       

 предложение, возбуждающее  триггер. 

Отладка триггеров        

 Триггеры  можно  отлаживать  с  помощью  тех же средств, которые       

 применяются для отладки  процедур и пакетов; см. секцию  "Отладка       

 процедур и пакетов"  на странице 7-15. 

Изменение триггеров        

 Нельзя  явно  изменить  триггер;  его  необходимо заменить новым       

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

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

 соответствующий текстовый  файл и  выполнить предложение  CREATE       

TRIGGER, чтобы определить  новую версию кода. 

 

 

        Заменяя триггер, вы должны  включить в предложение CREATE TRIGGER        

 опцию  OR   REPLACE.   Опция   OR  REPLACE   позволяет  заменить       

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