Skip to content

MD&SUBD Questions

Sᴛѧʀʟɪɴɢ edited this page Jan 2, 2019 · 4 revisions

Индексы – это объекты базы данных, созданные для ускорения поиска данных в определенной таблице.

CREATE [UNIQUE] INDEX имя_индекса ON имя_таблицы

19. Триггеры, виды триггеров

Триггер базы данных – это оформленный специальным образом именованный блок PL/SQL, который хранится в базе данных и запускается автоматически.
Каждый триггер связан с некоторым системным событием или с событием над объектами БД (таблицей/представлением).

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

  • DML-операторов (INSERT, UPDATE, DELETE) над таблицей;
  • DML-операторов (INSERT, UPDATE, DELETE) над представлением (INSTEAD OF триггер);
  • DDL-операторов (CREATE, ALTER, DROP и др.);
  • системных событий БД (например, подключение пользователя к БД).

Триггеры могут быть использованы:

  • для реализации сложных ограничений целостности данных, которые не могут быть осуществлены стандартным образом при создании таблицы;
  • предотвращения неверных транзакций;
  • выполнения процедур комплексной проверки прав доступа и секретности данных;
  • генерации некоторых выражений на основе значений, имеющихся в столбцах таблиц;
  • реализации сложных бизнес-правил для обработки данных (возможность отследить «эхо», т.е. возможность при изменении одной таблицы, обновлять данные связанных с ней таблиц).

Пример триггера, записывающего информацию об авторизированных пользователях:

CREATE TABLE USER_LOGS (ID VARCHAR2(30), LOGON_DATE DATE);

CREATE OR REPLACE TRIGGER LOGON_TRIGGER
AFTER LOGON ON DATABASE 
BEGIN 
  INSERT INTO USER_LOGS (ID, LOGON_DATE) VALUES (USER, SYSDATE); 
END;

DML-триггер – триггер, который автоматически запускается при выполнении активизирующего его DML-оператора (INSERT, UPDATE, DELETE).

Типы DML-триггеров по:

  • моменту запуска: BEFORE, AFTER или INSTEAD OF
  • характеру воздействия на строки таблицы: строковый, операторный
  • типу активизирующего DML-оператора: INSERT, DELETE, UPDATE

Схема создания DML-триггера:

CREATE  [OR  REPLACE]  TRIGGER  имя_триггера
{BEFORE  |  AFTER | INSTEAD OF }
{INSERT  |  DELETE  |  UPDATE  [OF  список_столбцов]}  
ON  имя_таблицы   [FOR  EACH  ROW]   [WHEN  условие]
< PL/SQL_блок >

При наличии OR REPLACE триггер создается заново, если он уже существует.
BEFORE означает, что триггер будет запускаться перед выполнением активизирующего DML-оператора.
AFTER означает, что триггер будет запускаться после выполнения активизирующего DML-оператора.
INSTEAD OF служит для замещения DML-оператора своим функционалом над представлением (view). INSERT | DELETE | UPDATE [OF список_столбцов] указывает тип активизирующего триггер DML-оператора.
Разрешается, используя логическую операцию OR, задать совокупность активизирующих операторов: INSERT OR DELETE.
Если при использовании UPDATE указан список столбцов, то триггер будет запускаться при модификации одного из указанных столбцов, иначе триггер будет запускаться при изменении любого из столбцов.
FOR EACH ROW присутствует - триггер является строковым, иначе - операторным.
Операторный триггер запускается один раз до или после выполнения активизирующего триггер DML-оператора независимо от того, сколько строк в связанной с триггером таблице подвергается модификации.
Строковый триггер запускается один раз для каждой из строк, которая подвергается модификации DML-оператором, активизирующим триггер.
С помощью WHEN можно задать дополнительное ограничение на строки связанной с триггером таблицы, при модификации которых может быть запущен триггер. Конструкция PL/SQL_блок представляет блок PL/SQL, который ORACLE запускает при активизации триггера.

Триггерные предикаты - логические функции, возвращающие TRUE, если тип активизирующего оператора совпадает с типом предиката, и FALSE – в противном случае. Они используются в том случае, если в триггере указана совокупность активизирующих DML-операторов с помощью OR, и для каждого из них нужно выполнить своё действие.

  • INSERTING
  • DELETING
  • UPDATING

Использование триггерных предикатов:

IF имя_предиката THEN ...

Псевдозаписи – это конструкции, которые используются в строковых триггерах. Они позволяют при выполнении DML-операторов над строкой таблицы, обращаться как к старым значениям, которые находились в таблице до модификации, так и к новым, которые появятся в строке после ее модификации.

Использование псевдозаписей:

IF (:OLD.NAME = :NEW.NAME) THEN ...

Предложение REFERENCING позволяет назначить псевдонимы псевдозаписям OLD и NEW:

REFERENCING OLD AS название_1 NEW AS название_2

В триггерах недопустимо использование операторов COMMIT, SAVEPOINT, ROLLBACK.

Триггеры INSTEAD OF часто используются при работе со сложными представлениями, над которыми недопустимо выполнение DML-операций (INSERT, UPDATE, DELETE).

DDL-триггеры запускаются автоматически при выполнении DDL-операторов CREATE, ALTER, DROP и др.

Классификация DDL-триггеров:

  • ON DATABASE: запускается при выполнении DDL-операторов над всеми схемами базы данных
  • ON SCHEMA: запускается при выполнении DDL-операторов над объектами схемы пользователя

Триггеры событий БД запускаются автоматически, когда происходит некоторое системное событие.
Например, при открытии (STARTUP)/закрытии (SHUTDOWN) базы данных, подключении/отключении пользователя (LOGON/LOGOFF) к базе данных.

Информацию о триггерах можно получить из следующих представлений словаря данных:

  • USER_OBJECTS,
  • USER_TRIGGERS,
  • USER_ERRORS.

Управление триггерами:

--временное отключение триггера
ALTER  TRIGGER  имя_триггера  DISABLE; 
--включение триггера
ALTER  TRIGGER  имя_триггера  ENABLE;
--включение/выключение всех триггеров для таблицы:
ALTER  TABLE  имя_таблицы  {DISABLE | ENABLE}  ALL  TRIGGERS;
--удаление триггера
DROP  TRIGGER  имя_триггера;

Clone this wiki locally