[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отмена insert/update через триггер
alexbel2404
Т.к. интегригую 2 системы с одной БД, понадобилось сделать триггер с отменой вставки по условию
CREATE DEFINER=`root`@`localhost` TRIGGER `insertBefore_vpnmsuserset` BEFORE INSERT ON `vpnmsuserset`
FOR EACH ROW BEGIN
DECLARE users_count INT;
SELECT count(*) INTO users_count FROM vpnmsuserset WHERE username = NEW.username;
IF (users_count > 0) THEN
call not_exist_proc;
END IF;
END;

Этот код в принципе делает то, что мне нужно, но генерирует ошибку, из-за которой вылетает exception. Знает кто-нибудь способ, как отменить вставку без генерации ошибки? Версия MySQL 5.5

P.S. Пытался перед вставкой, удалить имеющиеся данные через тот же триггер, но не получается - вываливается ошибка, что сам себя вызвать не могу. Хотя эвенты разные :(
sergeiss
В PostgreSQL для таких целей используется следующий механизм. Триггер вставки/апдейта/делита должен *обязательно* вернуть величину. Это либо изменяемая/удалемая строка (NEW или OLD), если мы разрешаем запрошенное действие, либо NULL, если мы запрещаем его.
Естественно, что если мы разрешаем вставку/апдейт, то мы можем изменить данные перед выполнением действия.

Не знаю точно, как в MySQL сделано, но что-то подобное должно быть.

PS. Попробуй перед выходом из триггера прописать в NEW величину NULL... Правда я не уверен, что поможет. Но попробовать можно smile.gif

PPS. Может быть поможет http://webcrunch.ru/library/development/my...-triggers-info/

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
alexbel2404
Да пробовал SET NEW = NULL, нельзя так делать похоже, ошибку выкидывает.
sergeiss
А если не мудрить с триггерами и просто использовать ON DUPLICATE KEY UPDATE?

(ворчливо так) ...и чего люди не используют Постгре? Там безо всяких "танцев с бубном" решаются многие вопросы, которые являются проблемами в Мускуле...

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
alexbel2404
Цитата (sergeiss @ 25.10.2012 - 14:37)
А если не мудрить с триггерами и просто использовать ON DUPLICATE KEY UPDATE?

(ворчливо так) ...и чего люди не используют Постгре? Там безо всяких "танцев с бубном" решаются многие вопросы, которые являются проблемами в Мускуле...

Если бы все так легко было - в исходники системы лезть не вариант)
alexbel2404
Может быть будут мысли у кого. Расскажу что я делаю.
Допустим имеем 1 бд с 2мя таблицами. К этой БД подключен биллинг и систему управления доступом (СУД). Биллинг работает только с одной таблицей, поэтому, когда он добавляет пользователя в 1 таблицу, чтобы работала СУД, нужно занести данные и во вторую таблицу, что я делаю триггером. Но если же добавлять через СУД, то данные программно добавляются в обе таблицы, но тут же срабатывает триггер, который сделан для биллинга, и получается дублирование данных.
А теперь то, почему я не хочу лезть в исходники. Биллинг куплен, закодирован и часто обновляется. СУД написан на питоне, использует django, который для меня полный мрак) Поэтому пока ищу решение с отменой вставки по условию)
sergeiss
Тогда вот что не понятно.

1. А зачем 2 одинаковые таблицы (с одинаковыми данными) в одной БД?
2. Если это все-таки необходимо, то почему СУД не пишет в ту же таблицу, что и биллинг?

П.1 мне не понятен категорически.

PS. Да, и еще. Данные вводятся по одной строке или целыми блоками?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
alexbel2404
1. Они не одинаковые, биллинг пишет в одну таблицу, СУД пишет в обе. 1 таблица грубо говорят юзеры, вторая их статусы (активнен/заблокирован). Вот для 1ой таблицы стоит триггер, он срабатывает на insert, и заносит данные во 2ую таблицу. Но так как СУД пишет в обе таблицы, еще и срабатывает триггер с первой таблицы, из-за этого получается дубль данных во второй.
2. Ответ выше)
sergeiss
Так я не понял - почему бы для "второй" таблицы не использовать ON DUPLICATE KEY UPDATE?

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
alexbel2404
Пошел по другому пути, закомментировал в СУД строку, отвечающую за вставку статуса во 2ую таблицу)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.