powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объясните работу триггера
6 сообщений из 6, страница 1 из 1
Объясните работу триггера
    #34500781
Skif Swarogich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно сабж. Создаю триггер, который должен работать после вставки или обновления данных в таблице. С самой триггерной функцией вопросов нет - написана, отдебажена - работает.
Проблема возникает следующего характера.
Сначала приведу кусок кода, потом объясню, что к чему(писано на Perl):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
#!/usr/bin/perl -w
use lib "/usr/local/scripts/lib";
use lib "/usr/local/script/lib";
use lib "/usr/local/scripts/ngstat/lib";
use lib "/usr/local/script/ngstat/lib";
use lib "/usr/local/lib/ngstat";
use lib "/usr/local/lib";
use skmainmod;
use Time::localtime;
use DBI;
...............................
######## INSERT
print "\n\n\nINSERTING!!!!\n\n\n";
$dbh->begin_work();
open (FS,"</tmp/rl0.sk");
$query ="INSERT INTO temp_table
	(ip_from,s_port,ip_to,d_port,proto,packets,bytes,date_ins,time_ins,host,interface,traff) 
	VALUES (?,?,?,?,?,?,?,?,?,?,?,
	(SELECT traff.id FROM traff WHERE traff.type=?))";
my $ind= 0 ;
while(<FS>){
	$sth = $dbh->prepare($query);
	#print "$ind\. $_";
	$ind++;
	chomp $_;
	my @arr = split(/\s/,$_);

	my $rv = $sth->execute($arr[ 0 ],$arr[ 1 ],$arr[ 2 ],$arr[ 3 ],$arr[ 4 ],
		$arr[ 5 ],$arr[ 6 ],$arr[ 7 ],$arr[ 8 ], $arr[ 9 ],$arr[ 10 ],$arr[ 11 ]);
		if (!defined $rv) {
		$dbh->rollback;
		die "Cannot insert table. ROLLBACK...\n";
	}
	print "\n--------------------------------------------------\n";
	print "INSERTED!!!!\n";
	print "\n--------------------------------------------------\n";
		
}
close(FS);

$dbh->commit();
################### INSERT of DATA is FINISHING
my $d2 =`date`;
############ ADD to log file time of work INSERT part of script
open (PS,'>>/tmp/log2.sk');
	print PS "$size\n";
	print PS "$d1 $d2\n";
close(PS);
##############################################
$dbh->begin_work();
######## CHECK(CREATE) TABLE FOR TRIIGERRING OUR INSERTED DATA.
$query = "SELECT COUNT(show_tables) FROM show_tables(\'public\') 
	WHERE show_tables=\'temp_table_trgger\'";
	print "\n--------------------------------------------------\n";
	print "$query\n";
	print "\n--------------------------------------------------\n";
	
$sth = $dbh->prepare($query);
my $rv = $sth->execute();
if (!defined $rv) {
	$dbh->rollback;
	die "Cannot execute SELECT COUNT...\n";
}
my $rs = $sth->fetchrow_array;

if ($rs ==  1  ) {
	$query = "UPDATE temp_table_trigger SET trig=1";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute();
}
else {
	$query = "CREATE TABLE temp_table_trigger ( trig integer )";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute();
	$query = "CREATE TRIGGER tr_select_into_hour_tbl
					  AFTER INSERT OR UPDATE
					  ON temp_table_trigger
					  FOR EACH STATEMENT
					  EXECUTE PROCEDURE t_select_into_hour_tbl()";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute();
	$query = "INSERT INTO temp_table_trigger (trig) VALUES (?)";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute( 1 );
}
######## FIN INS
$dbh->commit();
Есть данные, котоые находятся в файле. Их нужно загнать во временную таблицу. После того как все данные попадут в таблицу(подчеркиваю, ВСЕ, это важно). Нужно проверить наличие еще одной таблицы, если отсутсвует создать, и привязать к ней триггер, который бы сортировал полученные данные во временной таблице в другие. Ну тут как бы проблем нет. Почти. То есть, первый этап проходит на ура. Если вызвать после этого функцию, которая стала прообьразом триггерной - все отрабатывает на ура за несколько минут (порция данных ~7500 строк) + слабое тестовое железо.
Затык в чем. Логично было бы повесить на временную таблицу триггер который бы сразу же бы и сортировал бы данные по таблицам, но увы вариант не подходит - время тратится в несколько часов, что для такой маленькой порции не есть гуд.
По сему была сделана дополнительно одна таблица, при вставке или обновлении которой бы и вызывался тригер по сортировке временной таблицы. Ессно, что после Внесения всех данных(видно из кода).
В общем все доходит до создания таблицы, на которую я вешаю триггер, потом выполняется insert/update в эту таблицу.
По логике, скрипт вставив бы данные должен был бы пойти дальше, но нет, он терпеливо ждет, когда отработают все триггера и функции.
Вот И возникает вопрос, а почему собственно он ждет, а непросто всатвит данные и не идет дальше? Или это особенность работы триггера? Пока он не отработает, программу никуда не пустит?
...
Рейтинг: 0 / 0
Объясните работу триггера
    #34500789
Skif Swarogich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, вот добавлю лог, я по нему приблихзительное время работы скрипта оцениваю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
root@fbsd2.home /usr/local/script/Dm :less /tmp/log2.sk
7255
среда,  2 мая 2007 г. 22:14:47 (EEST)
 среда,  2 мая 2007 г. 22:15:23 (EEST)
 среда,  2 мая 2007 г. 22:34:11 (EEST)
--------
root@fbsd2.home /usr/local/script/Dm :
первая строка - количество внесенных записей.
вторая и третья - время потраченное на вставку данных
четвертая - время потраченное на (создание + вставку)/обновление таблицы temp_table_trigger. И соответственно срабаывание триггера, пересчет всех данных, распихивание по всем таблицам и прочее. Как видите - немало времени тратиться на непритязательный и несложный кусок кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
$dbh->begin_work();
######## CHECK(CREATE) TABLE FOR TRIIGERRING OUR INSERTED DATA.
$query = "SELECT COUNT(show_tables) FROM show_tables(\'public\') 
	WHERE show_tables=\'temp_table_trgger\'";
	print "\n--------------------------------------------------\n";
	print "$query\n";
	print "\n--------------------------------------------------\n";
	
$sth = $dbh->prepare($query);
my $rv = $sth->execute();
if (!defined $rv) {
	$dbh->rollback;
	die "Cannot execute SELECT COUNT...\n";
}
my $rs = $sth->fetchrow_array;

if ($rs ==  1  ) {
	$query = "UPDATE temp_table_trigger SET trig=1";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute();
}
else {
	$query = "CREATE TABLE temp_table_trigger ( trig integer )";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute();
	$query = "CREATE TRIGGER tr_select_into_hour_tbl
					  AFTER INSERT OR UPDATE
					  ON temp_table_trigger
					  FOR EACH STATEMENT
					  EXECUTE PROCEDURE t_select_into_hour_tbl()";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute();
	$query = "INSERT INTO temp_table_trigger (trig) VALUES (?)";
	$sth = $dbh->prepare($query);
	$rv = $sth->execute( 1 );
}
######## FIN INS
$dbh->commit();
...
Рейтинг: 0 / 0
Объясните работу триггера
    #34500962
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Skif SwarogichПо логике, скрипт вставив бы данные должен был бы пойти дальше, но нет, он терпеливо ждет, когда отработают все триггера и функции.
Вот И возникает вопрос, а почему собственно он ждет, а непросто всатвит данные и не идет дальше? Или это особенность работы триггера? Пока он не отработает, программу никуда не пустит?Все не читал, отвечу только на это.
Конечно программа ждет, пока выполнится запрос.
Если вы не хотите ждать, запускайте запрос в отдельном потоке.
Или используйте libpq 29.4. Asynchronous Command Processing .
Умеет ли DBD::pg так работать я не знаю.
...
Рейтинг: 0 / 0
Объясните работу триггера
    #34501938
Skif Swarogich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То есть, это нормально, что выполнив вставку данных в таблицу, на которую повязан триггер, я вынужден ждать, пока он отработает?
И только форком, или распаралеливанием от этого можно избавиться?
Тогда смысл в триггерах как таковых? Если для вставки одной строки из одного символа мне приходиться ждать 10-20 минут ответа от сервера? За это время меня и по таймауту могут послать, если сервер удаленный.
...
Рейтинг: 0 / 0
Объясните работу триггера
    #34502135
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Skif SwarogichТо есть, это нормально, что выполнив вставку данных в таблицу, на которую повязан триггер, я вынужден ждать, пока он отработает?Да. Триггер может эту вставку отменить, вызвать исключение и т.д. А тебе после всего этого нужно еще commit сделать.

Skif SwarogichТогда смысл в триггерах как таковых? "Вы просто не умеет их готовить"

Skif SwarogichЕсли для вставки одной строки из одного символа мне приходиться ждать 10-20 минут ответа от сервера?Думаю стоит изменить алгоритм.
...
Рейтинг: 0 / 0
Объясните работу триггера
    #34503609
Skif Swarogich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Serik Akhmetov Skif SwarogichТо есть, это нормально, что выполнив вставку данных в таблицу, на которую повязан триггер, я вынужден ждать, пока он отработает?Да. Триггер может эту вставку отменить, вызвать исключение и т.д. А тебе после всего этого нужно еще commit сделать.

Skif SwarogichТогда смысл в триггерах как таковых? "Вы просто не умеет их готовить"

Skif SwarogichЕсли для вставки одной строки из одного символа мне приходиться ждать 10-20 минут ответа от сервера?Думаю стоит изменить алгоритм.

Спасибо, въехал. Мне тут на слух оценили структуру базы и объяснили, что она у меня практически вся лочится и пока не отработает мой триггер и таблица не отлочиться возврат в свою программу я не получу.
Что ж, будем повышать быстродействие...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Объясните работу триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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