SQL триггер для удаления строк из базы данных - PullRequest
4 голосов
/ 12 января 2011

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

Я не хочу нескольких записей для каждой тревоги, поэтому я настроил два триггера базы данных. Первый триггер отражает каждую новую запись во вторую таблицу, создавая / обновляя строки по мере необходимости. Вторая таблица ('alarm_display') имеет столбец 'Tag', установленный в качестве первичного ключа. Таблица «Тревога» не имеет первичного ключа. Код для этого триггера:

CREATE TRIGGER `mirror_alarms` BEFORE INSERT ON `alarms`
  FOR EACH ROW 
    INSERT INTO `alarm_display` (Tag,...,OffTime) 
    VALUES (new.Tag,...,new.OffTime) 
    ON DUPLICATE KEY UPDATE OnDate=new.OnDate,...,OffTime=new.OffTime

Второй триггер должен выполняться после первого и (в идеале) удалить все строки из таблицы аварийных сигналов. (Я использовал свойство Tag тревоги, потому что свойство Tag никогда не изменяется, хотя я подозреваю, что мог бы просто использовать оператор «DELETE FROM alarms WHERE 1» для того же эффекта).

CREATE TRIGGER `remove_alarms` AFTER INSERT ON `alarms`
  FOR EACH ROW DELETE FROM alarms WHERE Tag=new.Tag

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

Итак, вот вопрос: почему мой второй триггер не выполняет то, что я от него ожидаю?

1 Ответ

5 голосов
/ 13 января 2011

Объяснение можно прочитать здесь: http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

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

Это ваша проблема, и ваш триггер заканчивается ошибкой # 1442.

Таблица alarms уже используется оператором, который вызвал ваш триггер (вставка). По сути это означает, что вы не можете изменить alarms с помощью триггера удаления.

Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...