comparison schema/updates/1113/02.views_to_geoservers.sql @ 4616:b605e91f08f0 geoserver_sql_views

Use GeoServer's SQL view feature instead of in-database VIEWs VIEWs are executed with the rigths of their owner, but we need to access the data with the rights of the current_user in order to have row level security policies applied correctly. Moving the former VIEW definitions into GeoServer SQL views achieves this, as the latter are executed as subqueries in usual statements. Note that a fresh GeoServer setup is required to make this work, which can be achieved e.g. by starting gemma with the geoserver-clean flag. Otherwise, GeoServer will keep trying to access the dropped VIEWs.
author Tom Gottfried <tom@intevation.de>
date Tue, 10 Sep 2019 19:56:43 +0200
parents
children
comparison
equal deleted inserted replaced
4615:32d3e0cecf4f 4616:b605e91f08f0
1 -- Copied from ../../default_sysconfig.sql
2 -- plus conflict resolution to achieve updates
3
4 CREATE TEMP TABLE base_views (name, def) AS VALUES (
5 'gauges_base_view', $$
6 SELECT
7 g.location,
8 isrs_asText(g.location) AS isrs_code,
9 g.objname,
10 g.geom,
11 g.applicability_from_km,
12 g.applicability_to_km,
13 g.validity,
14 g.zero_point,
15 g.geodref,
16 g.date_info,
17 g.source_organization,
18 g.erased,
19 r.rwls AS reference_water_levels,
20 wl.measure_date AS gm_measuredate,
21 wl.water_level AS gm_waterlevel,
22 wl_14d.n AS gm_n_14d,
23 fca.forecast_accuracy_3d,
24 fca.forecast_accuracy_1d
25 FROM waterway.gauges g
26 LEFT JOIN (SELECT location, validity,
27 json_strip_nulls(json_object_agg(
28 coalesce(depth_reference, 'empty'), value)) AS rwls
29 FROM waterway.gauges_reference_water_levels
30 GROUP BY location, validity) AS r
31 USING (location, validity)
32 LEFT JOIN (SELECT DISTINCT ON (location)
33 location,
34 measure_date,
35 water_level
36 FROM waterway.gauge_measurements
37 ORDER BY location, measure_date DESC) AS wl
38 USING (location)
39 LEFT JOIN (SELECT location, count(water_level) AS n
40 FROM waterway.gauge_measurements
41 -- consider all measurements within 14 days plus a tolerance
42 WHERE measure_date
43 >= current_timestamp - '14 days 00:15'::interval
44 GROUP BY location) AS wl_14d
45 USING (location)
46 LEFT JOIN (SELECT location,
47 max(acc) FILTER (WHERE
48 measure_date <= current_timestamp + '1 day'::interval)
49 AS forecast_accuracy_1d,
50 max(acc) AS forecast_accuracy_3d
51 FROM waterway.gauge_predictions,
52 GREATEST(water_level - lower(conf_interval),
53 upper(conf_interval) - water_level) AS acc (acc)
54 WHERE measure_date
55 BETWEEN current_timestamp
56 AND current_timestamp + '3 days'::interval
57 GROUP BY location) AS fca
58 USING (location)
59 $$);
60
61 INSERT INTO sys_admin.published_services (schema, name, srid, view_def) VALUES
62 ('waterway', 'gauges_geoserver', 4326, $$
63 SELECT
64 isrs_code,
65 objname,
66 geom,
67 applicability_from_km,
68 applicability_to_km,
69 zero_point,
70 geodref,
71 date_info,
72 source_organization,
73 reference_water_levels,
74 gm_measuredate,
75 gm_waterlevel,
76 gm_n_14d,
77 forecast_accuracy_3d,
78 forecast_accuracy_1d
79 FROM (
80 $$ || (SELECT def FROM base_views WHERE name = 'gauges_base_view') || $$
81 ) AS gauges_base_view
82 WHERE NOT erased
83 $$),
84 ('waterway', 'sections_geoserver', 4326, $$
85 SELECT
86 s.id,
87 s.name,
88 (s.section).lower::varchar as lower,
89 (s.section).upper::varchar as upper,
90 s.area::Geometry(MULTIPOLYGON, 4326),
91 s.objnam,
92 s.nobjnam,
93 s.date_info,
94 s.source_organization,
95 s.staging_done,
96 min(g.gm_measuredate) AS gm_measuredate,
97 min(g.gm_n_14d) AS gm_n_14d,
98 max(g.forecast_accuracy_3d) AS forecast_accuracy_3d,
99 max(g.forecast_accuracy_1d) AS forecast_accuracy_1d
100 FROM waterway.sections s
101 LEFT JOIN (
102 $$ || (SELECT def FROM base_views WHERE name = 'gauges_base_view') || $$
103 WHERE NOT erased) AS g
104 ON g.location <@ s.section
105 GROUP BY s.id
106 $$),
107 ('waterway', 'stretches_geoserver', 4326, $$
108 SELECT
109 s.id,
110 s.name,
111 (s.stretch).lower::varchar as lower,
112 (s.stretch).upper::varchar as upper,
113 s.area::Geometry(MULTIPOLYGON, 4326),
114 s.objnam,
115 s.nobjnam,
116 s.date_info,
117 s.source_organization,
118 (SELECT string_agg(country_code, ', ')
119 FROM waterway.stretch_countries
120 WHERE stretches_id = s.id) AS countries,
121 s.staging_done,
122 min(g.gm_measuredate) AS gm_measuredate,
123 min(g.gm_n_14d) AS gm_n_14d,
124 max(g.forecast_accuracy_3d) AS forecast_accuracy_3d,
125 max(g.forecast_accuracy_1d) AS forecast_accuracy_1d
126 FROM waterway.stretches s
127 LEFT JOIN (
128 $$ || (SELECT def FROM base_views WHERE name = 'gauges_base_view') || $$
129 WHERE NOT erased) AS g
130 ON g.location <@ s.stretch
131 GROUP BY s.id
132 $$),
133 ('waterway', 'distance_marks_ashore_geoserver', 4326, $$
134 SELECT id,
135 country,
136 geom::Geometry(POINT, 4326),
137 related_enc,
138 hectom,
139 catdis,
140 position_code
141 FROM waterway.distance_marks
142 $$),
143 ('waterway', 'distance_marks_geoserver', 4326, $$
144 SELECT
145 isrs_asText(location_code) AS location,
146 geom::Geometry(POINT, 4326),
147 related_enc,
148 (location_code).hectometre
149 FROM waterway.distance_marks_virtual
150 $$),
151 ('waterway', 'sounding_results_contour_lines_geoserver', 4326, $$
152 SELECT bottleneck_id,
153 date_info,
154 height,
155 CAST(lines AS geometry(multilinestring, 4326)) AS lines
156 FROM waterway.sounding_results_contour_lines cl
157 JOIN waterway.sounding_results sr ON sr.id = cl.sounding_result_id
158 $$),
159 ('waterway', 'bottlenecks_geoserver', 4326, $$
160 SELECT
161 b.id,
162 b.bottleneck_id,
163 b.objnam,
164 b.nobjnm,
165 b.area,
166 b.rb,
167 b.lb,
168 b.responsible_country,
169 b.revisiting_time,
170 b.limiting,
171 b.date_info,
172 b.source_organization,
173 g.objname AS gauge_objname,
174 g.reference_water_levels,
175 fal.date_info AS fa_date_info,
176 fal.critical AS fa_critical,
177 g.gm_measuredate,
178 g.gm_waterlevel,
179 g.gm_n_14d,
180 srl.date_max,
181 g.forecast_accuracy_3d,
182 g.forecast_accuracy_1d
183 FROM waterway.bottlenecks b
184 LEFT JOIN (
185 $$ || (SELECT def FROM base_views WHERE name = 'gauges_base_view') || $$
186 ) AS g
187 ON b.gauge_location = g.location
188 AND g.validity @> current_timestamp
189 LEFT JOIN (SELECT DISTINCT ON (bottleneck_id)
190 bottleneck_id, date_info, critical
191 FROM waterway.fairway_availability
192 ORDER BY bottleneck_id, date_info DESC) AS fal
193 ON b.bottleneck_id = fal.bottleneck_id
194 LEFT JOIN (SELECT DISTINCT ON (bottleneck_id)
195 bottleneck_id, max(date_info) AS date_max
196 FROM waterway.sounding_results
197 GROUP BY bottleneck_id
198 ORDER BY bottleneck_id DESC) AS srl
199 ON b.bottleneck_id = srl.bottleneck_id
200 WHERE b.validity @> current_timestamp
201 $$),
202 ('waterway', 'bottleneck_overview', 4326, $$
203 SELECT
204 objnam AS name,
205 ST_Centroid(area)::Geometry(POINT, 4326) AS point,
206 (lower(stretch)).hectometre AS from,
207 (upper(stretch)).hectometre AS to,
208 sr.current::text,
209 responsible_country
210 FROM waterway.bottlenecks bn LEFT JOIN (
211 SELECT bottleneck_id, max(date_info) AS current
212 FROM waterway.sounding_results
213 GROUP BY bottleneck_id) sr
214 ON sr.bottleneck_id = bn.bottleneck_id
215 WHERE bn.validity @> current_timestamp
216 ORDER BY objnam
217 $$),
218 ('waterway', 'sounding_differences', 4326, $$
219 SELECT
220 sd.id AS id,
221 bn.objnam AS objnam,
222 srm.date_info AS minuend,
223 srs.date_info AS subtrahend,
224 sdcl.height AS height,
225 CAST(sdcl.lines AS geometry(multilinestring, 4326)) AS lines
226 FROM caching.sounding_differences sd
227 JOIN caching.sounding_differences_contour_lines sdcl
228 ON sd.id = sdcl.sounding_differences_id
229 JOIN waterway.sounding_results srm
230 ON sd.minuend = srm.id
231 JOIN waterway.sounding_results srs
232 ON sd.subtrahend = srs.id
233 JOIN waterway.bottlenecks bn
234 ON srm.bottleneck_id = bn.bottleneck_id
235 AND srm.date_info::timestamptz <@ bn.validity
236 $$)
237 ON CONFLICT (schema, name) DO UPDATE SET
238 srid = EXCLUDED.srid,
239 view_def = EXCLUDED.view_def;
240
241 DROP VIEW
242 waterway.gauges_base_view,
243 waterway.gauges_geoserver,
244 waterway.distance_marks_geoserver,
245 waterway.distance_marks_ashore_geoserver,
246 waterway.bottlenecks_geoserver,
247 waterway.stretches_geoserver,
248 waterway.sections_geoserver,
249 waterway.sounding_results_contour_lines_geoserver,
250 waterway.bottleneck_overview,
251 waterway.sounding_differences;