2011-01-12 4 views
4

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

Мне не нужны несколько записей для каждого будильника, поэтому я настроил два триггера базы данных. Первый триггер отражает каждую новую запись во второй таблице, создавая/обновляя строки по мере необходимости. Вторая таблица («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 

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

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

ответ

5

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

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

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

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

Cheers!

+0

Awesome. Благодаря! Я надеялся сохранить все в SQL, но я думаю, что создам задание cron, чтобы периодически очищать базу данных :) – wpearse

Смежные вопросы