Changeset 421


Ignore:
Timestamp:
07/26/19 14:01:57 (4 months ago)
Author:
frank.jaeger
Message:

Trigger-Function "delete_feature_kill()" angepasst für Sonderfall "Modellschwäche ausgleichen" aus ibR-ALKIS.
Bereits vorhandene Objekte werden nochmals mit "replace" ausgeliefert. Dies kann (muss) ignoriert werden.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/import/alkis-functions.sql

    r338 r421  
    3232-- 2014-09-23  FJ: Korrektur "delete_feature_kill()": 
    3333--             Die neue Hist-Version vereinfachen (endet nicht benötigt) und zum Löschen umbauen. 
     34 
     35-- 2019-07-26  FJ: "delete_feature_kill" ÃŒberarbeitet. 
     36--             Der Sonderfall "ModellschwÀche ausgleichen" im ibR-ALKIS wird behandelt: replace fÃŒr bereits vorhandene Objekte ignorieren. 
     37--             16stellig Feature-IDs werden nicht mehr erwartet. 
    3438 
    3539-- Table/View/Sequence löschen, wenn vorhanden 
     
    548552 
    549553 
    550 -- Version ab 2014-09-23 (PostNAS 0.8) 
    551 -- Abwandlung der Hist-Version als Kill-Version. 
    552 -- Die "gml_id" muss in der Datenbank das Format character(16) haben. 
    553 -- Dies kann auch Abgabeart 3100 verarbeiten. Historische Objekte werden aber sofort entfernt. 
     554-- "Kill-Trigger" 
     555-- Historische Objekte werden sofort entfernt und nicht auf "endet" gesetzt. 
     556-- Dies kann auch Abgabeart 3100 verarbeiten.  
    554557CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 
    555558DECLARE 
    556559        n INTEGER; 
    557         vbeginnt TEXT; 
    558         replgml TEXT; 
    559         featgml TEXT; 
     560        featgml TEXT;  -- vorderer Teil von featureid: gml_id ohne Zeit 
     561        vbeginnt TEXT; -- hinterer Teil von featureid: beginnt-Zeit 
    560562        s TEXT; 
    561563BEGIN 
    562         -- Version 2014-09-23, replace fÃŒhrt auch zum Löschen des VorgÀngerobjektes 
     564        -- Trigger-Version 2019-07-22 kompatibel zu "NBA-ModellschwÀche ausgleichen" (ibR) 
    563565        NEW.context := coalesce(lower(NEW.context),'delete'); 
    564566 
    565567        IF NEW.anlass IS NULL THEN 
    566                 NEW.anlass := ''; 
    567         END IF; 
    568         featgml := substr(NEW.featureid, 1, 16); -- gml_id ohne Timestamp 
    569  
    570         IF length(NEW.featureid)=32 THEN 
    571                 -- beginnt-Zeit der zu löschenden Vorgaenger-Version des Objektes 
    572                 vbeginnt := substr(NEW.featureid, 17, 4) || '-' 
    573                         || substr(NEW.featureid, 21, 2) || '-' 
    574                         || substr(NEW.featureid, 23, 2) || 'T' 
    575                         || substr(NEW.featureid, 26, 2) || ':' 
    576                         || substr(NEW.featureid, 28, 2) || ':' 
    577                         || substr(NEW.featureid, 30, 2) || 'Z' ; 
    578         ELSIF length(NEW.featureid)=16 THEN 
    579                 -- Ältestes nicht gelöschtes Objekt 
    580                 EXECUTE 'SELECT min(beginnt) FROM ' || NEW.typename 
    581                         || ' WHERE gml_id=''' || featgml || '''' || ' AND endet IS NULL' 
    582                         INTO vbeginnt; 
    583  
    584                 IF vbeginnt IS NULL THEN 
    585                         RAISE EXCEPTION '%: Keinen Kandidaten zum Löschen gefunden.', NEW.featureid; 
    586                 END IF; 
    587         ELSE 
    588                 RAISE EXCEPTION '%: Identifikator gescheitert.', NEW.featureid; 
    589         END IF; 
    590  
    591         IF NEW.context='delete' THEN 
    592         ELSIF NEW.context='update' THEN 
    593         ELSIF NEW.context='replace' THEN 
     568                NEW.anlass := ARRAY[]::varchar[]; 
     569        END IF; 
     570        IF length(NEW.featureid)<>32 THEN 
     571                RAISE EXCEPTION '%: Identifikator gescheitert. Falsche Laenge.', NEW.featureid; 
     572        END IF; 
     573 
     574        featgml := substr(NEW.featureid, 1, 16); 
     575 
     576        -- beginnt-Zeit der zu löschenden VorgÀnger-Version des Objektes 
     577        vbeginnt := substr(NEW.featureid, 17, 4) || '-' 
     578        || substr(NEW.featureid, 21, 2) || '-' 
     579        || substr(NEW.featureid, 23, 2) || 'T' 
     580        || substr(NEW.featureid, 26, 2) || ':' 
     581        || substr(NEW.featureid, 28, 2) || ':' 
     582        || substr(NEW.featureid, 30, 2) || 'Z'; 
     583 
     584        IF NEW.context='replace' THEN 
    594585                NEW.safetoignore := lower(NEW.safetoignore); 
    595586                IF NEW.safetoignore IS NULL THEN 
     
    598589                        RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore; 
    599590                END IF; 
     591 
     592                IF NEW.replacedby=NEW.featureid THEN 
     593                --      RAISE NOTICE '%: Replace fuer identisches Objekt ausgelassen. Sonderfall Modellschwaeche.', NEW.featureid; 
     594                        NEW.ignored := true; 
     595                --      1. Fall: Die NBA-ModellschwÀche wurde erfolgreich ausgeglichen. Dies Objekt fehlte bisher, es gibt daher keinen VorgÀnger.  
     596                --      2. Fall: Der Insert wurde zuvor von der Datenbank abgelehnt (Unique-Constraint: gml_id, beginnt). Der Delete wÃŒrde daher die EINZIGE Version löschen, nicht den VorgÀnger. 
     597                --      safetoignore ist false, trotzdem ignorieren 
     598                ELSE 
     599                        -- VorgÀnger-ALKIS-Objekt löschen 
     600                        s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ; 
     601                        EXECUTE s; 
     602                        GET DIAGNOSTICS n = ROW_COUNT; 
     603                        IF n=1 THEN 
     604                                NEW.ignored := false; 
     605                        ELSE 
     606                                RAISE NOTICE '%: % schlug fehl ignoriert [%]', NEW.featureid, NEW.context, n; 
     607                                NEW.ignored := true; 
     608                        END IF; 
     609                END IF; 
     610 
     611        ELSIF NEW.context IN ('delete', 'update') THEN 
     612 
     613                -- VorgÀnger-ALKIS-Objekt löschen 
     614                s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ; 
     615                EXECUTE s; 
     616                GET DIAGNOSTICS n = ROW_COUNT; 
     617                IF n=1 THEN 
     618                        NEW.ignored := false; 
     619                ELSE 
     620                        RAISE NOTICE '%: % schlug fehl ignoriert [%]', NEW.featureid, NEW.context, n; 
     621                        NEW.ignored := true; 
     622                END IF; 
     623 
    600624        ELSE 
    601625                RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'', ''replace'' oder ''update'' erwartet).', NEW.featureid, NEW.context; 
    602626        END IF; 
    603627 
    604         -- Vorgaenger ALKIS-Objekt Loeschen 
    605         s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ; 
    606         EXECUTE s; 
    607         GET DIAGNOSTICS n = ROW_COUNT; 
    608         -- RAISE NOTICE 'SQL[%]:%', n, s; 
    609         IF n<>1 THEN 
    610                 RAISE EXCEPTION '%: % schlug fehl [%]', NEW.featureid, NEW.context, n; 
    611                 -- dieser Satz kommt nicht in die delete-Tabelle? 
    612         END IF; 
    613  
    614         NEW.ignored := false; 
    615628        RETURN NEW; 
    616629END; 
Note: See TracChangeset for help on using the changeset viewer.