|
наследование и триггера
#34791382
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
|
|
|
|
Сделал разделение таблиц так как описано здесь .
На родительской таблице были триггера, непонятно применяются ли они к потомкам?
И как взаимодействуют с RULE? Я уже прочитал, что RULE вроде как больше макрос и по идее должен просто модифицировать запрос.
Казалось бы надо каждому потомку повесить по триггеру и всё. Но проблема в том что для части объектов триггер вроде как исполняется, для части нет :(
Это меня и пугает.
Родительская таблица:
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()
Одна из наследумых таблиц. Фактически сейчас вся запись происходит в неё.
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
Есть ещё одна таблица, в которой хранятся последнии координаты для каждого объекта
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
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 изменяется таким запросом:
1.
insert into m_geo_position select * from geo_position where datetime < tmp_change AND datetime >= last_cp;
До наследования это работало нормально. Наследование делал скриптом на шеле, так что механических ошибок быть не может, вернее если есть то для всех таблиц :)
В догонку. Что происходит когда 2 правила попадают под своё условие? Выполняются оба? Интересно особенно в контексте DO INSTEAD
|
|
|