powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблемка с тригером на апдейт
16 сообщений из 16, страница 1 из 1
проблемка с тригером на апдейт
    #34567127
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть такая задачка
тригер
при изменении данных он "подправляет" строки, которые позже его

...
for glid,sd,sk in select gl_id,dt_s,kt_s from cis.cis_gl
where cis_gl.cis_object = new.cis_object and cis_gl.post_date > new.post_date
order by cis_gl.post_date
loop
sldd = sldd + sd; sldk = sldk + sk;
update cis.cis_gl set skt_s= sldk , sdt_s= sldd where cis.cis_gl.gl_id = glid;
end loop;
...

и почему-то выскакивает ашипка

ERROR: duplicate key violates unique constraint "gl_pk"
SQL state: 23505
Context: SQL statement "update cis.cis_gl set skt_s= $1 , sdt_s= $2 where cis.cis_gl.gl_id = $3 "

cis.cis_gl.gl_id - айди строки ну и ее gl_pk - уникальный индекс

и я так думаю что я не трогаю текущую строку, плюс не меняю айди и не вставляю строки

где могла собака порыться?
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34567152
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
\d gl_pk
?
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34567185
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gl_pk - уникальный индекс таблицы cis.cis_gl по полю cis.cis_gl.gl_id
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34567306
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значит в gl_pk входит не только gl_id, либо чтото вставляется в cis_gl с существующим gl_id (через trigger/rule, другую сессию), либо баг в пг...
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34567571
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALTER TABLE cis.cis_gl
ADD CONSTRAINT gl_pk PRIMARY KEY(gl_id);

Думаю что баг :(
уже сталкивался что функции некоторые работают через раз -пока или не перезайдешь или тот-же вакуум не сделаешь...
Жалко
версия пг 8,2 последняя с сайта под винду
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34567598
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GreyCardinalДумаю что баг :(Я думаю, что это ваша невнимательность. Наверняка забыли какой-то триггер, или ваша программа делает не совсем тот запрос, который вы ожидаете.
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34567625
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ALTER TABLE cis.cis_gl
ADD CONSTRAINT gl_pk PRIMARY KEY(gl_id);

Думаю что баг :(
уже сталкивался что функции некоторые работают через раз -пока или не перезайдешь или тот-же вакуум не сделаешь...
Жалко
версия пг 8,2 последняя с сайта под винду
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34568054
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в общем это баг или фича ;)
сделал ограничение по выборке до 10 000 - все сработало
а когда хотел обновить все (500 000) то дает такую "наведенную" ошибку...
теперь буду копать дальше

чето я не догнал или и этого нет в ПГ

для решения данной задачи
в хранимой процедуре

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 
 begin
 for o_id in select "cis_ID" from cis.cis_objects
  loop
    START TRANSACTION; 
      for grow in select * from cis.cis_gl where o_id=cis.cis_gl.cis_object order by post_date limit  1 
       loop
         update cis.cis_gl set comment='hupdated', kt_s=  0 , dt_s=  606  
         where cis_gl.gl_id = grow.gl_id;
       end loop;
   COMMIT;
  end loop;
 return  0 ;
end
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34568078
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите полную структуру таблицы, включая индексы,триггеры, правила. И запрос.
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34568146
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"это" - запустить и завершить транзакции внутри процедур

Код: 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.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
- Table: cis.cis_objects

-- DROP TABLE cis.cis_objects;

CREATE TABLE cis.cis_objects
(
  "cis_ID" bigint NOT NULL DEFAULT nextval('"cis_objects_cis_ID_seq"'::regclass),
  parient_id bigint NOT NULL DEFAULT  0 ,
  "Name" character( 100 ),
  code1 character( 50 ),
  code2 character( 50 ),
  insert_time interval,
  update_time interval,
  CONSTRAINT cis_pk PRIMARY KEY ("cis_ID"),
  CONSTRAINT parient_fk FOREIGN KEY ("cis_ID")
      REFERENCES cis.cis_objects ("cis_ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION,
  CONSTRAINT cis_objects_code1_key UNIQUE (code1),
  CONSTRAINT cis_objects_code2_key UNIQUE (code2)
) 
WITH OIDS;
ALTER TABLE cis.cis_objects OWNER TO cis;

CREATE INDEX fki_parient_fk
  ON cis.cis_objects
  USING btree
  ("cis_ID");

REATE TABLE cis.cis_gl
(
  cis_object bigint NOT NULL,
  dt_s double precision NOT NULL DEFAULT  0 ,
  kt_s double precision NOT NULL DEFAULT  0 ,
  sdt_s double precision NOT NULL DEFAULT  0 ,
  skt_s double precision NOT NULL DEFAULT  0 ,
  gl_id bigint NOT NULL DEFAULT nextval('cis_gl_id'::regclass),
  post_date timestamp with time zone NOT NULL DEFAULT now(),
  "comment" character( 100 ),
  createstep integer,
  CONSTRAINT gl_pk PRIMARY KEY (gl_id),
  CONSTRAINT cis_o FOREIGN KEY (cis_object)
      REFERENCES cis.cis_objects ("cis_ID") MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE NO ACTION
) 
WITHOUT OIDS;
ALTER TABLE cis.cis_gl OWNER TO cis;


-- Index: cis.cis_gl_idx

-- DROP INDEX cis.cis_gl_idx;

CREATE INDEX cis_gl_idx
  ON cis.cis_gl
  USING btree
  (cis_object, post_date);



-- Trigger: insert_gl on cis.cis_gl

-- DROP TRIGGER insert_gl ON cis.cis_gl;

CREATE TRIGGER insert_gl
  BEFORE INSERT
  ON cis.cis_gl
  FOR EACH ROW
  EXECUTE PROCEDURE cis.insert_gl('f');
COMMENT ON TRIGGER insert_gl ON cis.cis_gl IS 'fd';

-- Trigger: update_gl on cis.cis_gl

-- DROP TRIGGER update_gl ON cis.cis_gl;

CREATE TRIGGER update_gl
  BEFORE UPDATE
  ON cis.cis_gl
  FOR EACH ROW
  EXECUTE PROCEDURE cis.update_gl();



CREATE OR REPLACE FUNCTION cis.update_gl()
  RETURNS "trigger" AS
$BODY$DECLARE sldd double precision;
DECLARE sldk double precision;
DECLARE trow cis.cis_gl%rowtype;
declare start_time timestamp;
declare sk double precision;
declare sd double precision;
declare glid bigint;
BEGIN
if (old.post_date<> new.post_date) or (new.kt_s <> old.kt_s) or (new.dt_s <> old.dt_s) then
  start_time = now();
  select sdt_s into sldd from cis.cis_gl where cis_gl.cis_object = new.cis_object and cis_gl.post_date< new.post_date
  order by post_date desc limit  1 ;
  if sldd is null then
     sldd =  0 ;
  end if;
  new.sdt_s= new.dt_s + sldd;
  select skt_s into sldk from cis.cis_gl where cis_gl.cis_object = new.cis_object and cis_gl.post_date< new.post_date
  order by post_date desc limit  1 ;
  if sldk is null then
     sldk =  0 ;
  end if;
  new.skt_s= new.kt_s + sldk;
   if ( 1 = 1 ) then
   sldd = new.sdt_s; sldk = new.skt_s;
   for glid,sd,sk in select gl_id,dt_s,kt_s from cis.cis_gl
     where cis_gl.cis_object = new.cis_object and cis_gl.post_date > new.post_date
     order by cis_gl.post_date
     loop
       sldd = sldd + sd; sldk = sldk + sk;
       update cis.cis_gl set skt_s= sldk , sdt_s= sldd where gl_id = glid;
     end loop;
  end if;
   update cis.cis_objects set update_time = now()-start_time where "cis_ID" = new.cis_object;
 end if;
 RETURN NEW;
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cis.update_gl() OWNER TO cis;


CREATE OR REPLACE FUNCTION cis.insert_gl()
  RETURNS "trigger" AS
$BODY$
DECLARE sld double precision;
DECLARE trow cis.cis_gl%rowtype;
BEGIN
  select sdt_s into sld from cis.cis_gl where cis.cis_gl.cis_object = new.cis_object and cis_gl.post_date< new.post_date
  order by post_date desc limit  1 ;
  if sld is null then
     sld =  0 ;
  end if;
  new.sdt_s= new.dt_s + sld;
  select skt_s into sld from cis.cis_gl where cis.cis_gl.cis_object = new.cis_object and cis_gl.post_date< new.post_date
  order by post_date desc limit  1 ;
  if sld is null then
     sld =  0 ;
  end if;
  new.skt_s= new.kt_s + sld;
  if ( 1 = 2 ) then 
    new.comment='insert';
    for trow in select * from cis.cis_gl
      where cis.cis_gl.cis_object = new.cis_object and cis.cis_gl.post_date > new.post_date
      order by cis.cis_gl.post_date
      loop
        update cis.cis_gl set comment='updated', skt_s= new.kt_s + trow.skt_s, sdt_s= new.dt_s + trow.sdt_s where cis_gl.gl_id = trow.gl_id;
      end loop;
   end if;
 RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cis.insert_gl() OWNER TO cis;

---ну и сама процедурка которая плющит базку ;)

CREATE OR REPLACE FUNCTION cis.hrono_update()
  RETURNS integer AS
$BODY$DECLARE orow cis.cis_objects%rowtype;
DECLARE grow cis.cis_gl%rowtype;
DECLARE o_id bigint;
begin
 for o_id in select "cis_ID" from cis.cis_objects
  loop
---    START TRANSACTION; 
      for grow in select * from cis.cis_gl where o_id=cis.cis_gl.cis_object order by post_date limit  1 
       loop
         update cis.cis_gl set comment='hupdated', kt_s=  0 , dt_s=  606  
         where cis_gl.gl_id = grow.gl_id;
       end loop;
---   COMMIT;
  end loop;
 return  0 ;
end$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION cis.hrono_update() OWNER TO cis;
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34568186
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл пару последовательностей
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE SEQUENCE cis.cis_gl_id
  INCREMENT  1 
  MINVALUE  1 
  MAXVALUE  9223372036854775807 
  START  966943 
  CACHE  1 ;
ALTER TABLE cis.cis_gl_id OWNER TO cis;

CREATE SEQUENCE cis."cis_objects_cis_ID_seq"
  INCREMENT  1 
  MINVALUE  1 
  MAXVALUE  9223372036854775807 
  START  100 
  CACHE  1 ;
ALTER TABLE cis."cis_objects_cis_ID_seq" OWNER TO cis;

...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34568522
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На первый взгляд все нормально, вы все триггеры привели ?
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34571117
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все
и как я уже сказал что данная судя по всему возникает при обновлении большого количества записей в транзакции
будем копать дальше ;)
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34571157
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
214500 записей - обновляет
221200 записей - уже нет -вываливается с ошибкой
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34571222
assa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GreyCardinal214500 записей - обновляет
221200 записей - уже нет -вываливается с ошибкойа что за запрос на обновление? Не приведете?
...
Рейтинг: 0 / 0
проблемка с тригером на апдейт
    #34627349
GreyCardinal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выдрал из бэкапа - могут быть "косячки"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
AS $$DECLARE orow cis.cis_objects%rowtype;
DECLARE grow cis.cis_gl%rowtype;
DECLARE o_id bigint;
begin
 for o_id in select "cis_ID" from cis.cis_objects where "cis_ID" =  100  -- ограничение типа
  loop
---    START TRANSACTION; --- хочется этого ;)
      for grow in select * from cis.cis_gl where o_id=cis.cis_gl.cis_object order by post_date limit  1 
       loop
         update cis.cis_gl set comment='hupdated', kt_s=  0 , dt_s=  909 
         where cis_gl.gl_id = grow.gl_id;
       end loop;
---   COMMIT; --- ну и продолжение чего хочется ;)
  end loop;
 return  0 ;
end$$ 
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / проблемка с тригером на апдейт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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