Ignore:
Timestamp:
10/31/12 16:46:53 (11 years ago)
Author:
frank.jaeger
Message:

Trigger fuer NAS-Replace-Sätze repariert (Quick 'n Dirty).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql

    r178 r183  
    3838--                Typ 'GEOMETRY' bei Tabellen: AX_WegPfadSteig, AX_UntergeordnetesGewaesser 
    3939 
     40-- 2012-10-31 FJ  Trigger fuer NAS-Replace-Saetze repariert:  
     41--                siehe: FUNCTION delete_feature_kill()  
     42--                ax_historischesflurstueck.buchungsart ist Text nicht integer. 
     43 
    4044--  VERSIONS-NUMMER: 
    4145 
    42 --  Dies Schema kann nicht mehr mit der installierbaren gdal-Version 1.9 verwendet werden. 
     46--  Dies Schema kann NICHT mehr mit der installierbaren gdal-Version 1.9 verwendet werden. 
    4347--  Derzeit muss ogr2ogr (gdal) aus den Quellen compiliert werden, die o.g. Patch enthalten. 
    4448--  WeiterfÃŒhrung dieses Zweiges als PostNAS 0.7 
     
    267271                END IF; 
    268272 
     273                -- Das beginn-Datum des neuen Objektes ermitteln, der Satz ist kurz zuvor eingefuegt worden 
     274 
     275                -- Variante 1 funktioniert, wenn gml_id auch einen Timestamp enthaelt 
    269276                sql := 'SELECT beginnt FROM ' || NEW.typename || ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || ''''; 
    270277                -- RAISE NOTICE 'SQL: %', sql;  
    271                  
    272                 -- FEHLER: identifier enthÀlt nur gml_id, aber nicht den Timestamp dahinter 
    273                 --         Daher wird das zu ersetzende Obejkt nicht gefunden 
    274                  
    275278                EXECUTE sql INTO endete; 
    276279 
    277 /* 
    278280                IF endete IS NULL AND length(NEW.replacedBy)>16 THEN 
    279                         RAISE NOTICE '%: Nachfolger % nicht gefunden - versuche ''%''', NEW.featureid, substr(NEW.replacedBy, 1, 16); 
     281                        RAISE NOTICE '%: Nachfolger % nicht gefunden - versuche ''%''', NEW.featureid, NEW.replacedBy, substr(NEW.replacedBy, 1, 16); 
    280282                        sql := 'SELECT beginnt FROM ' || NEW.typename 
    281283                            || ' WHERE gml_id=''' || substr(NEW.replacedBy, 1, 16) || '''' 
     
    284286                        EXECUTE sql INTO endete; 
    285287                END IF; 
    286  */ 
    287288 
    288289                IF endete IS NULL THEN 
     
    296297                END IF; 
    297298 
    298                 -- RAISE NOTICE '%: Nachfolgeobjekt beginnt um %.', NEW.featureid, endete; 
     299                RAISE NOTICE '%: Nachfolgeobjekt beginnt um %.', NEW.featureid, endete; 
    299300        ELSE 
    300301                RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context; 
    301302        END IF; 
    302303 
     304        -- mit dem zuvor ermittelten Beginn-Datum des replace-Objektes das alte Objekt historisieren 
    303305        sql := 'UPDATE ' || NEW.typename 
    304306                || ' SET endet=''' || endete || '''' 
    305307                || ' WHERE (identifier=''urn:adv:oid:' || NEW.featureid || ''' OR identifier=''urn:adv:oid:' || gml_id || ''')' 
    306308                || ' AND endet IS NULL'; 
    307         -- RAISE NOTICE 'SQL: %', sql;  
     309                RAISE NOTICE 'SQL: %', sql;  
    308310        EXECUTE sql; 
    309311        GET DIAGNOSTICS n = ROW_COUNT; 
     
    328330-- historische Objekte werden sofort gelöscht. 
    329331-- Siehe Mail W. Jacobs vom 23.03.2012 in PostNAS-Mailingliste 
     332-- geaendert krz FJ 2012-10-31 
    330333CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 
    331334DECLARE 
    332335        query TEXT; 
     336        begsql TEXT; 
     337        aktbeg TEXT; 
    333338        gml_id TEXT; 
    334339BEGIN 
     
    342347 
    343348        IF NEW.context='delete' THEN 
    344                 query := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || ''''; 
     349                -- ersatzloses Loeschen eines Objektes 
     350 
     351                -- Tabelle der Objekt-Art 
     352                query := 'DELETE FROM ' || NEW.typename  
     353                        || ' WHERE gml_id = ''' || gml_id || ''''; 
    345354                EXECUTE query; 
    346355 
    347                 query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' OR beziehung_zu = ''' || gml_id || ''''; 
     356                -- Tabelle alkis_beziehungen 
     357                query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id  
     358                        || ''' OR beziehung_zu = ''' || gml_id || ''''; 
    348359                EXECUTE query; 
     360                RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename; 
     361 
    349362        ELSE 
    350                 -- replace 
    351                 query := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || ''''; 
     363                -- Ersetzen eines Objektes 
     364                -- In der objekt-Tabelle sind bereits 2 Objekte vorhanden (alt und neu). 
     365                -- Die 2 DatensÀtze unterscheiden sich nur in ogc_fid und beginnt 
     366 
     367                -- beginnt-Wert des aktuellen Objektes ermitteln  
     368                -- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(NEW.replacedBy, 1, 16); 
     369                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id = ''' || substr(NEW.replacedBy, 1, 16) || ''' AND endet IS NULL'; 
     370                EXECUTE begsql INTO aktbeg; 
     371 
     372                -- Nur alte Objekte entfernen 
     373                query := 'DELETE FROM ' || NEW.typename  
     374                        || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || ''''; 
    352375                EXECUTE query; 
    353                 -- alkis_beziehungen bleibt so 
     376 
     377                -- Tabelle alkis_beziehungen 
     378                IF gml_id = substr(NEW.replacedBy, 1, 16) THEN -- gml_id gleich 
     379                        -- Beziehungen des Objektes wurden redundant noch einmal eingetragen 
     380                        -- ToDo:         HIER sofort die Redundanzen zum aktuellen Objekt beseitigen. 
     381                        -- Work-Arround: Nach der Konvertierung werden im Post-Processing  
     382                        --               ALLE Redundanzen mit einem SQL-Statemant beseitigt. 
     383                --      RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, NEW.typename; 
     384 
     385                -- ENTWURF ungetestet: 
     386                --query := 'DELETE FROM alkis_beziehungen AS bezalt  
     387                --      WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||') 
     388                --      AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu  
     389                --              WHERE bezalt.beziehung_von = bezneu.beziehung_von  
     390                --              AND bezalt.beziehung_zu = bezneu.beziehung_zu 
     391                --              AND bezalt.beziehungsart = bezneu.beziehungsart 
     392                --              AND bezalt.ogc_fid < bezneu.ogc_fid);' 
     393                --EXECUTE query; 
     394 
     395                ELSE 
     396                        -- replace mit ungleicher gml_id 
     397                        -- Falls dies vorkommt, die Function erweitern 
     398                        RAISE EXCEPTION '%: neue gml_id % bei Replace in %. alkis_beziehungen muss aktualisiert werden!', gml_id, NEW.replacedBy, NEW.typename; 
     399                END IF; 
    354400        END IF; 
    355401 
     
    361407-- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Functions (_hist oder _kill) verlinkt werden,  
    362408-- je nachdem ob nur aktuelle oder auch historische Objekte in der Datenbank gefÃŒhrt werden sollen. 
    363  
    364409 
    365410-- Wenn die Datenbank MIT Historie angelegt wurde, aber eigentlich stört die nur. 
     
    377422        LOOP 
    378423                EXECUTE 'DELETE FROM ' || c.table_name || ' WHERE NOT endet IS NULL'; 
    379                 RAISE NOTICE 'Lösche ended in: %', c.table_name; 
     424                -- RAISE NOTICE 'Lösche ended in: %', c.table_name; 
    380425        END LOOP; 
    381426END; 
     
    383428 
    384429 
    385 -- Alle Tabellen löschen 
    386 -- SELECT alkis_drop(); 
     430-- Alle Tabellen löschen: 
     431--  SELECT alkis_drop(); 
    387432 
    388433 
     
    844889        nachfolgerflurstueckskennzeichen        varchar[], 
    845890        blattart                        integer, 
    846         buchungsart                     integer, 
     891        --buchungsart                   integer,  -- Aenderung krz FJ 2012-10-31: Meldung aus Konverter 
     892        buchungsart                     varchar, 
    847893        buchungsblattkennzeichen        double precision, 
    848894        bezirk                          integer, 
     
    12831329--  beziehtSichAufFlurstueck  --> AX_Flurstueck 
    12841330 
     1331 
     1332-- BEGIN - Nur fuer Test-Zwecke 
     1333 CREATE OR REPLACE FUNCTION info_flurstueck() RETURNS TRIGGER AS $$ 
     1334 BEGIN 
     1335        RAISE NOTICE 'Insert Flurstueck %', NEW.gml_id; 
     1336        RETURN NEW; 
     1337 END; 
     1338 $$ LANGUAGE plpgsql; 
     1339 
     1340-- CREATE TRIGGER neues_fs_trigger 
     1341--        BEFORE INSERT ON ax_flurstueck  
     1342--        FOR EACH ROW  
     1343--           EXECUTE PROCEDURE info_flurstueck(); 
     1344 
     1345-- ENDE - Nur fuer Test-Zwecke 
    12851346 
    12861347 
Note: See TracChangeset for help on using the changeset viewer.