Changeset 338
- Timestamp:
- 09/26/14 13:23:28 (10 years ago)
- Location:
- trunk/import
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/import/alkis-functions.sql
r336 r338 30 30 -- mehrerer VorgÀnger- und Nachfolger-Objekte mit und ohne "endet IS NULL" geben. 31 31 32 -- 2014-09-23 FJ: Korrektur "delete_feature_kill()": 33 -- Die neue Hist-Version vereinfachen (endet nicht benötigt) und zum Löschen umbauen. 32 34 33 35 -- Table/View/Sequence löschen, wenn vorhanden … … 380 382 -- context='replace' => "endet" des ersetzten auf "beginnt" des neuen Objekts setzen 381 383 -- context='update' => "endet" auf ÃŒbergebene Zeit setzen und "anlass" festhalten 384 -- Die "gml_id" muss in der Datenbank das Format character(16) haben. 382 385 CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$ 383 386 DECLARE … … 503 506 504 507 505 -- 2014-09-04: Version0.8 ohne "alkis_beziehungen"-Tabelle508 -- Version PostNAS 0.8 ohne "alkis_beziehungen"-Tabelle 506 509 -- 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. 516 CREATE OR REPLACE FUNCTION delete_feature_kill_abg1000() RETURNS TRIGGER AS $$ 513 517 DECLARE 514 518 begsql TEXT; … … 516 520 gml_id TEXT; 517 521 BEGIN 522 -- Alte Version, die nur die Abgabeart 1000 (ohne replace) verarbeiten kann. 518 523 NEW.typename := lower(NEW.typename); -- Objektart=Tabellen-Name 519 524 NEW.context := lower(NEW.context); -- Operation 'delete'/'replace'/'update' … … 524 529 END IF; 525 530 IF NEW.context='delete' THEN -- Löschen des Objektes 526 -- In der Objekt-Tabelle527 531 EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'''; 528 532 --RAISE NOTICE 'Lösche gml_id % in %', gml_id, NEW.typename; … … 530 534 531 535 -- beginnt-Wert des aktuellen Objektes ermitteln 536 -- besser ? WHERE substring(gml_id,1,16) = ''' || gml_id || ''' 532 537 begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL'; 533 538 EXECUTE begsql INTO aktbeg; … … 535 540 -- Alte Objekte entfernen 536 541 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; 546 END; 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. 554 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 555 DECLARE 556 n INTEGER; 557 vbeginnt TEXT; 558 replgml TEXT; 559 featgml TEXT; 560 s TEXT; 561 BEGIN 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? 538 612 END IF; 539 613 … … 591 665 END; 592 666 $$ 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" 674 CREATE OR REPLACE FUNCTION alkis_hist_check() RETURNS varchar AS $$ 675 DECLARE 676 c RECORD; 677 n INTEGER; 678 r VARCHAR; 679 BEGIN 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; 702 END; 703 $$ LANGUAGE plpgsql; 704 705 -- Aufruf: SELECT alkis_hist_check(); 706 -
trunk/import/alkis_PostNAS_keytables.sql
r307 r338 24 24 -- ax_sonstigesrecht_artdf, ax_anderefestlegungnachwasserrecht_artdf 25 25 -- 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. 28 31 29 32 SET client_encoding = 'UTF8'; -
trunk/import/alkis_PostNAS_schema.sql
r336 r338 58 58 -- Aktuell: "gml_id character(16) NOT NULL" 59 59 60 -- 2014-09-23 FJ ZÀhlfelder fÃŒr Kontext-Funktionen in der import-Tabelle 61 60 62 -- Dies Schema kann NICHT mehr mit der gdal-Version 1.9 verwendet werden. 61 63 … … 92 94 93 95 -- 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. 96 102 CREATE TABLE import ( 97 103 id serial NOT NULL, … … 99 105 verzeichnis text, 100 106 importart text, 107 anz_delete integer, 108 anz_update integer, 109 anz_replace integer, 101 110 CONSTRAINT import_pk PRIMARY KEY (id) 102 111 ); … … 109 118 COMMENT ON COLUMN import.verzeichnis IS 'Ort von dem die NAS-Dateien verarbeitet wurden.'; 110 119 COMMENT ON COLUMN import.importart IS 'Modus des Konverter-Laufes: e="Erstladen" oder a="NBA-Aktualisierung"'; 120 121 COMMENT ON COLUMN import.anz_delete IS 'Anzahl von delete-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes'; 122 COMMENT ON COLUMN import.anz_update IS 'Anzahl von update-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes'; 123 COMMENT ON COLUMN import.anz_replace IS 'Anzahl von replace-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes'; 124 111 125 112 126 -- Tabelle "delete" fÃŒr Lösch- und FortfÃŒhrungsdatensÀtze. -
trunk/import/konv_batch.sh
r336 r338 40 40 ## 2014-09-11 F.J. krz: Eintrag in import-Tabelle repariert. 41 41 ## 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 42 47 43 48 POSTNAS_HOME=$(dirname $0) … … 131 136 psql $con -c 'TRUNCATE table "delete";' 132 137 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;" 135 140 136 141 # Import Eintrag erzeugen … … 173 178 echo "** Ende Konvertierung Ordner ${ORDNER}" 174 179 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 175 197 # 176 198 # Post-Processing / Nacharbeiten … … 183 205 184 206 else 185 186 207 echo "** Post-Processing (Nacharbeiten zur Konvertierung)" 187 208 … … 189 210 (cd $POSTNAS_HOME; psql $con -f nutzungsart_laden.sql) 190 211 191 echo "-----------"192 193 212 echo "** - Fluren, Gemarkungen, Gemeinden und StraÃen-Namen neu Laden (Script pp_laden.sql):" 194 213 (cd $POSTNAS_HOME; psql $con -f pp_laden.sql) … … 196 215 fi 197 216 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();" 208 224 209 225 echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot" -
trunk/import/sichten.sql
r337 r338 1069 1069 -- Abgabeart 3100, Trigger "delete_feature_hist()". 1070 1070 -- NICHT anzuwenden bei Abgabeart 1000 1071 -- Siehe auch: FUNCTION "alkis_hist_check()" in Datei "alkis-functions.sql" 1071 1072 1072 1073 -- Erst mal die betroffenen Objekte identifizieren 1073 CREATE OR REPLACE VIEW fehlersuche_hist_mehrere_vorgaenger_fs1074 CREATE OR REPLACE VIEW hist_mehrere_vorgaenger_fs 1074 1075 AS 1075 1076 SELECT substring(gml_id,1,16) AS gml, count(beginnt) AS anzahl -- 16stellige kurze ID, oder Substring … … 1081 1082 -- bis zu 7 Versionen je FS gefunden 1082 1083 1083 COMMENT ON VIEW fehlersuche_hist_mehrere_vorgaenger_fs1084 COMMENT ON VIEW hist_mehrere_vorgaenger_fs 1084 1085 IS 'ALKIS-FlurstÃŒcke suchen, zu denen es inzwischen mehrere Versionen gibt, 1085 1086 also mehrere inzwischen beendete (historische) VorgÀnger-Versionen'; … … 1093 1094 SELECT substring(gml_id,1,16) AS gml, ogc_fid, beginnt, endet 1094 1095 FROM ax_flurstueck f 1095 JOIN fehlersuche_hist_mehrere_vorgaenger_fs v -- der vorhergehende View als Filter1096 JOIN hist_mehrere_vorgaenger_fs v -- der vorhergehende View als Filter 1096 1097 ON substring(f.gml_id,1,16) = v.gml 1097 1098 ORDER BY substring(gml_id,1,16), ogc_fid;
Note: See TracChangeset
for help on using the changeset viewer.