Changeset 338


Ignore:
Timestamp:
09/26/14 13:23:28 (10 years ago)
Author:
frank.jaeger
Message:

Neuer Trigger ohne Historie. Anzahl Kontext-Operationen in import-Tabelle eintragen.

Location:
trunk/import
Files:
1 added
5 edited

Legend:

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

    r336 r338  
    3030--             mehrerer VorgÀnger- und Nachfolger-Objekte mit und ohne "endet IS NULL" geben. 
    3131 
     32-- 2014-09-23  FJ: Korrektur "delete_feature_kill()": 
     33--             Die neue Hist-Version vereinfachen (endet nicht benötigt) und zum Löschen umbauen. 
    3234 
    3335-- Table/View/Sequence löschen, wenn vorhanden 
     
    380382-- context='replace'       => "endet" des ersetzten auf "beginnt" des neuen Objekts setzen 
    381383-- context='update'        => "endet" auf ÃŒbergebene Zeit setzen und "anlass" festhalten 
     384-- Die "gml_id" muss in der Datenbank das Format character(16) haben. 
    382385CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$ 
    383386DECLARE 
     
    503506 
    504507 
    505 -- 2014-09-04: Version 0.8 ohne "alkis_beziehungen"-Tabelle 
     508-- Version PostNAS 0.8 ohne "alkis_beziehungen"-Tabelle 
    506509-- Unterschied von "delete_feature_kill" zur Version "delete_feature_hist": 
    507 --  Historisch gewordene Objekte werden nicht auf "endet" gesetzt sondern ganz aus der Datenbank gelöscht. 
    508 -- Achtung: Wenn diese Funktion mit dem "delete_feature_trigger" der Tabelle "delete" verknÃŒpft ist, 
    509 -- dann dÃŒrfen nur NAS-NBA-Daten verarbeitet werden, die mit der Abgabeart 1000 erzeugt wurden. 
    510 -- Wenn Daten der Abgabeart 3100 verarbeitet werden kommen update-Anweisungen in den Daten vor,  
    511 -- die dieser Trigger nicht verarbeiten kann. 
    512 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 
     510--  Historisch gewordene Objekte werden nicht auf "endet" gesetzt sondern sofort aus der Datenbank gelöscht. 
     511 
     512-- Version von 2014-09-04 bis 2014-09-23 
     513-- Ohne Tabelle "alkis_beziehungen". 
     514-- Die gml_id kann in der Datenbenk das Format "character varying" haben (angehÀngte Beginn-Zeit). 
     515-- Diese Version kennt den NAS-Kontext "update" nicht und kann daher nur die Abgabeart 1000 verarbeiten. 
     516CREATE OR REPLACE FUNCTION delete_feature_kill_abg1000() RETURNS TRIGGER AS $$ 
    513517DECLARE 
    514518        begsql TEXT; 
     
    516520        gml_id TEXT; 
    517521BEGIN 
     522        -- Alte Version, die nur die Abgabeart 1000 (ohne replace) verarbeiten kann. 
    518523        NEW.typename := lower(NEW.typename); -- Objektart=Tabellen-Name 
    519524        NEW.context := lower(NEW.context);   -- Operation 'delete'/'replace'/'update' 
     
    524529        END IF; 
    525530        IF NEW.context='delete' THEN -- Löschen des Objektes 
    526           -- In der Objekt-Tabelle 
    527531                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'''; 
    528532                --RAISE NOTICE 'Lösche gml_id % in %', gml_id, NEW.typename; 
     
    530534 
    531535                -- beginnt-Wert des aktuellen Objektes ermitteln 
     536                -- besser ?   WHERE substring(gml_id,1,16) = ''' || gml_id || ''' 
    532537                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL'; 
    533538                EXECUTE begsql INTO aktbeg; 
     
    535540                -- Alte Objekte entfernen 
    536541                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'' AND beginnt < ''' || aktbeg || ''''; 
    537  
     542        END IF; 
     543 
     544        NEW.ignored := false; 
     545        RETURN NEW; 
     546END; 
     547$$ LANGUAGE plpgsql; 
     548 
     549 
     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. 
     554CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 
     555DECLARE 
     556        n INTEGER; 
     557        vbeginnt TEXT; 
     558        replgml TEXT; 
     559        featgml TEXT; 
     560        s TEXT; 
     561BEGIN 
     562        -- Version 2014-09-23, replace fÃŒhrt auch zum Löschen des VorgÀngerobjektes 
     563        NEW.context := coalesce(lower(NEW.context),'delete'); 
     564 
     565        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 
     594                NEW.safetoignore := lower(NEW.safetoignore); 
     595                IF NEW.safetoignore IS NULL THEN 
     596                        RAISE EXCEPTION '%: safeToIgnore nicht gesetzt.', NEW.featureid; 
     597                ELSIF NEW.safetoignore<>'true' AND NEW.safetoignore<>'false' THEN 
     598                        RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore; 
     599                END IF; 
     600        ELSE 
     601                RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'', ''replace'' oder ''update'' erwartet).', NEW.featureid, NEW.context; 
     602        END IF; 
     603 
     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? 
    538612        END IF; 
    539613 
     
    591665END; 
    592666$$ LANGUAGE plpgsql; 
     667 
     668 
     669-- 2014-09-22 Kopie aus Norbit-Github 
     670-- Funktioniert nicht wenn SchlÃŒsseltabellen mit "ax_" beginnen wie die Objekt-Tabellen. 
     671-- Darin wird dann z.B. die Splate "endet" gesucht. 
     672-- ToDo: besseres Namens-Schema fÃŒr Tabellen. 
     673--   z.B. Umbenennen "ax_buchungsstelle_buchungsart" -> "v_bs_buchungsart" 
     674CREATE OR REPLACE FUNCTION alkis_hist_check() RETURNS varchar AS $$ 
     675DECLARE 
     676        c RECORD; 
     677        n INTEGER; 
     678        r VARCHAR; 
     679BEGIN 
     680        FOR c IN SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND substr(table_name,1,3) IN ('ax_','ap_','ks_') AND table_type='BASE TABLE' 
     681        LOOP 
     682                EXECUTE 'SELECT count(*) FROM ' || c.table_name || ' WHERE endet IS NULL GROUP BY gml_id HAVING count(*)>1' INTO n; 
     683                IF n>1 THEN 
     684                        r := coalesce(r||E'\n','') || c.table_name || ': ' || n || ' Objekte, die in mehreren Versionen nicht beendet sind.'; 
     685                END IF; 
     686 
     687                EXECUTE 'SELECT count(*) FROM ' || c.table_name || ' WHERE beginnt>=endet' INTO n; 
     688                IF n>1 THEN 
     689                        r := coalesce(r||E'\n','') || c.table_name || ': ' || n || ' Objekte mit ungÃŒltiger Lebensdauer.'; 
     690                END IF; 
     691 
     692                EXECUTE 'SELECT count(*)' 
     693                        || ' FROM ' || c.table_name || ' a' 
     694                        || ' JOIN ' || c.table_name || ' b ON a.gml_id=b.gml_id AND a.ogc_fid<>b.ogc_fid AND a.beginnt<b.endet AND a.endet>b.beginnt' 
     695                        INTO n; 
     696                IF n>0 THEN 
     697                        r := coalesce(r||E'\n','') || c.table_name || ': ' || n || ' LebensdauerÃŒberschneidungen.'; 
     698                END IF; 
     699        END LOOP; 
     700 
     701        RETURN r; 
     702END; 
     703$$ LANGUAGE plpgsql; 
     704 
     705-- Aufruf: SELECT alkis_hist_check(); 
     706 
  • trunk/import/alkis_PostNAS_keytables.sql

    r307 r338  
    2424--                   ax_sonstigesrecht_artdf, ax_anderefestlegungnachwasserrecht_artdf 
    2525--  2013-04-17  F.J. Kurzbezeichnungen der BodenschÀttung fÃŒr die Kartendarstellung 
    26  
    27 --      2014-01-24      F.J. "Eigentuemerart" entschchlÃŒsseln 
     26--  2014-01-24   F.J. "Eigentuemerart" entschchlÃŒsseln 
     27 
     28-- ToDo: Der Prefix "ax_" sollte Objekt-Tabellen des ALKIS-Namenschemas vorbehalten sein. 
     29--   Diese Hilfstabellen fÃŒr VerschlÃŒsselungen sollten dagegen einen anderen Prefix bekommen. 
     30--   Dadurch können Functions die Objekttabellen am Namen erkennen. 
    2831 
    2932  SET client_encoding = 'UTF8'; 
  • trunk/import/alkis_PostNAS_schema.sql

    r336 r338  
    5858--               Aktuell: "gml_id character(16) NOT NULL" 
    5959 
     60-- 2014-09-23 FJ ZÀhlfelder fÃŒr Kontext-Funktionen in der import-Tabelle 
     61 
    6062--  Dies Schema kann NICHT mehr mit der gdal-Version 1.9 verwendet werden. 
    6163 
     
    9294 
    9395-- Importtabelle fÃŒr Verarbeitungs-ZÀhler. 
    94 -- Wird benötigt fÃŒr den Trigger zur Pflege der "alkis_beziehungen" (Version "Unna"). 
    95 -- Kann mit "alkis_beziehungen" entfallen, wenn alle Views und Programm umgestellt sind auf interne Relationen. 
     96-- Wurde ursprÃŒnglich eingefÃŒhrt fÃŒr den Trigger zur Pflege der "alkis_beziehungen". 
     97-- Ist seit Version PostNAS 0.8 nur noch eine Metadaten-Tabelle zum Aktualisierungs-Verlauf einer Datenbank. 
     98-- FÃŒr die Funktion von Konverter oder Auskunft-Programmen ist diese Tabelle nicht notwendig. 
     99-- Das Script "konv_batch.sh" aktualisiert diese Tabelle. 
     100-- Wenn dies Script verwendet wird, ist die import-Tabelle nÃŒtzlich um nachzuschauen, 
     101-- wann welcher Ordner mit Daten in diese Datenbank konvertiert wurde. 
    96102CREATE TABLE import ( 
    97103  id serial NOT NULL, 
     
    99105  verzeichnis text, 
    100106  importart text, 
     107  anz_delete integer, 
     108  anz_update integer, 
     109  anz_replace integer, 
    101110  CONSTRAINT import_pk PRIMARY KEY (id) 
    102111); 
     
    109118COMMENT ON COLUMN import.verzeichnis IS 'Ort von dem die NAS-Dateien verarbeitet wurden.'; 
    110119COMMENT ON COLUMN import.importart   IS 'Modus des Konverter-Laufes: e="Erstladen" oder a="NBA-Aktualisierung"'; 
     120 
     121COMMENT ON COLUMN import.anz_delete  IS 'Anzahl von delete-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes'; 
     122COMMENT ON COLUMN import.anz_update  IS 'Anzahl von update-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes'; 
     123COMMENT ON COLUMN import.anz_replace IS 'Anzahl von replace-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes'; 
     124 
    111125 
    112126-- Tabelle "delete" fÃŒr Lösch- und FortfÃŒhrungsdatensÀtze. 
  • trunk/import/konv_batch.sh

    r336 r338  
    4040##   2014-09-11 F.J. krz: Eintrag in import-Tabelle repariert. 
    4141##                   Keine Abfrage des Symlinks auf kill/hist. Enstscheidend ist die aktuelle DB, nicht der Symlink 
     42##   2014-09-23 F.J. krz: ZÀhlung der Funktionen in delete, dies in import-Tabelle eintragen (Metadaten) 
     43 
     44## ToDo:  
     45## - Unterscheidung e/a noch sinnvoll? Immer "a" = Aktualisierung = -update ? 
     46## - PostProcessing: Aufruf Script, sonst redundant zu pflegen 
    4247 
    4348POSTNAS_HOME=$(dirname $0) 
     
    131136  psql $con -c 'TRUNCATE table "delete";' 
    132137 
    133   echo "Bisherige Konvertierungen (Import-Tabelle):" 
    134   psql $con -c "SELECT * FROM import;" 
     138  #echo "Bisherige Konvertierungen (Import-Tabelle):" 
     139  #psql $con -c "SELECT * FROM import ORDER by id;" 
    135140 
    136141# Import Eintrag erzeugen 
     
    173178  echo "** Ende Konvertierung Ordner ${ORDNER}" 
    174179 
     180  # Durch EinfÃŒgen in Tabelle 'delete' werden Löschungen und Aktualisierungen anderer Tabellen getriggert 
     181  echo "** Die delete-Tabelle enthaelt so viele Zeilen:" 
     182  psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";' 
     183 
     184  echo "** aufgeteilt auf diese Funktionen:" 
     185  psql $con -c 'SELECT context, COUNT(featureid) AS anzahl FROM "delete" GROUP BY context ORDER BY context;'  
     186 
     187  # Kontext-Funktionen zÀhlen und dei Anzahl als Metadaten zum aktuellen Konvertierungslauf speichern 
     188  psql $con -c " 
     189   UPDATE import SET anz_delete=(SELECT count(*) FROM \"delete\" WHERE context='delete')  
     190   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_delete IS NULL; 
     191   UPDATE import SET anz_update=(SELECT count(*) FROM \"delete\" WHERE context='update')  
     192   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_update IS NULL; 
     193   UPDATE import SET anz_replace=(SELECT count(*) FROM \"delete\" WHERE context='replace')  
     194   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_replace IS NULL;"  
     195   # ignored = true auswerten, ggf. warnen ? 
     196 
    175197# 
    176198# Post-Processing / Nacharbeiten 
     
    183205 
    184206  else 
    185  
    186207    echo "** Post-Processing (Nacharbeiten zur Konvertierung)" 
    187208 
     
    189210    (cd $POSTNAS_HOME; psql $con -f nutzungsart_laden.sql) 
    190211  
    191     echo "-----------"  
    192   
    193212    echo "** - Fluren, Gemarkungen, Gemeinden und Straßen-Namen neu Laden (Script pp_laden.sql):" 
    194213    (cd $POSTNAS_HOME; psql $con -f pp_laden.sql) 
     
    196215  fi 
    197216 
    198   # Durch EinfÃŒgen in Tabelle 'delete' werden Löschungen und Aktualisierungen anderer Tabellen getriggert 
    199   echo "** Die delete-Tabelle enthaelt:" 
    200   psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";' 
    201  
    202   #echo "   delete-Tabelle loeschen:" 
    203   #psql $con -c 'TRUNCATE table "delete";' 
    204  
    205   # AufrÀumen der historischen Objekte -- besser voirher als nachher. Analyse fÃŒr Trigger-Entwicklung 
    206 #  echo "** geendete Objekte entfernen:" 
    207 #  psql $con -c "SELECT alkis_delete_all_endet();" 
     217  # AufrÀumen der historischen Objekte -- besser vorher als nachher. Analyse fÃŒr Trigger-Entwicklung 
     218 
     219 #echo "   delete-Tabelle loeschen:" 
     220 #psql $con -c 'TRUNCATE table "delete";' 
     221 
     222 #echo "** geendete Objekte entfernen:" 
     223 #psql $con -c "SELECT alkis_delete_all_endet();" 
    208224 
    209225  echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot" 
  • trunk/import/sichten.sql

    r337 r338  
    10691069-- Abgabeart 3100, Trigger "delete_feature_hist()". 
    10701070-- NICHT anzuwenden bei Abgabeart 1000 
     1071-- Siehe auch: FUNCTION "alkis_hist_check()" in Datei "alkis-functions.sql" 
    10711072 
    10721073-- Erst mal die betroffenen Objekte identifizieren 
    1073 CREATE OR REPLACE VIEW fehlersuche_hist_mehrere_vorgaenger_fs 
     1074CREATE OR REPLACE VIEW hist_mehrere_vorgaenger_fs 
    10741075AS  
    10751076  SELECT substring(gml_id,1,16) AS gml, count(beginnt) AS anzahl -- 16stellige kurze ID, oder Substring 
     
    10811082-- bis zu 7 Versionen je FS gefunden 
    10821083 
    1083 COMMENT ON VIEW fehlersuche_hist_mehrere_vorgaenger_fs 
     1084COMMENT ON VIEW hist_mehrere_vorgaenger_fs 
    10841085 IS 'ALKIS-FlurstÃŒcke suchen, zu denen es inzwischen mehrere Versionen gibt,  
    10851086also mehrere inzwischen beendete (historische) VorgÀnger-Versionen'; 
     
    10931094  SELECT substring(gml_id,1,16) AS gml, ogc_fid, beginnt, endet 
    10941095  FROM ax_flurstueck f 
    1095   JOIN fehlersuche_hist_mehrere_vorgaenger_fs v -- der vorhergehende View als Filter 
     1096  JOIN hist_mehrere_vorgaenger_fs v -- der vorhergehende View als Filter 
    10961097    ON substring(f.gml_id,1,16) = v.gml 
    10971098  ORDER BY substring(gml_id,1,16), ogc_fid; 
Note: See TracChangeset for help on using the changeset viewer.