source: trunk/data/konvert/postnas_0.7/alkis-functions.sql @ 192

Revision 192, 16.8 KB checked in by j.e.fischer, 7 years ago (diff)

ALKIS-Schema:

  • alkis_beziehungen vorgezogen (wird in alkis-trigger-hist.sql mit TRIGGER versehen)
  • Ergänzt: ax_soll, ax_tagesabschnitt, ax_forstrecht, ax_einrichtungenfuerdenschiffsverkehr, ax_seilbahnschwebebahn, ax_schifffahrtsliniefaehrverkehr ax_wasserspiegelhoehe, ax_hoehleneingang, ax_duene, ax_hoehenlinie
  • Ergänzt: ax_gebaeudeausgestaltung.stelle: varchar=>varchar[](
  • Korrigiert: ax_sicherungspunkt.gml_id: varchar=>character(16)
  • Ergänzt: ax_anschrift.telefon, .fax
  • Geändert: ax_transportanlage: LINESTRING=>GEOMETRY (enthält auch POINT)
  • Ergänzt: ax_einrichtunginoeffentlichenbereichen.advstandardmodell
  • Geändert: ax_einrichtunginoeffentlichenbereichen: POINT=>GEOMETRY
  • Ergänzt: identifier bei ax_strassenverkehrsanlage & ax_bahnverkehrsanlage
  • Geändert: ax_bahnverkehrsanlage: POINT=>GEOMETRY (enthält auch POLYGON)
  • Geändert: ax_gewaessermerkmal: POINT=>GEOMETRY (enthält auch POINT/LINESTRING/POLYGON)
  • Ergänzt: ax_boeschungkliff.objekthoehe und Primärschüssel
  • Ergänzt: ax_dammwalldeich.funktion
  • Ergänzt: ax_sonstigesrecht.funktion
  • Ergänzt: ax_kleinraeumigerlandschaftsteil.identifier
  • Korrektur: ax_vertretung.identifier: character(28) => character(44)


ALKIS-Funktionen:

  • Korrektur: doppelte Funktion alkis_dropobject entfernt
  • Korrektur: delete_feature_hist (gml_id kann von identifier abweichen)
  • Ergänzt: Funktion alkis_beziehung_inserted ergänzt
Line 
1-- Table/View/Sequence löschen, wenn vorhanden
2CREATE OR REPLACE FUNCTION alkis_dropobject(t TEXT) RETURNS varchar AS $$
3DECLARE
4        c RECORD;
5        s varchar;
6        r varchar;
7        d varchar;
8        i integer;
9        tn varchar;
10BEGIN
11        r := '';
12        d := '';
13
14        -- drop objects
15        FOR c IN SELECT relkind,relname
16                FROM pg_class
17                JOIN pg_namespace ON pg_class.relnamespace=pg_namespace.oid
18                WHERE pg_namespace.nspname='public' AND pg_class.relname=t
19                ORDER BY relkind
20        LOOP
21                IF c.relkind = 'v' THEN
22                        r := r || d || 'Sicht ' || c.relname || ' gelöscht.';
23                        EXECUTE 'DROP VIEW ' || c.relname || ' CASCADE';
24                ELSIF c.relkind = 'r' THEN
25                        r := r || d || 'Tabelle ' || c.relname || ' gelöscht.';
26                        EXECUTE 'DROP TABLE ' || c.relname || ' CASCADE';
27                ELSIF c.relkind = 'S' THEN
28                        r := r || d || 'Sequenz ' || c.relname || ' gelöscht.';
29                        EXECUTE 'DROP SEQUENCE ' || c.relname;
30                ELSIF c.relkind <> 'i' THEN
31                        r := r || d || 'Typ ' || c.table_type || '.' || c.table_name || ' unerwartet.';
32                END IF;
33                d := E'\n';
34        END LOOP;
35
36        FOR c IN SELECT indexname FROM pg_indexes WHERE schemaname='public' AND indexname=t
37        LOOP
38                r := r || d || 'Index ' || c.indexname || ' gelöscht.';
39                EXECUTE 'DROP INDEX ' || c.indexname;
40                d := E'\n';
41        END LOOP;
42
43        FOR c IN SELECT proname,proargtypes
44                FROM pg_proc
45                JOIN pg_namespace ON pg_proc.pronamespace=pg_namespace.oid
46                WHERE pg_namespace.nspname='public' AND pg_proc.proname=t
47        LOOP
48                r := r || d || 'Funktion ' || c.proname || ' gelöscht.';
49
50                s := 'DROP FUNCTION ' || c.proname || '(';
51                d := '';
52
53                FOR i IN array_lower(c.proargtypes,1)..array_upper(c.proargtypes,1) LOOP
54                        SELECT typname INTO tn FROM pg_type WHERE oid=c.proargtypes[i];
55                        s := s || d || tn;
56                        d := ',';
57                END LOOP;
58
59                s := s || ')';
60
61                EXECUTE s;
62
63                d := E'\n';
64        END LOOP;
65
66        FOR c IN SELECT relname,conname
67                FROM pg_constraint
68                JOIN pg_class ON pg_constraint.conrelid=pg_constraint.oid
69                JOIN pg_namespace ON pg_constraint.connamespace=pg_namespace.oid
70                WHERE pg_namespace.nspname='public' AND pg_constraint.conname=t
71        LOOP
72                r := r || d || 'Constraint ' || c.conname || ' von ' || c.relname || ' gelöscht.';
73                EXECUTE 'ALTER TABLE ' || c.relname || ' DROP CONSTRAINT ' || c.conname;
74                d := E'\n';
75        END LOOP;
76
77        RETURN r;
78END;
79$$ LANGUAGE plpgsql;
80
81-- Alle ALKIS-Tabellen löschen
82SELECT alkis_dropobject('alkis_drop');
83CREATE FUNCTION alkis_drop() RETURNS varchar AS $$
84DECLARE
85        c RECORD;
86        r VARCHAR;
87        d VARCHAR;
88BEGIN
89        r := '';
90        d := '';
91        -- drop tables & views
92        FOR c IN SELECT table_type,table_name FROM information_schema.tables WHERE table_schema='public' AND ( substr(table_name,1,3) IN ('ax_','ap_','ks_') OR table_name IN ('alkis_beziehungen','delete')) ORDER BY table_type DESC LOOP
93                IF c.table_type = 'VIEW' THEN
94                        r := r || d || 'Sicht ' || c.table_name || ' gelöscht.';
95                        EXECUTE 'DROP VIEW ' || c.table_name || ' CASCADE';
96                ELSIF c.table_type = 'BASE TABLE' THEN
97                        r := r || d || 'Tabelle ' || c.table_name || ' gelöscht.';
98                        EXECUTE 'DROP TABLE ' || c.table_name || ' CASCADE';
99                ELSE
100                        r := r || d || 'Typ ' || c.table_type || '.' || c.table_name || ' unerwartet.';
101                END IF;
102                d := E'\n';
103        END LOOP;
104
105        -- clean geometry_columns
106        DELETE FROM geometry_columns
107                WHERE f_table_schema='public'
108                AND ( substr(f_table_name,1,2) IN ('ax_','ap_','ks_')
109                 OR f_table_name IN ('alkis_beziehungen','delete') );
110
111        RETURN r;
112END;
113$$ LANGUAGE plpgsql;
114
115-- Alle ALKIS-Tabellen leeren
116SELECT alkis_dropobject('alkis_delete');
117CREATE FUNCTION alkis_delete() RETURNS varchar AS $$
118DECLARE
119        c RECORD;
120        r varchar;
121        d varchar;
122BEGIN
123        r := '';
124        d := '';
125
126        -- drop views
127        FOR c IN
128                SELECT table_name
129                FROM information_schema.tables
130                WHERE table_schema='public' AND table_type='BASE TABLE'
131                  AND ( substr(table_name,1,3) IN ('ax_','ap_','ks_')
132                        OR table_name IN ('alkis_beziehungen','delete') )
133        LOOP
134                r := r || d || c.table_name || ' wurde geleert.';
135                EXECUTE 'DELETE FROM '||c.table_name;
136                d := E'\n';
137        END LOOP;
138
139        RETURN r;
140END;
141$$ LANGUAGE plpgsql;
142
143-- Übersicht erzeugen, die alle alkis_beziehungen mit den Typen der beteiligen ALKIS-Objekte versieht
144SELECT alkis_dropobject('alkis_mviews');
145CREATE FUNCTION alkis_mviews() RETURNS varchar AS $$
146DECLARE
147        sql TEXT;
148        delim TEXT;
149        c RECORD;
150BEGIN
151        SELECT alkis_dropobject('vbeziehungen') INTO sql;
152        SELECT alkis_dropobject('vobjekte') INTO sql;
153
154        delim := '';
155        sql := 'CREATE VIEW vobjekte AS ';
156
157        FOR c IN SELECT table_name FROM information_schema.columns WHERE column_name='gml_id' AND substr(table_name,1,3) IN ('ax_','ap_','ks_') LOOP
158                sql := sql || delim || 'SELECT gml_id,beginnt,''' || c.table_name || ''' AS table_name FROM ' || c.table_name;
159                delim := ' UNION ';
160        END LOOP;
161
162        EXECUTE sql;
163
164--      CREATE UNIQUE INDEX vobjekte_gmlid ON vobjekte(gml_id,beginnt);
165--      CREATE INDEX vobjekte_table ON vobjekte(table_name);
166
167        CREATE VIEW vbeziehungen AS
168                SELECT  beziehung_von,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_von) AS typ_von
169                        ,beziehungsart
170                        ,beziehung_zu,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_zu) AS typ_zu
171                FROM alkis_beziehungen;
172
173--      CREATE INDEX vbeziehungen_von    ON vbeziehungen(beziehung_von);
174--      CREATE INDEX vbeziehungen_vontyp ON vbeziehungen(typ_von);
175--      CREATE INDEX vbeziehungen_art    ON vbeziehungen(beziehungsart);
176--      CREATE INDEX vbeziehungen_zu     ON vbeziehungen(beziehung_zu);
177--      CREATE INDEX vbeziehungen_zutyp  ON vbeziehungen(typ_zu);
178
179        RETURN 'ALKIS-Views erzeugt.';
180END;
181$$ LANGUAGE plpgsql;
182
183-- Indizes erzeugen
184SELECT alkis_dropobject('alkis_update_schema');
185CREATE FUNCTION alkis_update_schema() RETURNS varchar AS $$
186DECLARE
187        sql TEXT;
188        c RECORD;
189        i RECORD;
190        n INTEGER;
191BEGIN
192        -- Spalten in delete ergÀnzen
193        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='ignored';
194        IF n=0 THEN
195                ALTER TABLE "delete" ADD ignored BOOLEAN;
196        END IF;
197
198        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='context';
199        IF n=0 THEN
200                ALTER TABLE "delete" ADD context VARCHAR;
201        END IF;
202
203        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='safetoignore';
204        IF n=0 THEN
205                ALTER TABLE "delete" ADD safetoignore VARCHAR;
206        END IF;
207
208        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='replacedby';
209        IF n=0 THEN
210                ALTER TABLE "delete" ADD replacedBy VARCHAR;
211        END IF;
212
213        -- Spalte identifier ergÀnzen, wo sie fehlt
214        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
215                AND     EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='beginnt'    AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
216                AND NOT EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='identifier' AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
217        LOOP
218                EXECUTE 'ALTER TABLE ' || c.table_name || ' ADD identifier character(44)';
219        END LOOP;
220
221        -- Spalte endet ergÀnzen, wo sie fehlt
222        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
223                AND     EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='beginnt' AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
224                AND NOT EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='endet'   AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
225        LOOP
226                EXECUTE 'ALTER TABLE ' || c.table_name || ' ADD endet character(20) CHECK (endet>beginnt)';
227        END LOOP;
228
229        -- Lebensdauer-Constraint ergÀnzen
230        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
231                AND EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='beginnt' AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
232                AND EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='endet'   AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
233        LOOP
234                SELECT alkis_dropobject(c.table_name||'_lebensdauer');
235                EXECUTE 'ALTER TABLE ' || c.table_name || ' ADD CONSTRAINT ' || c.table_name || '_lebensdauer CHECK (beginnt IS NOT NULL AND endet>beginnt)';
236        END LOOP;
237
238        -- Indizes aktualisieren
239        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
240                AND EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='beginnt' AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
241        LOOP
242                -- Vorhandene Indizes droppen (TODO: Löscht auch die SonderfÀlle - entfernen)
243                FOR i IN EXECUTE 'SELECT indexname FROM pg_indexes WHERE NOT indexname LIKE ''%_pk'' AND schemaname=''public'' AND tablename='''||c.table_name||'''' LOOP
244                        EXECUTE 'DROP INDEX ' || i.indexname;
245                END LOOP;
246
247                -- Indizes erzeugen
248                EXECUTE 'CREATE UNIQUE INDEX ' || c.table_name || '_id ON ' || c.table_name || '(gml_id,beginnt)';
249                EXECUTE 'CREATE UNIQUE INDEX ' || c.table_name || '_ident ON ' || c.table_name || '(identifier)';
250                EXECUTE 'CREATE INDEX ' || c.table_name || '_gmlid ON ' || c.table_name || '(gml_id)';
251                EXECUTE 'CREATE INDEX ' || c.table_name || '_beginnt ON ' || c.table_name || '(beginnt)';
252                EXECUTE 'CREATE INDEX ' || c.table_name || '_endet ON ' || c.table_name || '(endet)';
253        END LOOP;
254
255        -- Geometrieindizes aktualisieren
256        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
257                AND EXISTS (SELECT * FROM information_schema.columns b WHERE b.column_name='wkb_geometry' AND a.table_catalog=b.table_catalog AND a.table_schema=b.table_schema AND a.table_name=b.table_name)
258        LOOP
259                EXECUTE 'CREATE INDEX ' || c.table_name || '_geom ON ' || c.table_name || ' USING GIST (wkb_geometry)';
260        END LOOP;
261
262        RETURN 'Schema aktualisiert.';
263END;
264$$ LANGUAGE plpgsql;
265
266-- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Funktionen
267-- (delete_feature_hist oder delete_feature_kill) verlinkt werden, je nachdem ob nur
268-- aktuelle oder auch historische Objekte in der Datenbank gefÃŒhrt werden sollen.
269
270-- Löschsatz verarbeiten (MIT Historie)
271-- context='delete'        => "endet" auf aktuelle Zeit setzen
272-- context='replace'       => "endet" des ersetzten auf "beginnt" des neuen Objekts setzen
273CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$
274DECLARE
275        sql TEXT;
276        gml_id TEXT;
277        endete TEXT;
278        n INTEGER;
279BEGIN
280        NEW.context := lower(NEW.context);
281        gml_id      := substr(NEW.featureid, 1, 16);
282
283        IF NEW.context IS NULL THEN
284                NEW.context := 'delete';
285        END IF;
286
287        IF NEW.context='delete' THEN
288                endete := to_char(CURRENT_TIMESTAMP AT TIME ZONE 'UTC','YYYY-MM-DD"T"HH24:MI:SS"Z"');
289
290        ELSIF NEW.context='replace' THEN
291                NEW.safetoignore := lower(NEW.safetoignore);
292
293                IF NEW.safetoignore IS NULL THEN
294                        RAISE EXCEPTION '%: safeToIgnore nicht gesetzt.', NEW.featureid;
295                ELSIF NEW.safetoignore<>'true' AND NEW.safetoignore<>'false' THEN
296                        RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore;
297                END IF;
298
299                IF NEW.replacedBy IS NULL OR length(NEW.replacedBy)<16 THEN
300                        IF NEW.safetoignore = 'true' THEN
301                                RAISE NOTICE '%: Nachfolger ''%'' nicht richtig gesetzt - ignoriert', NEW.featureid, NEW.replacedBy;
302                                NEW.ignored := true;
303                                RETURN NEW;
304                        ELSE
305                                RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy;
306                        END IF;
307                END IF;
308
309                IF length(NEW.replacedBy)=16 THEN
310                        EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
311                                ' WHERE gml_id=''' || NEW.replacedBy || ''' AND endet IS NULL' ||
312                                ' ORDER BY beginnt DESC LIMIT 1'
313                           INTO endete;
314                ELSE
315                        -- replaceBy mit Timestamp
316                        EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
317                                ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || ''''
318                           INTO endete;
319                        IF endete IS NULL THEN
320                                EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
321                                        ' WHERE gml_id=''' || substr(NEW.replacedBy,1,16) || ''' AND endet IS NULL' ||
322                                        ' ORDER BY beginnt DESC LIMIT 1'
323                                   INTO endete;
324                        END IF;
325                END IF;
326
327                IF endete IS NULL THEN
328                        IF NEW.safetoignore = 'true' THEN
329                                RAISE NOTICE '%: Nachfolger % nicht gefunden - ignoriert', NEW.featureid, NEW.replacedBy;
330                                NEW.ignored := true;
331                                RETURN NEW;
332                        ELSE
333                                RAISE EXCEPTION '%: Nachfolger % nicht gefunden', NEW.featureid, NEW.replacedBy;
334                        END IF;
335                END IF;
336        ELSE
337                RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context;
338        END IF;
339
340        sql     := 'UPDATE ' || NEW.typename
341                || ' SET endet=''' || endete || ''''
342                || ' WHERE gml_id=''' || gml_id || ''''
343                || ' AND endet IS NULL'
344                || ' AND beginnt<''' || endete || '''';
345        -- RAISE NOTICE 'SQL: %', sql;
346        EXECUTE sql;
347        GET DIAGNOSTICS n = ROW_COUNT;
348        IF n<>1 THEN
349                RAISE NOTICE 'SQL: %', sql;
350                IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN
351                        RAISE NOTICE '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - ignoriert', NEW.featureid, n, endete;
352                        NEW.ignored := true;
353                        RETURN NEW;
354                ELSE
355                        RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - Abbruch', NEW.featureid, n, endete;
356                END IF;
357        END IF;
358
359        NEW.ignored := false;
360        RETURN NEW;
361END;
362$$ LANGUAGE plpgsql;
363
364
365-- Löschsatz verarbeiten (OHNE Historie)
366-- historische Objekte werden sofort gelöscht.
367-- Siehe Mail W. Jacobs vom 23.03.2012 in PostNAS-Mailingliste
368-- geaendert krz FJ 2012-10-31
369CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$
370DECLARE
371        query TEXT;
372        begsql TEXT;
373        aktbeg TEXT;
374        gml_id TEXT;
375BEGIN
376        NEW.typename := lower(NEW.typename);
377        NEW.context := lower(NEW.context);
378        gml_id      := substr(NEW.featureid, 1, 16);
379
380        IF NEW.context IS NULL THEN
381                NEW.context := 'delete';
382        END IF;
383
384        IF NEW.context='delete' THEN
385                -- ersatzloses Loeschen eines Objektes
386
387                query := 'DELETE FROM ' || NEW.typename
388                        || ' WHERE gml_id = ''' || gml_id || '''';
389                EXECUTE query;
390
391                query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id
392                        || ''' OR beziehung_zu = ''' || gml_id || '''';
393                EXECUTE query;
394                RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename;
395
396        ELSE
397                -- Ersetzen eines Objektes
398                -- In der objekt-Tabelle sind bereits 2 Objekte vorhanden (alt und neu).
399                -- Die 2 DatensÀtze unterscheiden sich nur in ogc_fid und beginnt
400
401                -- beginnt-Wert des aktuellen Objektes ermitteln
402                -- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(NEW.replacedBy, 1, 16);
403                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id = ''' || substr(NEW.replacedBy, 1, 16) || ''' AND endet IS NULL';
404                EXECUTE begsql INTO aktbeg;
405
406                -- Nur alte Objekte entfernen
407                query := 'DELETE FROM ' || NEW.typename
408                        || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || '''';
409                EXECUTE query;
410
411                -- Tabelle alkis_beziehungen
412                IF gml_id = substr(NEW.replacedBy, 1, 16) THEN -- gml_id gleich
413                        -- Beziehungen des Objektes wurden redundant noch einmal eingetragen
414                        -- ToDo:         HIER sofort die Redundanzen zum aktuellen Objekt beseitigen.
415                        -- Workaround: Nach der Konvertierung werden im Post-Processing
416                        --             ALLE Redundanzen mit einem SQL-Statemant beseitigt.
417                --      RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, NEW.typename;
418
419                -- ENTWURF ungetestet:
420                --query := 'DELETE FROM alkis_beziehungen AS bezalt
421                --      WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||')
422                --      AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu
423                --              WHERE bezalt.beziehung_von = bezneu.beziehung_von
424                --              AND bezalt.beziehung_zu = bezneu.beziehung_zu
425                --              AND bezalt.beziehungsart = bezneu.beziehungsart
426                --              AND bezalt.ogc_fid < bezneu.ogc_fid);'
427                --EXECUTE query;
428
429                ELSE
430                        -- replace mit ungleicher gml_id
431                        -- Falls dies vorkommt, die Function erweitern
432                        RAISE EXCEPTION '%: neue gml_id % bei Replace in %. alkis_beziehungen muss aktualisiert werden!', gml_id, NEW.replacedBy, NEW.typename;
433                END IF;
434        END IF;
435
436        NEW.ignored := false;
437        RETURN NEW;
438END;
439$$ LANGUAGE plpgsql;
440
441-- BeziehungssÀtze aufrÀumen
442CREATE OR REPLACE FUNCTION alkis_beziehung_inserted() RETURNS TRIGGER AS $$
443BEGIN
444        DELETE FROM alkis_beziehungen WHERE ogc_fid<NEW.ogc_fid AND beziehung_von=NEW.beziehung_von AND beziehungsart=NEW.beziehungsart AND beziehung_zu=NEW.beziehung_zu;
445        RETURN NEW;
446END;
447$$ LANGUAGE plpgsql;
448
449-- Wenn die Datenbank MIT Historie angelegt wurde, kann nach dem Laden hiermit aufgerÀumt werden.
450CREATE OR REPLACE FUNCTION alkis_delete_all_endet() RETURNS void AS $$
451DECLARE
452        c RECORD;
453BEGIN
454        -- In allen Tabellen die Objekte löschen, die ein Ende-Datum haben
455        FOR c IN
456                SELECT table_name
457                FROM information_schema.columns a
458                WHERE a.column_name='endet'
459                ORDER BY table_name
460        LOOP
461                EXECUTE 'DELETE FROM ' || c.table_name || ' WHERE NOT endet IS NULL';
462                -- RAISE NOTICE 'Lösche ''endet'' in: %', c.table_name;
463        END LOOP;
464END;
465$$ LANGUAGE plpgsql;
Note: See TracBrowser for help on using the repository browser.