[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с триггером
Страницы: 1, 2
Okulo
всем привет.
есть таблица company с полями update_time и end_register (ну и разных других)
создал триггер

CREATE TRIGGER `history_tr` AFTER UPDATE ON `company`
FOR EACH ROW BEGIN

INSERT INTO `company_history` SET company_id = OLD.id, reg_date = OLD.end_register, upd_date = OLD.update_time, action = 1, date = CURRENT_TIMESTAMP()

который сохраняет историю действий

проблема в том, что когда обновляется поле например update_time поле end_register остается не измененным но все равно записывается (понято)

вопрос: как создать в данном случае условие плана ЕСЛИ обновляется update_time ТО action = 1
а ЕСЛИ обновляется end_register ТО action = 2

(ну или как то различать эти два события)
Oyeme
 BEGIN
IF NEW.update_time <> OLD.update_time
THEN
SET NEW.action= 1;
ELSEIF NEW.end_register <> OLD.end_register
THEN
SET NEW.action= 2;
END IF;
END


Используем теперь new.action,вместо old.action
Okulo
спасибо.
не могу только с синтаксисом разобраться :(
как правильно писать в запрос IF THEN в эту строку?



INSERT INTO `company_history` SET company_id = OLD.id, reg_date = OLD.end_register, upd_date = OLD.update_time, action = 1, date = CURRENT_TIMESTAMP()
Oyeme
В логическом блоке BEGIN.. END.

Цитата
By using the BEGIN ... END construct, you can define a trigger that executes multiple statements
killer8080
Oyeme
у тебя там ошибка в elseif
Oyeme
Цитата (killer8080 @ 30.01.2013 - 12:19)
Oyeme
у тебя там ошибка в elseif

Thanks.
Fixed.
SlavaFr
ОТ
Нахожу триггеры опассной штукой. База созданна для храненние данных, а не для того, чтоб вней дополнительно логику искали. Все что связанно с логикой, я хочу видеть в программном коде. Это сугубо мое персональное мнение.

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Okulo
Цитата (SlavaFr @ 30.01.2013 - 14:49)
ОТ
Нахожу триггеры опассной штукой. База созданна для храненние данных, а не для того, чтоб вней дополнительно логику искали. Все что связанно с логикой, я хочу видеть в программном коде. Это сугубо мое персональное мнение.

нуу...
вообще это не совсем программная логика, а просто сбор логов при определенных действиях в БД.

вы считаете это лучше делать программно?
(то есть записывать действия в отдельную таблицу ?)

sergeiss
Цитата (SlavaFr @ 30.01.2013 - 18:49)
Нахожу триггеры опассной штукой. База созданна для храненние данных, а не для того, чтоб вней дополнительно логику искали. Все что связанно с логикой, я хочу видеть в программном коде.

Если всё делается "с умом", то никаких проблем не будет.

Живой пример - вопрос из этой темы. Никаких проблем не создаст ведение лога изменений smile.gif

Другой пример. Например, ты грузишь данные большими блоками, через файлы. И одно-два поля надо подсчитать на основании других данных. Лучше это сделать в триггере и не париться более по этому поводу.

И таких примеров можно много привести. Зачем писать ПХП (или другой) код, если в БД всё делается легко и просто?

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

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

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

user posted image
SlavaFr
в начале лог с разницей в поле action, завтра запрос из основной програмы таблицы history, а там не долго ждать пока новый сотрудник начнет на прямую в таблицу history писать и удивлятся от куда там берутся новые строки.

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


edit: для администрации Бд против фнкций и тригеров не затрагивающих основную программу не чего неимею.


_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
sergeiss
SlavaFr - извини, но ты не прав smile.gif Чтобы никто ничего лишнего не писал, имеются права доступа (чтения/записи) к таблицам, триггерам и другим объектам. Раздай их правильно и не будет проблем. И твоя фобия сразу же уйдет "в никуда" smile.gif

Их, т.е. права доступа, для того и придумали, чтобы разделять полномочия (== уменьшать количество ненужной головной боли).

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

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

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

user posted image
philya
Цитата (sergeiss @ 30.01.2013 - 16:37)
Цитата (SlavaFr @ 30.01.2013 - 18:49)
Нахожу триггеры опассной штукой. База созданна для храненние данных, а не для того, чтоб вней дополнительно логику искали. Все что связанно с логикой, я хочу видеть в программном коде.

Если всё делается "с умом", то никаких проблем не будет.

Живой пример - вопрос из этой темы. Никаких проблем не создаст ведение лога изменений smile.gif

Другой пример. Например, ты грузишь данные большими блоками, через файлы. И одно-два поля надо подсчитать на основании других данных. Лучше это сделать в триггере и не париться более по этому поводу.

И таких примеров можно много привести. Зачем писать ПХП (или другой) код, если в БД всё делается легко и просто?

То есть, это будет трудно написать в пхп?
sergeiss
philya- вопрос не в том, что трудно это в пхп или не трудно. А в том, что каждый инсирумент нужно использовать максимально эффективно. Для того, для чего оно сделано.

Насчет тех же триггеров. Допустим, ты можешь давать команду вставки данных из разных скриптов. Да еще, плюс к этому у тебя несколько программеров пишут эти скрипты, каждый свой. А тебе надо при вставке каждой строки выполнить какое-то действие. Как это сделать? Объяснить каждому программеру необходимость этих телодвижений, потом проконтролировать? Или проще сделать триггер? На мой взгляд, вопрос риторический.
И, по-моему, триггеров боятся только те, кто не умеет работать с БД smile.gif Я таким бы посоветовал побороть ссвои фобии и получше изучит возможности БД.

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

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

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

user posted image
SlavaFr
Цитата (philya @ 30.01.2013 - 19:18)
То есть, это будет трудно написать в пхп?
будет немного больше кода, чем решение с триггером.

Цитата (sergeiss @ 31.01.2013 - 07:39)
А тебе надо при вставке каждой строки выполнить какое-то действие. Как это сделать?

Например посредством измененния метода в пхп который занимался update в `history_tr` и отбивание рук тем, кто этим методом не пользуется. В общем речь идет о том, что возникает дополнительный слой в котором содержится логика и эта логика не сразу видна. В общем, если есть люди которые этим слоем занимаются и если другие программисты обязаны пройти review у этих людей, то возможно все не так и страшно, хотя ситуация не сильно упрощается за счет дополнительных правил в ведении проэкта.


_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Valick
Цитата
И, по-моему, триггеров боятся только те, кто не умеет работать с БД

sergeiss, ну не совсем так smile.gif
и гораздо хуже когда свое неумение работать с БД прикрывают триггерами
Цитата
каждый инсирумент нужно использовать максимально эффективно
Быстрый ответ:

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