Задавайте вопросы, мы ответим
Вы не зашли.
Сталкнулся с проблеммой НЕ вызова Тригерра из процедуры.
Мне нужно, что-бы вставки происходящие внутри процедуры не вызывали тригер на вставку.
Вообщем нужен механизм "отключить" временно тригер. Как такое можно реализовать?
Неактивен
Средствами MySQL нельзя никак - триггер безусловно выполняется при каждой вставке в таблицу, если только при вставке не произошла ошибка (поэтому есть грязный хак, который заключается в том, чтобы намеренно вызывать ошибку при вставке, однако, это плохая практика).
Корректное решение состоит в том, чтобы вместо триггера вставлять через процедуру. Или же в процедуре в нужном случае как-то специально исправлять действие триггера.
Неактивен
LazY написал:
...Корректное решение состоит в том, чтобы вместо триггера вставлять через процедуру....
Да нет Тригер тут какраз всегда должен выполнятся по-логике приложения. И делает он ето замечательно.
Просто есть Процедура, которая востанавливает BACKUP таблицы, словом:
TRUNCATE TABLE
+
INSERT INTO
и вот она не должна вызывать действий тригера
С truncate как раз все ок, он под Тригер не попадает, а вот как быть с INSERT?
LazY написал:
Или же в процедуре в нужном случае как-то специально исправлять действие триггера.
Вот-Вот
Хорелось бы что-то типа
Отредактированно vaspet (11.08.2009 18:24:58)
Неактивен
А чем Вам не нравится ровно тот способ, который Вы написали (через @no_trigger)?
Неактивен
Было бы удобно использовать для этого переменную, не нашел правда подходящей документации по поводу переменных в mysql.
Только синтаксис: SET [GLOBAL | SESSION] sql_variable=expression;
Но если я использую: SET a1='test';
получаю ошибку типа "системной переменной нет"
т.е. ето толко для каких-то внутренних (mysql) переменных.
методом "научного тыка" понял, что можно использовать: SET @a1='test';
тогда работает. Но что ето за переменная? локальная?
будет ли видна она в тригере так:
Отредактированно vaspet (11.08.2009 23:41:17)
Неактивен
@var_name это пользовательская переменная, действует в течении сессии.
Т.е. когда для вас @no_trigger=1 для других пользователей эта переменная не определена, т.е. null
Подробнее о пользовательских переменных см.
http://sqlinfo.ru/forum/viewtopic.php?id=363
Неактивен
Если @no_trigger=1 ето пользовательская переменная и действует в течении сессии и для других пользователей эта переменная не определена, то
тригер который будет вызван в процедуре её не увидит (он выполняется в своей сессии (от другово пользователя)?), так?
Отредактированно vaspet (12.08.2009 11:56:28)
Неактивен
етот метод работает.
Спасибо всем за помощь.
Неактивен