Гость
Map
Форумы / Informix [игнор отключен] [закрыт для гостей] / триггер для обновления данных / 10 сообщений из 10, страница 1 из 1
27.06.2005, 14:46
    #33136434
genix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
Подскажите пожалуйста:

1) возможно ли написать триггер, который обновляет некоторые поля до их внесения в базу или делает это только для тех строк, которые были обновлены/добавлены?
Т.е. например пользователь инсертит или апдейтит строку в таблице, и в этот момент нужно подменять некоторые поля, вне зависимости от того что он ввел.
2) Если ответ на первый пункт положительный, то подтолкните в нужном направлении пожалуйста. Может у кого уже есть примеры использования?

P.$.: я начал было делать, но что-то не выходит каменный цветок:

create trigger trg_upd_subj update on persons
after
(update persons set persons.first_name_upper
= (UPPER(first_name )) ,persons.middle_name_upper
= (UPPER(middle_name )) ,persons.last_name_upper
= (UPPER(last_name )) ,persons.birth_year = NVL(YEAR (birth_date ) ,0 ));

однако при попытке обновить любую запись в таблице, для которой создан триггер, получаю:
747: Table or column matches object referenced in triggering statement.
...
Рейтинг: 0 / 0
27.06.2005, 14:55
    #33136467
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
Переименовать таблицу, создать для таблицы вью со старым именем, и на это вью навесить instead of триггер.


-----------------------------------------------------------
Решительный шаг вперед -- результат хорошего пинка сзади
...
Рейтинг: 0 / 0
27.06.2005, 15:51
    #33136626
Leonid Belov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
Если правим записи, триггер должен быть FOR EACH ROW, а не AFTER
...
Рейтинг: 0 / 0
27.06.2005, 16:13
    #33136700
Leonid Belov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
Работающий пример:

create table t1 (
id integer,
n char(20)
);

CREATE TRIGGER ins_t1
INSERT ON t1
REFERENCING NEW AS new
FOR EACH ROW (
execute function upper(new.n) into t1.n
);

CREATE TRIGGER upd_t1
UPDATE OF n ON t1
REFERENCING NEW AS new
FOR EACH ROW (
execute function upper(new.n) into t1.n)
;

Если подходящей функции или процедуры нет - никто не мешает сделать
...
Рейтинг: 0 / 0
27.06.2005, 16:46
    #33136784
genix
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
преогромнейшое спасибо всем и особенно за работающий пример!!!
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.11.2012, 20:49
    #38047742
ga
ga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
А можно как нибудь это ограничение (747: Table or column matches object referenced in triggering statement.) обойти? При апдейте одной записи надо в той же таблице, тоже поле для другой записи менять.
...
Рейтинг: 0 / 0
21.11.2012, 23:16
    #38047902
Leonid Belov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
gaА можно как нибудь это ограничение (747: Table or column matches object referenced in triggering statement.) обойти? При апдейте одной записи надо в той же таблице, тоже поле для другой записи менять.

Если поле то же самое - точно получите рекурсию. Так что нельзя - и это правильно...
...
Рейтинг: 0 / 0
21.11.2012, 23:27
    #38047915
Leonid Belov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
ga,

Если хотите делать связанные изменения одного и того же поля в разных записях таблицы - триггеры не помогут по причине
возникающей при этом рекурсии. Придется просто написать хранимую процедуру, которая делает то, что нужно.
Далее - запретить прямой UPDATE поля на уровне прав доступа и после этого дать право вызова вашей процедуры тому,
кому следует.
...
Рейтинг: 0 / 0
23.11.2012, 15:43
    #38050767
ga
ga
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
Leonid Belov, так а как запись менять? Процедуру вызывать вместо запроса? Это не всегда ведь возможно. Есть какие нибудь ещё альтернативы?
...
Рейтинг: 0 / 0
23.11.2012, 19:23
    #38051211
Daugava
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
триггер для обновления данных
Заведите себе еще одну таблицу и меняйте записи в своей таблицы с помощью процедуры, которая вызывается из триггера новой таблицы. Либо если таблица слишком жирно, то добавьте в свою таблицу поле и триггер на него.
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / триггер для обновления данных / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]