Могу ли я запустить триггер для оператора select в mysql?

#mysql #database #triggers

#mysql #База данных #триггеры

Вопрос:

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

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

Комментарии:

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

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

Ответ №1:

Короткий ответ — нет. Триггеры запускаются с помощью INSERT , UPDATE или DELETE .

Возможное решение для этого. довольно редкий сценарий:

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

Комментарии:

1. Я хотел бы поспорить с » странной » характеристикой. В частности, если мы получаем доступ к контролируемой информации ( например, этикетки для производства ), где мы хотим контролировать количество обращений к документу, хранящемуся в БД, или его распечатку, это именно та функция, которая мне нужна. Если управление информацией неверно ( странно ), я не хочу быть правым.

2. @DannyHolstein ладно, «странный» был не лучшим выбором. «rare» звучит лучше?

3. Я должен ввести запрос функции для этой возможности.

4. Я попытался реализовать решение с помощью функции VIEW и stored, но при попытке выполнить ВСТАВКУ в таблицу, которая отслеживает доступ, это не удается, потому что эта таблица уже открыта и заблокирована.

5. @DannyHolstein вы можете опубликовать новый вопрос с вашей реализацией и возникающей проблемой (и добавить ссылку на этот).

Ответ №2:

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

Ответ №3:

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

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

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

Например, вы могли бы добавить столбец «owner» в 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');
  

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

Комментарии:

1. Вроде бы, но я ограничен в использовании нескольких строк. Это глупый драйвер принтера, который будет просматривать только представления. Я действительно придумал обходной путь для удаления записей через запланированные промежутки времени, но я обнаружил больше ошибок в программном обеспечении Bradly printer, которое делает его полностью непригодным для использования, и никто там не хочет это исправлять.