#mysql #triggers #mariadb
#mysql #триггеры #mariadb
Вопрос:
У меня есть таблица аудита, в которой хранится информация, относящаяся к промежуточной таблице, используемой для процесса ETL. У меня есть триггер в родительской таблице, который хранит действия о том, что было выполнено для определенной строки в таблице аудита.
CREATE TABLE `audit_table` (
`RowID` bigint(20) NOT NULL,
`apptid` bigint(20) NOT NULL,
`modified` bigint(20) NOT NULL,
`type` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL,
`data_push_id` bigint(20) NOT NULL,
PRIMARY KEY (`RowID`,`apptid`,`type`,`data_push_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
- RowID — PK из родительской таблицы; это значение PK в основной таблице
равноAUTO_INCREMENT
- apptid — PK в родительской таблице
- изменено — временная метка Unix, указывающая, когда строка была изменена в последний раз
- тип — действие, которое было выполнено; может быть ‘Вставить’ или ‘Удалить’
- data_push_id — относится к столбцу в родительской таблице, который содержит идентификатор пакета, когда данные были в последний раз загружены в родительскую таблицу. Таким образом, data_push_id 1 может ссылаться на определенный набор записей в родительской таблице, data_push_id 2 может ссылаться на другой набор записей и так далее.
Что я хочу сделать, так это:
- После вставки записи «удалить» в таблицу аудита…
- Если есть запись «insert» с тем же номером строки…
- Вставьте строку «удалить»…
- И сразу после этого удалите строки «вставить» и «удалить» для этого номера строки.
Это моя первая попытка, но она возвращает ошибку:
CREATE TRIGGER IF NOT EXISTS `test` AFTER Insert ON
`audit_table` FOR EACH ROW
IF (OLD.`rowid` = NEW.`rowid` AND NEW.`type` = 'Delete' AND OLD.`type` = 'Insert')
DELETE FROM `audit_table` duap_audit WHERE duap_audit.rowid = OLD.rowid
SQL Error [1363] [HY000]: (conn=18464) There is no OLD row in on INSERT trigger
Что я делаю не так?
Ответ №1:
Только ДО или ПОСЛЕ ОБНОВЛЕНИЯ ИЛИ DELTE ТРИГГЕР имеет старую строку
ТРИГГЕР ВСТАВКИ имеет только НОВУЮ строку, что понятно, у них нет старых значений для замены
В триггере ВСТАВКИ можно использовать только NEW.col_name; старой строки нет. В триггере УДАЛЕНИЯ можно использовать только OLD.col_name; новой строки нет. В триггере ОБНОВЛЕНИЯ вы можете использовать OLD.col_name для ссылки на столбцы строки до ее обновления и NEW.col_name для ссылки на столбцы строки после ее обновления.