Триггеры в БД, которые будут выполнены после «набора» операторов вставки

У меня есть таблица, в которой хранятся события.

Однако, так как система была спроектирована, события обычно записываются партиями. Под этим я подразумеваю, что набор событий (около 10) обычно записывается вместе, а не просто как отдельные события.

Можно предположить, что: в таблице событий есть столбец с именем «batch_no», поэтому мы знаем, какие события принадлежат какому пакетному номеру.

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

Решения, о которых я думал, включают в себя что-то вроде: (а) определения триггера для каждой строки; (б) при условии, что рассчитывается количество (выберите * из событий, где NEW.batchNO = events.batchNO); задержка на некоторое время; снова вычислите то же количество, и если они равны, мы знаем, что пакет завершил загрузку, и вызываем триггер.

Хотя, очевидно, решение, представленное выше, звучит сложно? Есть ли более лучшее или простое решение? (Или, если нет, какая-нибудь помощь в том, как я мог реализовать то, что я описал?)

7 голосов | спросил Larry 7 WedEurope/Moscow2011-12-07T22:05:17+04:00Europe/Moscow12bEurope/MoscowWed, 07 Dec 2011 22:05:17 +0400 2011, 22:05:17

1 ответ


0

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

Вам нужен триггер, чтобы сработать в состоянии, которое не известно во время создания триггера. Я вижу в основном три возможности:

1) Триггер на уровне операторов

Использование предложения FOR EACH STATEMENT. Я цитирую руководство здесь :

  

триггер, помеченный ДЛЯ КАЖДОГО ЗАЯВЛЕНИЯ, выполняется только один раз для любого   данная операция, независимо от того, сколько строк она изменяет (в   В частности, операция, которая изменяет ноль строк, все равно приведет к   выполнение любых применимых триггеров FOR EACH STATEMENT).

Применяется только в том случае, если вы вставляете все свои пакеты одной командой INSERT (несколько строк), но не более одного пакета за раз.

2) Условие WHEN для триггера уровня строки.

Использование предложения FOR EACH STATEMENT плюс WHEN условие. Для этого вам нужна версия 9.0+.
Если вы можете узнать из одиночной вставленной строки , которая является последней в пакете, то определение триггера может выглядеть следующим образом:

CREATE TRIGGER insert_after_batch
AFTER INSERT ON tbl
FOR EACH ROW
WHEN (NEW.batch_last)
EXECUTE PROCEDURE trg_tbl_insert_after_batch();

Я предполагаю, что в вашей таблице есть столбец batch_last boolean, в котором вы помечаете последнюю строку пакета. Возможен любой другой метод.

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

3) Условный код внутри вашего триггера

Это в основном запасной вариант для версий до 9.0, где у вас еще нет условия WHEN. Сделайте ту же проверку внутри триггера перед выполнением полезной нагрузки. Дороже, чем при условии.

ответил Erwin Brandstetter 7 WedEurope/Moscow2011-12-07T23:25:25+04:00Europe/Moscow12bEurope/MoscowWed, 07 Dec 2011 23:25:25 +0400 2011, 23:25:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132