source: trunk/data/konvert/trigger_unique_id.sql @ 159

Revision 122, 1.5 KB checked in by ralf.suhr, 12 years ago (diff)

allgemeiner Trigger für alle Tabellen außer alkis_beziehungen für Eindeutigkeit (gml_id,beginnt,endet)

RevLine 
[121]1-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2--
3-- unique_id - Eindeutigkeit von "gml_id", "beginnt" und "endet"
[122]4--             sicherstellen und Historie auf Basis der "gml_id" pflegen
5--           - allgemeiner Trigger fÃŒr alle Tabellen außer "alkis_beziehungen"
[121]6--
7-- Fr. Nov 4 2011 ralf dot suhr at itc-halle dot de
8--
9-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10
11
12SET client_encoding = 'UTF-8';
13
14
15CREATE OR REPLACE FUNCTION public.unique_id()
16  RETURNS TRIGGER AS
17$$
18DECLARE
19  _test       boolean;
20BEGIN
21
22  IF NEW.gml_id IS NULL THEN
23    RAISE NOTICE 'Leere gml_id in % abgelehnt', TG_RELNAME;
24    RETURN NULL;
25  END IF;
26
27  -- doppelte DatensÀtze vermeiden (auch NBA)
28  FOR _test IN EXECUTE '
29      SELECT TRUE
30      FROM public.' || TG_RELNAME || '
31      WHERE gml_id = ''' || substr(NEW.gml_id, 1 , 16) || ''' AND
32        beginnt = ''' || NEW.beginnt || ''' AND
33        endet IS NULL
34      LIMIT 1' LOOP
35    -- Abarbeitung beenden
36    RETURN NULL;
37  END LOOP;
38
39  -- auf NBA Update testen
40  IF char_length(NEW.gml_id) > 18 THEN
41    NEW.gml_id := substr(NEW.gml_id, 1 , 16);
42    -- abgelaufenen Datensatz markieren (Enddatum setzen)
43    EXECUTE 'UPDATE public.' || TG_RELNAME || ' SET endet = ''' || NEW.beginnt || '''
44      WHERE gml_id = ''' || NEW.gml_id || ''' AND endet IS NULL';
45  END IF;
46
47  -- Lebenszeitintervall nachtragen (ATKIS)
48  IF NEW.beginnt IS NULL THEN
49    NEW.beginnt := NOW()::text;
50  END IF;
51
52  -- alles zurÃŒckgeben
53  RETURN NEW;
54END;
55$$
56LANGUAGE 'plpgsql';
Note: See TracBrowser for help on using the repository browser.