|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
Подскажите пожалуйста: 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. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2005, 14:46 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
Переименовать таблицу, создать для таблицы вью со старым именем, и на это вью навесить instead of триггер. ----------------------------------------------------------- Решительный шаг вперед -- результат хорошего пинка сзади ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2005, 14:55 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
Если правим записи, триггер должен быть FOR EACH ROW, а не AFTER ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2005, 15:51 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
Работающий пример: 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) ; Если подходящей функции или процедуры нет - никто не мешает сделать ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2005, 16:13 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
преогромнейшое спасибо всем и особенно за работающий пример!!! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.06.2005, 16:46 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
А можно как нибудь это ограничение (747: Table or column matches object referenced in triggering statement.) обойти? При апдейте одной записи надо в той же таблице, тоже поле для другой записи менять. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2012, 20:49 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
gaА можно как нибудь это ограничение (747: Table or column matches object referenced in triggering statement.) обойти? При апдейте одной записи надо в той же таблице, тоже поле для другой записи менять. Если поле то же самое - точно получите рекурсию. Так что нельзя - и это правильно... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2012, 23:16 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
ga, Если хотите делать связанные изменения одного и того же поля в разных записях таблицы - триггеры не помогут по причине возникающей при этом рекурсии. Придется просто написать хранимую процедуру, которая делает то, что нужно. Далее - запретить прямой UPDATE поля на уровне прав доступа и после этого дать право вызова вашей процедуры тому, кому следует. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2012, 23:27 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
Leonid Belov, так а как запись менять? Процедуру вызывать вместо запроса? Это не всегда ведь возможно. Есть какие нибудь ещё альтернативы? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 15:43 |
|
триггер для обновления данных
|
|||
---|---|---|---|
#18+
Заведите себе еще одну таблицу и меняйте записи в своей таблицы с помощью процедуры, которая вызывается из триггера новой таблицы. Либо если таблица слишком жирно, то добавьте в свою таблицу поле и триггер на него. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.11.2012, 19:23 |
|
|
start [/forum/topic.php?fid=44&msg=38047915&tid=1607105]: |
0ms |
get settings: |
25ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
249ms |
get tp. blocked users: |
1ms |
others: | 291ms |
total: | 642ms |
0 / 0 |