#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, которое делает его полностью непригодным для использования, и никто там не хочет это исправлять.