source: Version-0.8/import/alkis-functions.sql @ 326

Revision 326, 17.7 KB checked in by frank.jaeger, 10 years ago (diff)

laufende Arbeiten um Tabelle "alkis_beziehungen" aus den Views zu entfernen

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