powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / наследование и триггера
1 сообщений из 1, страница 1 из 1
наследование и триггера
    #34791382
shebeko1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал разделение таблиц так как описано здесь .
На родительской таблице были триггера, непонятно применяются ли они к потомкам?
И как взаимодействуют с RULE? Я уже прочитал, что RULE вроде как больше макрос и по идее должен просто модифицировать запрос.
Казалось бы надо каждому потомку повесить по триггеру и всё. Но проблема в том что для части объектов триггер вроде как исполняется, для части нет :(
Это меня и пугает.

Родительская таблица:
Код: 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.
                                Table "public.m_geo_position"
     Column      |       Type       |                        Modifiers                        
-----------------+------------------+---------------------------------------------------------
 en              | integer          | not null
 obj_id          | integer          | not null
 sig             | integer          | default  0 
 datetime        | double precision | default (((now())::abstime)::integer)::double precision
 degree_position | point            | default '(0,0)'::point
 plain_position  | point            | default '(0,0)'::point
 speed           | double precision | default  0 
 course          | double precision | default  0 
 plain_direction | point            | default '(0,0)'::point
 altitude        | double precision | default  0 
 height          | double precision | default  0 
Indexes:
    "m_geo_position_pkey" PRIMARY KEY, btree (en)
    "m_geo_position_datetime_idx" btree (datetime)
    "m_geo_position_obj_id_idx" btree (obj_id)
Rules:
<пропустил>
    out_insert_m_geo_position_0708 AS
    ON INSERT TO m_geo_position
   WHERE new.datetime >=  1185915600 . 0 ::double precision AND new.datetime <  1188594000 . 0 ::double precision DO INSTEAD  INSERT INTO m_geo_position_0708 (en, obj_id, sig, datetime, degree_position, plain_position, speed, course, plain_direction, altitude, height) 
  VALUES (new.en, new.obj_id, new.sig, new.datetime, new.degree_position, new.plain_position, new.speed, new.course, new.plain_direction, new.altitude, new.height)
    out_insert_m_geo_position_0709 AS
    ON INSERT TO m_geo_position
   WHERE new.datetime >=  1188594000 . 0 ::double precision AND new.datetime <  1191186000 . 0 ::double precision DO INSTEAD  INSERT INTO m_geo_position_0709 (en, obj_id, sig, datetime, degree_position, plain_position, speed, course, plain_direction, altitude, height) 
  VALUES (new.en, new.obj_id, new.sig, new.datetime, new.degree_position, new.plain_position, new.speed, new.course, new.plain_direction, new.altitude, new.height)
<пропустил>
Triggers:
    trg_del_m_geo_position AFTER DELETE ON m_geo_position FOR EACH ROW EXECUTE PROCEDURE _del_m_geo_position()
    trg_ins_m_geo_position BEFORE INSERT ON m_geo_position FOR EACH ROW EXECUTE PROCEDURE _insert_m_geo_position()
    trg_update_m_geo_position BEFORE UPDATE ON m_geo_position FOR EACH ROW EXECUTE PROCEDURE _insert_m_geo_position()


Одна из наследумых таблиц. Фактически сейчас вся запись происходит в неё.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
                              Table "public.m_geo_position_0709"
     Column      |       Type       |                        Modifiers                        
-----------------+------------------+---------------------------------------------------------
 en              | integer          | not null
 obj_id          | integer          | not null
 sig             | integer          | default  0 
 datetime        | double precision | default (((now())::abstime)::integer)::double precision
 degree_position | point            | default '(0,0)'::point
 plain_position  | point            | default '(0,0)'::point
 speed           | double precision | default  0 
 course          | double precision | default  0 
 plain_direction | point            | default '(0,0)'::point
 altitude        | double precision | default  0 
 height          | double precision | default  0 
Indexes:
    "m_geo_position_0709_datetime_idx" btree (datetime)
    "m_geo_position_0709_obj_id_idx" btree (obj_id) CLUSTER
Check constraints:
    "m_geo_position_0709_datetime_check" CHECK (datetime >=  1188594000 . 0 ::double precision AND datetime <  1191186000 . 0 ::double precision)
Inherits: m_geo_position

Есть ещё одна таблица, в которой хранятся последнии координаты для каждого объекта
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
                              Table "public.m_geo_position_last"
     Column      |       Type       |                        Modifiers                        
-----------------+------------------+---------------------------------------------------------
 en              | integer          | 
 obj_id          | integer          | not null
 sig             | integer          | default  0 
 datetime        | double precision | default (((now())::abstime)::integer)::double precision
 degree_position | point            | default '(0,0)'::point
 plain_position  | point            | default '(0,0)'::point
 speed           | double precision | default  0 
 course          | double precision | default  0 
 plain_direction | point            | default '(0,0)'::point
 altitude        | double precision | default  0 
 height          | double precision | default  0 
Indexes:
    "m_geo_position_last_en_idx" UNIQUE, btree (en)
    "m_geo_position_last_obj_id_idx" UNIQUE, btree (obj_id)

Вот в эту-то таблицу данные не всегда попадают. Вернее часть попадает, часть нет.
Попадать они туда должны по триггеру таблицы m_geo_position
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE FUNCTION _insert_m_geo_position() RETURNS "trigger"
    AS $$
BEGIN
  IF (select count(*) from m_geo_position_last where obj_id=NEW.obj_id)= 0  THEN
    INSERT INTO m_geo_position_last(en,obj_id,sig,datetime,degree_position,plain_position,speed,course,plain_direction,altitude,height) VALUES (NEW.en, NEW.obj_id, NEW.sig, NEW.datetime, NEW.degree_position, NEW.plain_position, NEW.speed, NEW.course, NEW.plain_direction, NEW.altitude, NEW.height);
  ELSE
    IF (select count(*) from m_geo_position_last where obj_id=NEW.obj_id AND datetime>NEW.datetime)= 0  THEN
	    UPDATE m_geo_position_last SET en=NEW.en, sig=NEW.sig, datetime=NEW.datetime, degree_position=NEW.degree_position,plain_position=NEW.plain_position, speed=NEW.speed, course=NEW.course, plain_direction=NEW.plain_direction, altitude=NEW.altitude, height=NEW.height where obj_id=NEW.obj_id;
	END IF;
  END IF;
  RETURN NEW;
END; $$
    LANGUAGE plpgsql;
Кстати, может есть какая-то более правильная замена этому инсертоапдейту? :)

m_geo_position изменяется таким запросом:
Код: plaintext
1.
  insert into m_geo_position select * from geo_position where datetime < tmp_change AND datetime >= last_cp;

До наследования это работало нормально. Наследование делал скриптом на шеле, так что механических ошибок быть не может, вернее если есть то для всех таблиц :)

В догонку. Что происходит когда 2 правила попадают под своё условие? Выполняются оба? Интересно особенно в контексте DO INSTEAD
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / наследование и триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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