Mercurial > gemma
comparison schema/gemma.sql @ 3665:29ef6d41e4af
Use database triggers to move referencing objects to new versions
Needs fewer database round-trips and is more convenient especially
if more than two levels in the object hierarchy have to be handled.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Sat, 15 Jun 2019 09:24:28 +0200 |
parents | 2a079d0a71c1 |
children | db87f34805fb |
comparison
equal
deleted
inserted
replaced
3664:58508f50d192 | 3665:29ef6d41e4af |
---|---|
70 RETURN NEW; | 70 RETURN NEW; |
71 END; | 71 END; |
72 $$ | 72 $$ |
73 LANGUAGE plpgsql; | 73 LANGUAGE plpgsql; |
74 | 74 |
75 -- Trigger functions to be used as statement-level AFTER triggers, | |
76 -- associating time-based referencing objects to matching version | |
77 CREATE OR REPLACE FUNCTION move_gauge_referencing() RETURNS trigger AS | |
78 $$ | |
79 BEGIN | |
80 -- Avoid unnecessary execution ON UPDATE if validity did not change | |
81 IF OLD IS NULL OR NEW.validity <> OLD.validity THEN | |
82 UPDATE waterway.gauge_measurements | |
83 SET validity = NEW.validity | |
84 WHERE location = NEW.location | |
85 AND measure_date <@ NEW.validity; | |
86 | |
87 UPDATE waterway.bottlenecks | |
88 SET gauge_validity = NEW.validity | |
89 WHERE gauge_location = NEW.location | |
90 AND lower(validity) <@ NEW.validity; | |
91 END IF; | |
92 RETURN NULL; -- ignored | |
93 END; | |
94 $$ | |
95 LANGUAGE plpgsql; | |
96 | |
97 CREATE OR REPLACE FUNCTION move_bottleneck_referencing() RETURNS trigger AS | |
98 $$ | |
99 BEGIN | |
100 -- Avoid unnecessary execution ON UPDATE if validity did not change | |
101 IF OLD IS NULL OR NEW.validity <> OLD.validity THEN | |
102 UPDATE waterway.sounding_results | |
103 SET bottleneck_validity = NEW.validity | |
104 WHERE bottleneck_id = NEW.bottleneck_id | |
105 AND CAST(date_info AS timestamptz) <@ NEW.validity; | |
106 END IF; | |
107 RETURN NULL; -- ignored | |
108 END; | |
109 $$ | |
110 LANGUAGE plpgsql; | |
111 | |
75 -- | 112 -- |
76 -- GEMMA data | 113 -- GEMMA data |
77 -- | 114 -- |
78 | 115 |
79 -- Namespace not to be accessed directly by any user | 116 -- Namespace not to be accessed directly by any user |
294 ) | 331 ) |
295 -- Allow only one non-erased entry per location | 332 -- Allow only one non-erased entry per location |
296 CREATE UNIQUE INDEX gauges_erased_unique_constraint | 333 CREATE UNIQUE INDEX gauges_erased_unique_constraint |
297 ON gauges (location) | 334 ON gauges (location) |
298 WHERE NOT erased | 335 WHERE NOT erased |
336 -- Associate referencing objects to matching gauge version | |
337 CREATE TRIGGER move_referencing AFTER INSERT OR UPDATE OF validity | |
338 ON gauges FOR EACH ROW EXECUTE FUNCTION move_gauge_referencing() | |
299 | 339 |
300 CREATE TABLE gauges_reference_water_levels ( | 340 CREATE TABLE gauges_reference_water_levels ( |
301 location isrs NOT NULL, | 341 location isrs NOT NULL, |
302 validity tstzrange NOT NULL, | 342 validity tstzrange NOT NULL, |
303 FOREIGN KEY (location, validity) REFERENCES gauges ON UPDATE CASCADE, | 343 FOREIGN KEY (location, validity) REFERENCES gauges ON UPDATE CASCADE, |
523 ) | 563 ) |
524 -- Allow only one non-erased entry per bottleneck | 564 -- Allow only one non-erased entry per bottleneck |
525 CREATE UNIQUE INDEX bottlenecks_erased_unique_constraint | 565 CREATE UNIQUE INDEX bottlenecks_erased_unique_constraint |
526 ON bottlenecks (bottleneck_id) | 566 ON bottlenecks (bottleneck_id) |
527 WHERE NOT erased | 567 WHERE NOT erased |
568 -- Associate referencing objects to matching bottleneck version | |
569 CREATE TRIGGER move_referencing AFTER INSERT OR UPDATE OF validity | |
570 ON bottlenecks FOR EACH ROW | |
571 EXECUTE FUNCTION move_bottleneck_referencing() | |
528 | 572 |
529 CREATE TABLE bottlenecks_riverbed_materials ( | 573 CREATE TABLE bottlenecks_riverbed_materials ( |
530 bottleneck_id int NOT NULL REFERENCES bottlenecks(id) | 574 bottleneck_id int NOT NULL REFERENCES bottlenecks(id) |
531 ON DELETE CASCADE, | 575 ON DELETE CASCADE, |
532 riverbed varchar NOT NULL REFERENCES riverbed_materials, | 576 riverbed varchar NOT NULL REFERENCES riverbed_materials, |