source: trunk/import/alkis-functions.sql @ 330

Revision 330, 19.1 KB checked in by frank.jaeger, 10 years ago (diff)

Umstellung von PostNAS 0.7 auf PostNAS 0.8, ohne Tabelle "alkis_beziehungen".

Line 
1-- alkis-functions.sql - Trigger-Funktionen fÃŒr die FortfÃŒhrung der
2--                       alkis_beziehungen aus EintrÀgen der delete-Tabelle
3
4-- 2013-07-10: Erweiterung zur Verarbeitung der Replace-SÀtze in ALKIS-Beziehungen
5
6-- 2013-12-10:  In der Function "update_fields_beziehungen" den Fall behandeln, dass ein Objekt einer
7--             neuen Beziehung in keiner Tabelle gefunden wird.
8--             Wenn ein einzelnes Objekt fehlt, soll dies keine Auswirkungen auf andere Objekte haben.
9--             FÃŒllen von "zu_typename" auskommentiert.
10
11-- 2014-01-31: Deaktivieren von "update_fields_beziehungen",
12--             statt dessen verwenden der "import_id" um alte Relationen zu identifizieren und zu löschen.
13
14-- 2014-08-27: Angleichung des Datenbank-Schema an die NorBIT-Version.
15--             Die Trigger-Function "delete_feature_kill()" arbeitet falsch, wenn "gml_id" als "character varying" angelegt ist.
16--             Das Format war bisher charachter(16).
17--             Zugriff auf die Spalte gml_id umgestellt von "=" auf "like" um den individuellen Timestamp zu ignorieren.
18
19-- 2014-09-04  Trigger-Funktion "delete_feature_kill()" angepasst: keine Tabelle "alkis_beziehungen" mehr.
20
21-- Table/View/Sequence löschen, wenn vorhanden
22CREATE OR REPLACE FUNCTION alkis_dropobject(t TEXT) RETURNS varchar AS $$
23DECLARE
24        c RECORD;
25        s varchar;
26        r varchar;
27        d varchar;
28        i integer;
29        tn varchar;
30BEGIN
31        r := '';
32        d := '';
33
34        -- drop objects
35        FOR c IN SELECT relkind,relname
36                FROM pg_class
37                JOIN pg_namespace ON pg_class.relnamespace=pg_namespace.oid
38                WHERE pg_namespace.nspname='public' AND pg_class.relname=t
39                ORDER BY relkind
40        LOOP
41                IF c.relkind = 'v' THEN
42                        r := r || d || 'Sicht ' || c.relname || ' gelöscht.';
43                        EXECUTE 'DROP VIEW ' || c.relname || ' CASCADE';
44                ELSIF c.relkind = 'r' THEN
45                        r := r || d || 'Tabelle ' || c.relname || ' gelöscht.';
46                        EXECUTE 'DROP TABLE ' || c.relname || ' CASCADE';
47                ELSIF c.relkind = 'S' THEN
48                        r := r || d || 'Sequenz ' || c.relname || ' gelöscht.';
49                        EXECUTE 'DROP SEQUENCE ' || c.relname;
50                ELSIF c.relkind <> 'i' THEN
51                        r := r || d || 'Typ ' || c.table_type || '.' || c.table_name || ' unerwartet.';
52                END IF;
53                d := E'\n';
54        END LOOP;
55
56        FOR c IN SELECT indexname FROM pg_indexes WHERE schemaname='public' AND indexname=t
57        LOOP
58                r := r || d || 'Index ' || c.indexname || ' gelöscht.';
59                EXECUTE 'DROP INDEX ' || c.indexname;
60                d := E'\n';
61        END LOOP;
62
63        FOR c IN SELECT proname,proargtypes
64                FROM pg_proc
65                JOIN pg_namespace ON pg_proc.pronamespace=pg_namespace.oid
66                WHERE pg_namespace.nspname='public' AND pg_proc.proname=t
67        LOOP
68                r := r || d || 'Funktion ' || c.proname || ' gelöscht.';
69
70                s := 'DROP FUNCTION ' || c.proname || '(';
71                d := '';
72
73                FOR i IN array_lower(c.proargtypes,1)..array_upper(c.proargtypes,1) LOOP
74                        SELECT typname INTO tn FROM pg_type WHERE oid=c.proargtypes[i];
75                        s := s || d || tn;
76                        d := ',';
77                END LOOP;
78
79                s := s || ')';
80
81                EXECUTE s;
82
83                d := E'\n';
84        END LOOP;
85
86        FOR c IN SELECT relname,conname
87                FROM pg_constraint
88                JOIN pg_class ON pg_constraint.conrelid=pg_constraint.oid
89                JOIN pg_namespace ON pg_constraint.connamespace=pg_namespace.oid
90                WHERE pg_namespace.nspname='public' AND pg_constraint.conname=t
91        LOOP
92                r := r || d || 'Constraint ' || c.conname || ' von ' || c.relname || ' gelöscht.';
93                EXECUTE 'ALTER TABLE ' || c.relname || ' DROP CONSTRAINT ' || c.conname;
94                d := E'\n';
95        END LOOP;
96
97        RETURN r;
98END;
99$$ LANGUAGE plpgsql;
100
101-- Alle ALKIS-Tabellen löschen
102SELECT alkis_dropobject('alkis_drop');
103CREATE FUNCTION alkis_drop() RETURNS varchar AS $$
104DECLARE
105        c RECORD;
106        r VARCHAR;
107        d VARCHAR;
108BEGIN
109        r := '';
110        d := '';
111        -- drop tables & views
112        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
113                IF c.table_type = 'VIEW' THEN
114                        r := r || d || 'Sicht ' || c.table_name || ' gelöscht.';
115                        EXECUTE 'DROP VIEW ' || c.table_name || ' CASCADE';
116                ELSIF c.table_type = 'BASE TABLE' THEN
117                        r := r || d || 'Tabelle ' || c.table_name || ' gelöscht.';
118                        EXECUTE 'DROP TABLE ' || c.table_name || ' CASCADE';
119                ELSE
120                        r := r || d || 'Typ ' || c.table_type || '.' || c.table_name || ' unerwartet.';
121                END IF;
122                d := E'\n';
123        END LOOP;
124
125        -- clean geometry_columns
126        DELETE FROM geometry_columns
127                WHERE f_table_schema='public'
128                AND ( substr(f_table_name,1,2) IN ('ax_','ap_','ks_')
129                 OR f_table_name IN ('alkis_beziehungen','delete') );
130
131        RETURN r;
132END;
133$$ LANGUAGE plpgsql;
134
135-- Alle ALKIS-Tabellen leeren
136SELECT alkis_dropobject('alkis_delete');
137CREATE FUNCTION alkis_delete() RETURNS varchar AS $$
138DECLARE
139        c RECORD;
140        r varchar;
141        d varchar;
142BEGIN
143        r := '';
144        d := '';
145
146        -- drop views
147        FOR c IN
148                SELECT table_name
149                FROM information_schema.tables
150                WHERE table_schema='public' AND table_type='BASE TABLE'
151                  AND ( substr(table_name,1,3) IN ('ax_','ap_','ks_')
152                        OR table_name IN ('alkis_beziehungen','delete') )
153        LOOP
154                r := r || d || c.table_name || ' wurde geleert.';
155                EXECUTE 'DELETE FROM '||c.table_name;
156                d := E'\n';
157        END LOOP;
158
159        RETURN r;
160END;
161$$ LANGUAGE plpgsql;
162
163-- Übersicht erzeugen, die alle alkis_beziehungen mit den Typen der beteiligen ALKIS-Objekte versieht
164SELECT alkis_dropobject('alkis_mviews');
165CREATE FUNCTION alkis_mviews() RETURNS varchar AS $$
166DECLARE
167        sql TEXT;
168        delim TEXT;
169        c RECORD;
170BEGIN
171        SELECT alkis_dropobject('vbeziehungen') INTO sql;
172        SELECT alkis_dropobject('vobjekte') INTO sql;
173
174        delim := '';
175        sql := 'CREATE VIEW vobjekte AS ';
176
177        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
178                sql := sql || delim || 'SELECT gml_id,beginnt,''' || c.table_name || ''' AS table_name FROM ' || c.table_name;
179                delim := ' UNION ';
180        END LOOP;
181
182        EXECUTE sql;
183
184        CREATE VIEW vbeziehungen AS
185                SELECT  beziehung_von,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_von) AS typ_von
186                        ,beziehungsart
187                        ,beziehung_zu,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_zu) AS typ_zu
188                FROM alkis_beziehungen;
189
190        RETURN 'ALKIS-Views erzeugt.';
191END;
192$$ LANGUAGE plpgsql;
193
194-- Indizes erzeugen
195SELECT alkis_dropobject('alkis_update_schema');
196CREATE FUNCTION alkis_update_schema() RETURNS varchar AS $$
197DECLARE
198        sql TEXT;
199        c RECORD;
200        i RECORD;
201        n INTEGER;
202BEGIN
203        -- Spalten in delete ergÀnzen
204        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='ignored';
205        IF n=0 THEN
206                ALTER TABLE "delete" ADD ignored BOOLEAN;
207        END IF;
208
209        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='context';
210        IF n=0 THEN
211                ALTER TABLE "delete" ADD context VARCHAR;
212        END IF;
213
214        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='safetoignore';
215        IF n=0 THEN
216                ALTER TABLE "delete" ADD safetoignore VARCHAR;
217        END IF;
218
219        SELECT count(*) INTO n FROM information_schema.columns WHERE table_schema='public' AND table_name='delete' AND column_name='replacedby';
220        IF n=0 THEN
221                ALTER TABLE "delete" ADD replacedBy VARCHAR;
222        END IF;
223
224        -- Spalte identifier ergÀnzen, wo sie fehlt
225        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
226                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)
227                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)
228        LOOP
229                EXECUTE 'ALTER TABLE ' || c.table_name || ' ADD identifier character(44)';
230        END LOOP;
231
232        -- Spalte endet ergÀnzen, wo sie fehlt
233        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
234                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)
235                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)
236        LOOP
237                EXECUTE 'ALTER TABLE ' || c.table_name || ' ADD endet character(20) CHECK (endet>beginnt)';
238        END LOOP;
239
240        -- Lebensdauer-Constraint ergÀnzen
241        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
242                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)
243                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)
244        LOOP
245                SELECT alkis_dropobject(c.table_name||'_lebensdauer');
246                EXECUTE 'ALTER TABLE ' || c.table_name || ' ADD CONSTRAINT ' || c.table_name || '_lebensdauer CHECK (beginnt IS NOT NULL AND endet>beginnt)';
247        END LOOP;
248
249        -- Indizes aktualisieren
250        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
251                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)
252        LOOP
253                -- Vorhandene Indizes droppen (TODO: Löscht auch die SonderfÀlle - entfernen)
254                FOR i IN EXECUTE 'SELECT indexname FROM pg_indexes WHERE NOT indexname LIKE ''%_pk'' AND schemaname=''public'' AND tablename='''||c.table_name||'''' LOOP
255                        EXECUTE 'DROP INDEX ' || i.indexname;
256                END LOOP;
257
258                -- Indizes erzeugen
259                EXECUTE 'CREATE UNIQUE INDEX ' || c.table_name || '_id ON ' || c.table_name || '(gml_id,beginnt)';
260                EXECUTE 'CREATE UNIQUE INDEX ' || c.table_name || '_ident ON ' || c.table_name || '(identifier)';
261                EXECUTE 'CREATE INDEX ' || c.table_name || '_gmlid ON ' || c.table_name || '(gml_id)';
262                EXECUTE 'CREATE INDEX ' || c.table_name || '_beginnt ON ' || c.table_name || '(beginnt)';
263                EXECUTE 'CREATE INDEX ' || c.table_name || '_endet ON ' || c.table_name || '(endet)';
264        END LOOP;
265
266        -- Geometrieindizes aktualisieren
267        FOR c IN SELECT table_name FROM information_schema.columns a WHERE a.column_name='gml_id'
268                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)
269        LOOP
270                EXECUTE 'CREATE INDEX ' || c.table_name || '_geom ON ' || c.table_name || ' USING GIST (wkb_geometry)';
271        END LOOP;
272
273        RETURN 'Schema aktualisiert.';
274END;
275$$ LANGUAGE plpgsql;
276
277-- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Funktionen
278-- (delete_feature_hist oder delete_feature_kill) verlinkt werden, je nachdem ob nur
279-- aktuelle oder auch historische Objekte in der Datenbank gefÃŒhrt werden sollen.
280
281-- Löschsatz verarbeiten (MIT Historie)
282-- context='delete'        => "endet" auf aktuelle Zeit setzen
283-- context='replace'       => "endet" des ersetzten auf "beginnt" des neuen Objekts setzen
284CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$
285DECLARE
286        sql TEXT;
287        gml_id TEXT;
288        endete TEXT;
289        n INTEGER;
290BEGIN
291        NEW.context := lower(NEW.context);
292        gml_id      := substr(NEW.featureid, 1, 16);
293
294        IF NEW.context IS NULL THEN
295                NEW.context := 'delete';
296        END IF;
297
298        IF NEW.context='delete' THEN
299                endete := to_char(CURRENT_TIMESTAMP AT TIME ZONE 'UTC','YYYY-MM-DD"T"HH24:MI:SS"Z"');
300
301        ELSIF NEW.context='replace' THEN
302                NEW.safetoignore := lower(NEW.safetoignore);
303
304                IF NEW.safetoignore IS NULL THEN
305                        RAISE EXCEPTION '%: safeToIgnore nicht gesetzt.', NEW.featureid;
306                ELSIF NEW.safetoignore<>'true' AND NEW.safetoignore<>'false' THEN
307                        RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore;
308                END IF;
309
310                IF NEW.replacedBy IS NULL OR length(NEW.replacedBy)<16 THEN
311                        IF NEW.safetoignore = 'true' THEN
312                                RAISE NOTICE '%: Nachfolger ''%'' nicht richtig gesetzt - ignoriert', NEW.featureid, NEW.replacedBy;
313                                NEW.ignored := true;
314                                RETURN NEW;
315                        ELSE
316                                RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy;
317                        END IF;
318                END IF;
319
320                IF length(NEW.replacedBy)=16 THEN
321                        EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
322                                ' WHERE gml_id=''' || NEW.replacedBy || ''' AND endet IS NULL' ||
323                                ' ORDER BY beginnt DESC LIMIT 1'
324                           INTO endete;
325                ELSE
326                        -- replaceBy mit Timestamp
327                        EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
328                                ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || ''''
329                           INTO endete;
330                        IF endete IS NULL THEN
331                                EXECUTE 'SELECT beginnt FROM ' || NEW.typename ||
332                                        ' WHERE gml_id=''' || substr(NEW.replacedBy,1,16) || ''' AND endet IS NULL' ||
333                                        ' ORDER BY beginnt DESC LIMIT 1'
334                                   INTO endete;
335                        END IF;
336                END IF;
337
338                IF endete IS NULL THEN
339                        IF NEW.safetoignore = 'true' THEN
340                                RAISE NOTICE '%: Nachfolger % nicht gefunden - ignoriert', NEW.featureid, NEW.replacedBy;
341                                NEW.ignored := true;
342                                RETURN NEW;
343                        ELSE
344                                RAISE EXCEPTION '%: Nachfolger % nicht gefunden', NEW.featureid, NEW.replacedBy;
345                        END IF;
346                END IF;
347        ELSE
348                RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context;
349        END IF;
350
351        sql     := 'UPDATE ' || NEW.typename
352                || ' SET endet=''' || endete || ''''
353                || ' WHERE gml_id=''' || gml_id || ''''
354                || ' AND endet IS NULL'
355                || ' AND beginnt<''' || endete || '''';
356        -- RAISE NOTICE 'SQL: %', sql;
357        EXECUTE sql;
358        GET DIAGNOSTICS n = ROW_COUNT;
359        IF n<>1 THEN
360                RAISE NOTICE 'SQL: %', sql;
361                IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN
362                        RAISE NOTICE '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - ignoriert', NEW.featureid, n, endete;
363                        NEW.ignored := true;
364                        RETURN NEW;
365                ELSE
366                        RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - Abbruch', NEW.featureid, n, endete;
367                END IF;
368        END IF;
369
370        NEW.ignored := false;
371        RETURN NEW;
372END;
373$$ LANGUAGE plpgsql;
374
375-- "delete" und "replace" verarbeiten (OHNE Historie). Historische Objekte werden sofort gelöscht.
376-- Geaendert 2014-02-03 auf Vorschlag M.B. Krs. Unna
377
378-- 2014-08-27: Anpassung an vereinheitlichtes Datenbank-Schema.
379-- Wenn die Spalte gml_id im Format "character varying" (ohne LÀngenbegrenzung) angelegt wird,
380-- muss gezielt der ID-Teil vor dem Timestamp angesprochen werden.
381-- Zugriff auf die Spalte gml_id umgestellt von "=" auf "like".
382CREATE OR REPLACE FUNCTION delete_feature_kill_vers07() RETURNS TRIGGER AS $$
383DECLARE
384        begsql TEXT;
385        aktbeg TEXT;
386        gml_id TEXT;
387BEGIN
388        NEW.typename := lower(NEW.typename); -- Objektart = Tabellen-Name
389        NEW.context := lower(NEW.context);   -- Operation 'delete', 'replace' oder 'update'
390        gml_id      := substr(NEW.featureid, 1, 16); -- ID-Teil der gml_id, ggf. anhÀngender Timestamp abgeschnitten
391
392        IF NEW.context IS NULL THEN
393                NEW.context := 'delete'; -- default
394        END IF;
395
396        IF NEW.context='delete' THEN -- ersatzloses Löschen des Objektes
397
398          -- In der Objekt-Tabelle
399                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%''';
400 
401         -- Beziehungen von und zu dem Objekt sind hinfaellig (zukÃŒnftig entfallend)
402                EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' OR beziehung_zu = ''' || gml_id || '''';
403
404                --RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename;
405
406        ELSE -- Ersetzen eines Objektes (Replace). In der Objekt-Tabelle sind jetzt bereits 2 Objekte vorhanden (alt und neu).
407
408                -- beginnt-Wert des aktuellen Objektes ermitteln
409                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL';
410                EXECUTE begsql INTO aktbeg;
411
412                -- Alte Objekte entfernen
413                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'' AND beginnt < ''' || aktbeg || '''';
414
415                -- Beziehungen des alten Objektes entfernen, die aus frÃŒheren Importen stammen
416                EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von like ''' || gml_id || '%'' AND import_id < (SELECT max(id) FROM import)';
417
418        END IF;
419
420        NEW.ignored := false;
421        RETURN NEW;
422END;
423$$ LANGUAGE plpgsql;
424
425-- 2014-09-04: Version 0.8 ohne "alkis_beziehungen"-Tabelle
426CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$
427DECLARE
428        begsql TEXT;
429        aktbeg TEXT;
430        gml_id TEXT;
431BEGIN
432        NEW.typename := lower(NEW.typename); -- Objektart=Tabellen-Name
433        NEW.context := lower(NEW.context);   -- Operation 'delete'/'replace'/'update'
434        gml_id      := substr(NEW.featureid, 1, 16); -- ID-Teil der gml_id, ohne Timestamp
435
436        IF NEW.context IS NULL THEN
437                NEW.context := 'delete'; -- default
438        END IF;
439        IF NEW.context='delete' THEN -- Löschen des Objektes
440          -- In der Objekt-Tabelle
441                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%''';
442                --RAISE NOTICE 'Lösche gml_id % in %', gml_id, NEW.typename;
443        ELSE -- Ersetzen des Objektes (Replace). In der Objekt-Tabelle sind jetzt bereits 2 Objekte vorhanden (alt und neu).
444
445                -- beginnt-Wert des aktuellen Objektes ermitteln
446                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL';
447                EXECUTE begsql INTO aktbeg;
448
449                -- Alte Objekte entfernen
450                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'' AND beginnt < ''' || aktbeg || '''';
451
452        END IF;
453
454        NEW.ignored := false;
455        RETURN NEW;
456END;
457$$ LANGUAGE plpgsql;
458
459
460-- BeziehungssÀtze aufrÀumen
461CREATE OR REPLACE FUNCTION alkis_beziehung_inserted() RETURNS TRIGGER AS $$
462BEGIN
463        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;
464        RETURN NEW;
465END;
466$$ LANGUAGE plpgsql;
467
468
469-- Wenn die Datenbank MIT Historie angelegt wurde, kann nach dem Laden hiermit aufgerÀumt werden.
470CREATE OR REPLACE FUNCTION alkis_delete_all_endet() RETURNS void AS $$
471DECLARE
472        c RECORD;
473BEGIN
474        -- In allen Tabellen die Objekte löschen, die ein Ende-Datum haben
475        FOR c IN
476                SELECT table_name
477                 FROM information_schema.columns a
478                WHERE a.column_name='endet'
479            AND a.is_updatable='YES' -- keine Views, die endet-Spalte haben
480                ORDER BY table_name
481        LOOP
482                EXECUTE 'DELETE FROM ' || c.table_name || ' WHERE NOT endet IS NULL';
483                -- RAISE NOTICE 'Lösche ''endet'' in: %', c.table_name;
484        END LOOP;
485END;
486$$ LANGUAGE plpgsql;
487
488
489-- Wenn die Datenbank ohne Historie gefÃŒhrt wird, ist das Feld "identifier" verzichtbar.
490-- Diese wird nur von der Trigger-Version fÃŒr die Version MIT Historie verwendet.
491-- Es kann aus allen Tabellen entfernt werden.
492CREATE OR REPLACE FUNCTION alkis_drop_all_identifier() RETURNS void AS $$
493DECLARE
494        c RECORD;
495BEGIN
496        FOR c IN
497                SELECT table_name
498                FROM information_schema.columns a
499                WHERE a.column_name='identifier'
500                ORDER BY table_name
501        LOOP
502                EXECUTE 'ALTER TABLE ' || c.table_name || ' DROP COLUMN identifier';
503                RAISE NOTICE 'Entferne ''identifier'' aus: %', c.table_name;
504        END LOOP;
505END;
506$$ LANGUAGE plpgsql;
507
508
509-- Funktion zum Ermitteln der letzten import_id
510CREATE OR REPLACE FUNCTION get_import_id() RETURNS TRIGGER AS $$
511BEGIN
512        EXECUTE 'SELECT max(id) FROM import' INTO NEW.import_id;
513        RETURN NEW;
514END;
515$$ LANGUAGE plpgsql;
Note: See TracBrowser for help on using the repository browser.