powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Триггеры и функции
6 сообщений из 6, страница 1 из 1
Триггеры и функции
    #34043642
Berx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день !!!

Такая проблема, есть две таблицы таб1 и таб2.
В таблицу таб1 заносятся записи, таб2 должна храниться статистика по таб1.

таб1
create table таб1 (id serial, ip inet, size int8, dat date default current_date, name text);

таб2
create table таб2 (id serial, name text, size int8);

insert into таб1 (ip,size,name) values('10.10.10.1','300','10.10.06','user1');
insert into таб1 (ip,size,name) values('10.10.10.2','300','10.10.06','user2');
insert into таб1 (ip,size,name) values('10.10.10.2','300','10.10.06','user2');
insert into таб1 (ip,size,name) values('10.10.10.1','300','10.10.06','user1');

А в таб2 должна быть сумарная цифра size по user1 или user2.

написал функцию на plperl которая получает параметр user1(имя пользователя) и возвращает сумму по user1.

Теперь незнаю как мне сделать.

Получаеться функцию можно засунут в триггер чтоб по приходу в таб1 цифра помещалась в таб2.

Но тут есть два трабла
- во первых незнаю как получить значение id записи которая инсертится в таб1 чтоб потом удалить.
- а вовторых хочеться чтоб в таб2 занчение пользователя при инсерте в таб1 увеличивалось а не вставлялось.

Может есть какие варианты, может можно по другому сделать ?
Сильно не судите.
...
Рейтинг: 0 / 0
Триггеры и функции
    #34043818
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Berx - во первых незнаю как получить значение id записи которая инсертится в таб1 чтоб потом удалить.
объявите поле id не serial, а просто int4

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE SEQUENCE tab_id_seq
  INCREMENT  100 
  MINVALUE  1 
  MAXVALUE  9223372036854775807 
  START  1 
  CACHE  1 ;

  ...
  id_tab int4 NOT NULL DEFAULT nextval('tab_id_seq'::text),
  ...

там где нужно узнать id, явно получайте его через nextval и подставляте вручную

Berx - а вовторых хочеться чтоб в таб2 значение пользователя при инсерте в таб1 увеличивалось а не вставлялось
так и делайте update а не insert

BerxМожет есть какие варианты, может можно по другому сделать ?
можно написать одну процедуру, которая будет все считать и сохранять в БД
...
Рейтинг: 0 / 0
Триггеры и функции
    #34043852
Berx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как должна выглядеть эта процедура примерно ?
...
Рейтинг: 0 / 0
Триггеры и функции
    #34043890
Berx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой дурацкий вопрос а что происходит когда maxvalue доходит до своего предела ???
...
Рейтинг: 0 / 0
Триггеры и функции
    #34044224
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BerxТакой дурацкий вопрос а что происходит когда maxvalue доходит до своего предела ???
забей :) уже не раз обсуждалось
...
Рейтинг: 0 / 0
Триггеры и функции
    #34045781
Berx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче по мозговав немного пару часов допер ка к сделать.

Может кому понадобиться.

CREATE SEQUENCE t1_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

create table t1
( id int8 default nextval('t1_id_seq'),
username text, bytes int8);

create table t2 (id serial,name text, bytes int8);

Тут береться значение и сохраняеться с увеличением значения и удаляються записи из основной таблицы чтоб не занимала место :-)

create or replace function calc_size() returns "trigger" as $$
$rv = spi_exec_query("select nextval('traffic_id_seq')");
$curid = $rv->{rows}[0]->{nextval};
$sel = spi_exec_query("select oob_prefix,raw_pktlen from traffic where id=$curid");
$size = $sel->{rows}[0]->{raw_pktlen};
$name = $sel->{rows}[0]->{oob_prefix};
$tup = spi_exec_query("select bytes from user_traffic where name='$name'");
$oldsize = $tup->{rows}[0]->{bytes};
$newsize = $size + $oldsize;
$upd = spi_exec_query("update user_traffic set bytes = $newsize where name='$name'");
$del = spi_exec_query("delete from traffic where id=$curid");
return undef;
$$ language plperl;

Создаем триггре
create trigger traffic_calc after insert on traffic for each row execute procedure calc_size();

Только получаеться что значения сохраняли и накапливались нужно создать имена в сохраняемой таблице.

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


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