Могу ли я запустить триггер на операторе выбора в MySQL? - PullRequest
20 голосов
/ 26 мая 2011

Я пытаюсь запускать оператор INSERT для таблицы X каждый раз, когда я SELECT записываю любую запись из таблицы Y, есть ли в любом случае, что я могу сделать это, используя только MySQL?

Что-то вроде триггеров?

Ответы [ 3 ]

24 голосов
/ 26 мая 2011

Короткий ответ - Нет. Триггеры запускаются с INSERT, UPDATE или DELETE.

Возможное решение для этого (странного) сенарио:

  • Сначала,напишите некоторые хранимые процедуры, которые выполняют SELECT, которые вы хотите для таблицы X.
  • Затем ограничьте всех пользователей в использовании только этих хранимых процедур и не разрешайте им использовать SELECT в таблице X.
  • Затем измените хранимые процедуры, чтобы они также вызывали хранимую процедуру, которая выполняет желаемое действие (INSERT или любое другое).
4 голосов
/ 26 мая 2011

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

0 голосов
/ 19 июля 2018

Если вы пытаетесь использовать таблицу X для записи порядка SELECT запросов в таблице Y (довольно распространенная настройка ведения журнала запросов), вы можете просто изменить порядок операций и выполнить запрос INSERT сначала , , затем выполните запрос SELECT.

Таким образом, вам не нужно беспокоиться о связывании двух операторов с TRIGGER: если ваш сервер дает сбой между двумя операторами, то вы уже записали то, что вас волнует, с вашим первым оператором, иSELECT запрос выполняется или не выполняется, не влияет на базовую базу данных.

Если вы не регистрируете запросы, возможно, вы пытаетесь использовать таблицу Y в качестве очереди задач - ситуация, с которой я столкнулсяэто привело меня к этой теме - и вы хотите, чтобы любой сеансовый запрос Y сначала блокировал все остальные сеансы из возвращенных строк, чтобы вы могли выполнить некоторые операции с результатами и вставить вывод в таблицу X. В этом случае просто добавьтенекоторые возможности ведения журнала в таблице Y.

Например, вы можете добавить столбец «владелец» в Y, а затем прикрепить часть WHERE вашего запроса SELECT к оператору UPDATE, запустить его,а затем измените ваш запрос SELECT, чтобы он отображал только те результаты, которые были запрошены вашим UPDATE:

UPDATE Y SET owner = 'me' WHERE task = 'new' AND owner IS NULL;
SELECT foo FROM Y WHERE task = 'new' AND owner = 'me';

... поработайте над foo, затем...

INSERT INTO X (output) VALUES ('awesomeness');

Опять же, ключ для регистрации сначала , а затем запрос.

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