-
Notifications
You must be signed in to change notification settings - Fork 46
MD&SUBD Questions
Индексы – это объекты базы данных, созданные для ускорения поиска данных в определенной таблице.
CREATE [UNIQUE] INDEX имя_индекса ON имя_таблицыТриггер базы данных – это оформленный специальным образом именованный блок 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 имя_триггера;