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

Revision 211, 18.4 KB checked in by j.e.fischer, 11 years ago (diff)

Verbesserungen am Löschtrigger

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        s TEXT;
276        alt_id TEXT;
277        neu_id TEXT;
278        beginnt TEXT;
279        endete TEXT;
280        n INTEGER;
281BEGIN
282        NEW.context := lower(NEW.context);
283        IF NEW.context IS NULL THEN
284                NEW.context := 'delete';
285        END IF;
286
287        -- TIMESTAMP weder in gml_id noch identifier verlÀßlich.
288        -- also ggf. aus Datenbank holen
289
290        IF length(NEW.featureid)=32 THEN
291                alt_id  := substr(NEW.featureid, 1, 16);
292
293                IF NEW.featureid<>NEW.replacedBy THEN
294                        -- Beginnt-Datum aus Timestamp
295                        beginnt := substr(NEW.featureid, 17, 4) || '-'
296                                || substr(NEW.featureid, 21, 2) || '-'
297                                || substr(NEW.featureid, 23, 2) || 'T'
298                                || substr(NEW.featureid, 26, 2) || ':'
299                                || substr(NEW.featureid, 28, 2) || ':'
300                                || substr(NEW.featureid, 30, 2) || 'Z'
301                                ;
302                END IF;
303        ELSIF length(NEW.featureid)=16 THEN
304                alt_id  := NEW.featureid;
305        ELSE
306                RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.featureid, length(NEW.featureid);
307        END IF;
308
309        IF beginnt IS NULL THEN
310                -- Beginnt-Datum des Àltesten Eintrag, der nicht untergegangen ist
311                -- => der Satz dessen 'endet' gesetzt werden muß
312                EXECUTE 'SELECT min(beginnt) FROM ' || NEW.typename
313                        || ' WHERE gml_id=''' || alt_id || ''''
314                        || ' AND endet IS NULL'
315                        INTO beginnt;
316        END IF;
317
318        IF beginnt IS NULL THEN
319                IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN
320                        RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden - ignoriert.', alt_id;
321                        NEW.ignored := true;
322                        RETURN NEW;
323                ELSE
324                        RAISE EXCEPTION 'Kein Beginndatum fuer Objekt % gefunden.', alt_id;
325                END IF;
326        END IF;
327
328        IF NEW.context='delete' THEN
329                endete := to_char(CURRENT_TIMESTAMP AT TIME ZONE 'UTC','YYYY-MM-DD"T"HH24:MI:SS"Z"');
330
331        ELSIF NEW.context='replace' THEN
332                NEW.safetoignore := lower(NEW.safetoignore);
333
334                IF NEW.safetoignore IS NULL THEN
335                        RAISE EXCEPTION '%: safeToIgnore nicht gesetzt.', NEW.featureid;
336                ELSIF NEW.safetoignore<>'true' AND NEW.safetoignore<>'false' THEN
337                        RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore;
338                END IF;
339
340                IF length(NEW.replacedBy)=32 THEN
341                        -- Beginnt-Datum aus Timestamp
342                        neu_id := substr(NEW.replacedBy, 1, 16);
343
344                        IF NEW.featureid<>NEW.replacedBy THEN
345                                endete  := substr(NEW.replacedBy, 17, 4) || '-'
346                                        || substr(NEW.replacedBy, 21, 2) || '-'
347                                        || substr(NEW.replacedBy, 23, 2) || 'T'
348                                        || substr(NEW.replacedBy, 26, 2) || ':'
349                                        || substr(NEW.replacedBy, 28, 2) || ':'
350                                        || substr(NEW.replacedBy, 30, 2) || 'Z'
351                                        ;
352                        END IF;
353                ELSIF length(NEW.replacedBy)=16 THEN
354                        neu_id  := NEW.replacedBy;
355                ELSIF length(NEW.replacedBy)<>16 THEN
356                        RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.replacedBy, length(NEW.replacedBy);
357                END IF;
358
359                IF endete IS NULL THEN
360                        -- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist
361                        -- => Enddatum fÃŒr vorherigen Satz
362                        EXECUTE 'SELECT max(beginnt) FROM ' || NEW.typename
363                                || ' WHERE gml_id=''' || neu_id || ''''
364                                || ' AND beginnt>''' || beginnt || ''''
365                                || ' AND endet IS NULL'
366                                INTO endete;
367                END IF;
368
369                IF alt_id<>neu_id THEN
370                        RAISE NOTICE 'Objekt % wird durch Objekt % ersetzt.', alt_id, neu_id;
371                END IF;
372
373                IF endete IS NULL THEN
374                        RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden.', neu_id;
375                END IF;
376
377                IF endete IS NULL OR beginnt=endete THEN
378                        RAISE EXCEPTION 'Objekt % wird durch Objekt % ersetzt (leere Lebensdauer?).', alt_id, neu_id;
379                END IF;
380        ELSE
381                RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context;
382        END IF;
383
384        s   := 'UPDATE ' || NEW.typename
385            || ' SET endet=''' || endete || ''''
386            || ' WHERE gml_id=''' || alt_id || ''''
387            || ' AND beginnt=''' || beginnt || ''''
388            || ' AND endet IS NULL';
389        EXECUTE s;
390        GET DIAGNOSTICS n = ROW_COUNT;
391        IF n<>1 THEN
392                RAISE NOTICE 'SQL: %', s;
393                IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN
394                        RAISE NOTICE '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - ignoriert', NEW.featureid, n, endete;
395                        NEW.ignored := true;
396                        RETURN NEW;
397                ELSIF n=0 THEN
398                        EXECUTE 'SELECT endet FROM ' || NEW.typename ||
399                                ' WHERE gml_id=''' || alt_id || '''' ||
400                                ' AND beginnt=''' || beginnt || ''''
401                                INTO endete;
402
403                        IF NOT endete IS NULL THEN
404                                RAISE NOTICE '%: Objekt bereits % untergegangen - ignoriert', NEW.featureid, endete;
405                        ELSE
406                                RAISE NOTICE '%: Objekt nicht gefunden - ignoriert', NEW.featureid;
407                        END IF;
408
409                        NEW.ignored := true;
410                        RETURN NEW;
411                ELSE
412                        RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - Abbruch', NEW.featureid, n, endete;
413                END IF;
414        END IF;
415
416        NEW.ignored := false;
417        RETURN NEW;
418END;
419$$ LANGUAGE plpgsql;
420
421
422-- Löschsatz verarbeiten (OHNE Historie)
423-- historische Objekte werden sofort gelöscht.
424-- Siehe Mail W. Jacobs vom 23.03.2012 in PostNAS-Mailingliste
425-- geaendert krz FJ 2012-10-31
426CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$
427DECLARE
428        query TEXT;
429        begsql TEXT;
430        aktbeg TEXT;
431        gml_id TEXT;
432BEGIN
433        NEW.typename := lower(NEW.typename);
434        NEW.context := lower(NEW.context);
435        gml_id      := substr(NEW.featureid, 1, 16);
436
437        IF NEW.context IS NULL THEN
438                NEW.context := 'delete';
439        END IF;
440
441        IF NEW.context='delete' THEN
442                -- ersatzloses Loeschen eines Objektes
443
444                query := 'DELETE FROM ' || NEW.typename
445                        || ' WHERE gml_id = ''' || gml_id || '''';
446                EXECUTE query;
447
448                query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id
449                        || ''' OR beziehung_zu = ''' || gml_id || '''';
450                EXECUTE query;
451                RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename;
452
453        ELSE
454                -- Ersetzen eines Objektes
455                -- In der objekt-Tabelle sind bereits 2 Objekte vorhanden (alt und neu).
456                -- Die 2 DatensÀtze unterscheiden sich nur in ogc_fid und beginnt
457
458                -- beginnt-Wert des aktuellen Objektes ermitteln
459                -- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(NEW.replacedBy, 1, 16);
460                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id = ''' || substr(NEW.replacedBy, 1, 16) || ''' AND endet IS NULL';
461                EXECUTE begsql INTO aktbeg;
462
463                -- Nur alte Objekte entfernen
464                query := 'DELETE FROM ' || NEW.typename
465                        || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || '''';
466                EXECUTE query;
467
468                -- Tabelle alkis_beziehungen
469                IF gml_id = substr(NEW.replacedBy, 1, 16) THEN -- gml_id gleich
470                        -- Beziehungen des Objektes wurden redundant noch einmal eingetragen
471                        -- ToDo:         HIER sofort die Redundanzen zum aktuellen Objekt beseitigen.
472                        -- Workaround: Nach der Konvertierung werden im Post-Processing
473                        --             ALLE Redundanzen mit einem SQL-Statemant beseitigt.
474                --      RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, NEW.typename;
475
476                -- ENTWURF ungetestet:
477                --query := 'DELETE FROM alkis_beziehungen AS bezalt
478                --      WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||')
479                --      AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu
480                --              WHERE bezalt.beziehung_von = bezneu.beziehung_von
481                --              AND bezalt.beziehung_zu = bezneu.beziehung_zu
482                --              AND bezalt.beziehungsart = bezneu.beziehungsart
483                --              AND bezalt.ogc_fid < bezneu.ogc_fid);'
484                --EXECUTE query;
485
486                ELSE
487                        -- replace mit ungleicher gml_id
488                        -- Falls dies vorkommt, die Function erweitern
489                        RAISE EXCEPTION '%: neue gml_id % bei Replace in %. alkis_beziehungen muss aktualisiert werden!', gml_id, NEW.replacedBy, NEW.typename;
490                END IF;
491        END IF;
492
493        NEW.ignored := false;
494        RETURN NEW;
495END;
496$$ LANGUAGE plpgsql;
497
498-- BeziehungssÀtze aufrÀumen
499CREATE OR REPLACE FUNCTION alkis_beziehung_inserted() RETURNS TRIGGER AS $$
500BEGIN
501        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;
502        RETURN NEW;
503END;
504$$ LANGUAGE plpgsql;
505
506-- Wenn die Datenbank MIT Historie angelegt wurde, kann nach dem Laden hiermit aufgerÀumt werden.
507CREATE OR REPLACE FUNCTION alkis_delete_all_endet() RETURNS void AS $$
508DECLARE
509        c RECORD;
510BEGIN
511        -- In allen Tabellen die Objekte löschen, die ein Ende-Datum haben
512        FOR c IN
513                SELECT table_name
514                FROM information_schema.columns a
515                WHERE a.column_name='endet'
516                ORDER BY table_name
517        LOOP
518                EXECUTE 'DELETE FROM ' || c.table_name || ' WHERE NOT endet IS NULL';
519                -- RAISE NOTICE 'Lösche ''endet'' in: %', c.table_name;
520        END LOOP;
521END;
522$$ LANGUAGE plpgsql;
Note: See TracBrowser for help on using the repository browser.