powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Триггер на update
11 сообщений из 11, страница 1 из 1
Триггер на update
    #35536222
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Как оказалось, я абсолютный чайник в триггерах :-( Подскажите, кто знает, как мне решить задачу. Итак, есть некая таблица:
Код: plaintext
1.
2.
3.
4.
create table tab (
	id int primary key,
	field char,
	dt datetime year to second default current year to second
);
С какмими-то данными:
Код: plaintext
1.
2.
3.
4.
insert into tab ( id, field ) values (  1 , 'A' );
insert into tab ( id, field ) values (  2 , 'B' );
insert into tab ( id, field ) values (  3 , 'C' );
insert into tab ( id, field ) values (  4 , 'D' );
insert into tab ( id, field ) values (  5 , 'E' );
Как мне сделать так, чтобы при update строки в поле dt записывалось current? Я начал было...
Код: plaintext
1.
2.
3.
create trigger tab_up update on tab
for each row (
	-- а вот что здесь написать, никак не пойму
);
...
Рейтинг: 0 / 0
Триггер на update
    #35536309
Leonid Belov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
execute function функция() into new.dt

функция должна вернуть значение current
...
Рейтинг: 0 / 0
Триггер на update
    #35536471
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так?
Код: plaintext
1.
2.
3.
4.
5.
6.
create procedure get_current( ) returning datetime year to second;
	return current;
end procedure;
create trigger tab_up update on tab referencing new as new
for each row (
	execute procedure get_current( ) into new.dt
);
Не сложилось: SQL Error (-732) : Incorrect use of old or new values correlation name inside trigger.
...
Рейтинг: 0 / 0
Триггер на update
    #35536657
Ikir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо добавить
create ....
referensing NEW as n
.... into n.dt
...
Рейтинг: 0 / 0
Триггер на update
    #35536660
victor16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше
Код: plaintext
1.
2.
3.
CREATE TRIGGER tab_up
UPDATE ON tab
FOR EACH ROW (EXECUTE PROCEDURE get_current() INTO dt);
С уважением,
Виктор
...
Рейтинг: 0 / 0
Триггер на update
    #35541478
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Ikir: Вы бы сначала сами попробовали, прежде чем... То же самое - -731.

2 victor16: Такое мне тоже в голову пришло. Но меня испугал план:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
QUERY:
------
update tab set field = 'X' where id = 1
Estimated Cost: 1
Estimated # of Rows Returned: 1
  1) informix.tab: INDEX PATH
    (1) Index Keys: id   (Serial, fragments: ALL)
        Lower Index Filter: informix.tab.id = 1 
QUERY:
------

Estimated Cost: 1
Estimated # of Rows Returned: 5
  1) informix. tab :  SEQUENTIAL SCAN 
UDRs in query:
--------------
    UDR id  :	3500
    UDR name:	get_current

Неужели он действительно собирается всю таблицу последовательно читать? А если она многомиллионная? Или как это понимать? Комментарии ожидаются...
...
Рейтинг: 0 / 0
Триггер на update
    #35541615
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid VorontsovНеужели он действительно собирается всю таблицу последовательно читать? А если она многомиллионная? Или как это понимать? Комментарии ожидаются...
А сколько у вас СЕЙЧАС строк в таблице? А делали ли UPDATE STAT FOR TABLE tab? :)
...
Рейтинг: 0 / 0
Триггер на update
    #35542633
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 АнатоЛой: Не вижу ничего смешного - это ведь только пример. А строк в настоящей таблице - 5 миллионов. Да и статистика - тоже как учили: medium - на таблицу, high - на первые колонки индексов, low - на составные индексы...
...
Рейтинг: 0 / 0
Триггер на update
    #35542715
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Vorontsov2 АнатоЛой: Не вижу ничего смешного - это ведь только пример. А строк в настоящей таблице - 5 миллионов. Да и статистика - тоже как учили: medium - на таблицу, high - на первые колонки индексов, low - на составные индексы...

Может и я чего-то не понимаю... В Вашем пример со статистикой

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
QUERY:------update tab set field = 'X' where id = 1
Estimated Cost:  1 
Estimated # of Rows Returned:  1 
   1 ) informix.tab: INDEX PATH
    ( 1 ) Index Keys: id   (Serial, fragments: ALL)
        Lower Index Filter: informix.tab.id =  1 
 QUERY:------
Estimated Cost:  1 
Estimated # of Rows Returned:  5 
   1 ) informix.tab: SEQUENTIAL SCAN
UDRs in query:--------------
    UDR id  :	 3500 
    UDR name:	get_current

сколько записей в таблице tab ?
Если чуть-чуть - Informix спокойно может выбрать SEQ SCAN....
Если всё же сомневаетесь - ну запустите на тестовой таблице/сервере - но уже с большим количеством строк - и точно сами всё увидете...
...
Рейтинг: 0 / 0
Триггер на update
    #35544081
Leonid Vorontsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Загрузил в таблицу 2134446 строк. План не изменился:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
QUERY:
------
update tab set field = 'X' where id = 10000001
Estimated Cost: 1
Estimated # of Rows Returned: 1
  1) informix.tab: INDEX PATH
    (1) Index Keys: id   (Serial, fragments: ALL)
        Lower Index Filter: informix.tab.id = 10000001 
QUERY:
------

Estimated Cost: 72964
Estimated # of Rows Returned: 2134446
  1) informix.tab: SEQUENTIAL SCAN
UDRs in query:
--------------
    UDR id  :	234
    UDR name:	get_current
...
Рейтинг: 0 / 0
Триггер на update
    #35545825
Leonid Belov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid VorontsovТак?
Код: plaintext
1.
2.
3.
4.
5.
6.
create procedure get_current( ) returning datetime year to second;
	return current;
end procedure;
create trigger tab_up update on tab referencing new as new
for each row (
	execute procedure get_current( ) into new.dt
);
Не сложилось: SQL Error (-732) : Incorrect use of old or new values correlation name inside trigger.

Извините, протупил. Давно не писал такого... Нужно так:

execute function get_current( ) into tab.dt

то есть указать не correlation name, а имя самой таблицы...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Триггер на update
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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