Учебники

SQLite — Триггеры

Триггеры SQLite — это функции обратного вызова базы данных, которые автоматически выполняются / запускаются, когда происходит указанное событие базы данных. Ниже приведены важные моменты, касающиеся триггеров SQLite.

  • Триггер SQLite может быть задан для запуска всякий раз, когда происходит УДАЛЕНИЕ, ВСТАВКА или ОБНОВЛЕНИЕ определенной таблицы базы данных или когда ОБНОВЛЕНИЕ происходит в одном или нескольких указанных столбцах таблицы.

  • В настоящее время SQLite поддерживает только триггеры FOR EACH ROW, но не триггеры FOR EACH STATEMENT. Следовательно, явно указывать FOR EACH ROW необязательно.

  • Предложение WHEN и действия триггера могут обращаться к элементам вставляемой, удаляемой или обновляемой строки, используя ссылки в форме NEW.column-name и OLD.column-name , где column-name — это имя столбца из таблица, с которой связан триггер.

  • Если указано предложение WHEN, указанные операторы SQL выполняются только для тех строк, для которых предложение WHEN является истинным. Если предложение WHEN не указано, операторы SQL выполняются для всех строк.

  • Ключевое слово BEFORE или AFTER определяет, когда действия триггера будут выполнены относительно вставки, изменения или удаления связанной строки.

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

  • Изменяемая таблица должна существовать в той же базе данных, что и таблица или представление, к которому присоединен триггер, и необходимо использовать только имя таблицы, а не database.tablename .

  • Специальная функция SQL RAISE () может использоваться в программе-триггере для вызова исключения.

Триггер SQLite может быть задан для запуска всякий раз, когда происходит УДАЛЕНИЕ, ВСТАВКА или ОБНОВЛЕНИЕ определенной таблицы базы данных или когда ОБНОВЛЕНИЕ происходит в одном или нескольких указанных столбцах таблицы.

В настоящее время SQLite поддерживает только триггеры FOR EACH ROW, но не триггеры FOR EACH STATEMENT. Следовательно, явно указывать FOR EACH ROW необязательно.

Предложение WHEN и действия триггера могут обращаться к элементам вставляемой, удаляемой или обновляемой строки, используя ссылки в форме NEW.column-name и OLD.column-name , где column-name — это имя столбца из таблица, с которой связан триггер.

Если указано предложение WHEN, указанные операторы SQL выполняются только для тех строк, для которых предложение WHEN является истинным. Если предложение WHEN не указано, операторы SQL выполняются для всех строк.

Ключевое слово BEFORE или AFTER определяет, когда действия триггера будут выполнены относительно вставки, изменения или удаления связанной строки.

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

Изменяемая таблица должна существовать в той же базе данных, что и таблица или представление, к которому присоединен триггер, и необходимо использовать только имя таблицы, а не database.tablename .

Специальная функция SQL RAISE () может использоваться в программе-триггере для вызова исключения.

Синтаксис

Ниже приведен основной синтаксис создания триггера .

CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;

Здесь, event_name может быть операцией INSERT, DELETE и UPDATE над упомянутой таблицей table_name . При желании вы можете указать FOR EACH ROW после имени таблицы.

Ниже приведен синтаксис создания триггера для операции UPDATE в одном или нескольких указанных столбцах таблицы.

CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- Trigger logic goes here....
END;

пример

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

sqlite> CREATE TABLE COMPANY(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           TEXT    NOT NULL,
   AGE            INT     NOT NULL,
   ADDRESS        CHAR(50),
   SALARY         REAL
);

Чтобы продолжить аудит, мы создадим новую таблицу с именем AUDIT, куда будут вставляться сообщения журнала всякий раз, когда в таблице COMPANY есть запись для новой записи.

sqlite> CREATE TABLE AUDIT(
   EMP_ID INT NOT NULL,
   ENTRY_DATE TEXT NOT NULL
);

Здесь ID — это идентификатор записи AUDIT, а EMP_ID — это идентификатор, который будет получен из таблицы COMPANY, а DATE сохранит временную метку, когда запись будет создана в таблице COMPANY. Теперь давайте создадим триггер для таблицы COMPANY следующим образом:

sqlite> CREATE TRIGGER audit_log AFTER INSERT 
ON COMPANY
BEGIN
   INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
END;

Теперь мы приступим к фактической работе. Давайте начнем вставлять запись в таблицу COMPANY, что должно привести к созданию записи журнала аудита в таблице AUDIT. Создайте одну запись в таблице COMPANY следующим образом:

sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Paul', 32, 'California', 20000.00 );

Это создаст одну запись в таблице COMPANY, которая выглядит следующим образом:

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0

Одновременно в таблице AUDIT будет создана одна запись. Эта запись является результатом триггера, который мы создали для операции INSERT в таблице COMPANY. Точно так же вы можете создавать свои триггеры для операций UPDATE и DELETE в соответствии с вашими требованиями.

EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00

Триггеры листинга

Вы можете перечислить все триггеры из таблицы sqlite_master следующим образом:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';

Приведенный выше оператор SQLite перечислит только одну запись следующим образом:

name
----------
audit_log

Если вы хотите перечислить триггеры в определенной таблице, используйте предложение AND с именем таблицы следующим образом:

sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';

Приведенный выше оператор SQLite также перечислит только одну запись следующим образом:

name
----------
audit_log

Триггеры сброса

Ниже приведена команда DROP, с помощью которой можно удалить существующий триггер.