<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=iso-8859-1"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.E-MailFormatvorlage17
        {mso-style-type:personal-compose;
        font-family:"Arial","sans-serif";
        color:windowtext;
        font-weight:normal;
        font-style:normal;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=DE link=blue vlink=purple><div class=WordSection1><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Hallo,<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>es gab in der Vergangenheit immer wieder Probleme, dass bei der Aktualisierung der PostNAS-Datenbank mit der Variante *kill immer noch alte Elemente in der Datenbank erhalten blieben.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Uns ist es konkret in mehreren Fällen aufgefallen. Dabei wurden Einträge in der Tabelle alkis_beziehungen nicht gelöscht. Dieses konnte auch nicht mehr zurückgeführt werden, sodass der derzeitige Trigger diese Daten nicht finden konnte.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Daher haben wir uns folgendes überlegt:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Zuerst haben wir eine weiter Tabelle in das Schema eingefügt. Diese Tabelle soll zum einen die Importierte Dateien protokollieren und zum anderen eine id erzeugen, die jedem Eintrag in der alkis_beziehungen zugeordnet werden. Dadurch ist zu erkennen, zu welchem Zeitpunkt eine Beziehung in diese Tabelle eingefügt wurde.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Hier das SQL zum erzeugen der Tabelle:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>CREATE TABLE import<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>(<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>  id serial NOT NULL,<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>  datum timestamp without time zone,<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>  verzeichnis text,<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>  importart text,<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>  CONSTRAINT import_pk PRIMARY KEY (id)<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>);<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>CREATE UNIQUE INDEX import_id ON import USING btree (id);<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Bei jedem Import durch das Skript konv_batch.sh muss ein weiterer Eintrag in diese Tabelle erfolgen. Dieses geschieht über folgendes Komando in der konv_batch.sh:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal style='text-indent:35.4pt'><span style='font-family:"Arial","sans-serif"'>echo "INSERT INTO import (datum,verzeichnis,importart) VALUES ('"$(date '+%Y-%m-%d %H:%M:%S')"','"${ORDNER}"','"${verarb}"');" | psql $con<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Dieser Befehl muss in der konv_batch.sh muss vor dem Ausführen des Befehls ogr2ogr abgesetzt werden.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Damit jede Beziehung genau einem Datenimport zugeordnet werden kann, benötigt man in der alkis_beziehungen ein weiteres Datenfeld. Dieses nennen wir import_id.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Hier das SQL zum erzeugen der Tabelle alkis_beziehungen:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>CREATE TABLE alkis_beziehungen (<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            ogc_fid                       serial NOT NULL,<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            beziehung_von           character(16),            --> gml_id<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            beziehungsart             varchar,                      --> Liste siehe unten<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            beziehung_zu             character(16),            --> gml_id<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            import_id                    integer,                       --> import_id aus der Tabelle import<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            CONSTRAINT alkis_beziehungen_pk PRIMARY KEY (ogc_fid)<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>);<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Wie kommt nun die richtige ID in das jeweilige Datenfeld?<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Dazu muss man zuerst wissen, dass ogr2ogr bei jeder aktualisierung versucht, alle Beziehungen aus dem neu geliefertem Objekt zu importieren. Das wird uns in diesem Fall zu Vorteil.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Es muss ein weitere Trigger eingerichtet werden. Dieser wird diesmal auf die Tabelle alkis_beziehungen gehen.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Hier der SQL für den Trigger, der bei der Kill Variante zum Einsatz kommt:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>CREATE TRIGGER update_import_id<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            BEFORE INSERT ON alkis_beziehungen<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            FOR EACH ROW<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            EXECUTE PROCEDURE get_import_id();<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Die Funktion get_import_id(); sucht sich zuerst die letzte, und damit höchste id aus der Tabelle id. Bei jedem Import einer Beziehung in die alkis_beziehungen wird nun über diese Funktion die höchste import_id der neu importierten Beziehung zugeordnet. <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Die Funktion sieht wie folgt aus:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>CREATE OR REPLACE FUNCTION get_import_id() RETURNS TRIGGER AS $$<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>BEGIN<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            EXECUTE 'SELECT max(id) FROM import' INTO NEW.import_id;<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>            RETURN NEW;<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>END;<o:p></o:p></span></p><p class=MsoNormal style='margin-left:35.4pt'><span style='font-family:"Arial","sans-serif"'>$$ LANGUAGE plpgsql;<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Somit kann jetzt jeder Beziehung zugeordnet werden, mit welchem Import der NBA-Dateien diese Beziehung in die Datenbank geladen wurde. Wie vorher schon gesagt, versucht ogr2ogr jede Beziehung aus einer NBA-Datei in die Tabelle zu importieren. Früher wurde dieses jedoch nicht ausgeführt, da es schon genau so einen Datensatz gab. Nun wird er eingetragen, da es kleine Unterschiede gibt, nämlich die import_id.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Da jetzt natürlich doppelte Datensätze vorhanden sind, müssen alle Datensätze, die kleiner als die höchste id in der Tabelle import gelöscht werden. Aber nur für das Objekt, welches zuvor importiert wurde und nicht global für alle Datensätze.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Dazu ist der Trigger auf der delete Tabelle ebenfalls anzupassen.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>In der Funktion delete_feature_kill() ist folgender Befehl hinzuzufügen:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>            <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>            EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' AND import_id < (SELECT max(id) FROM import)';<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Der Datensatz in der Tabelle delete wird erst erzeugt, wenn alle anderen Tabellen bereits mit den Informationen gefüllt wurden.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Nun sind wirklich alle Informationen auf dem aktuellen Stand, da nur die Beziehungen, die mit dem letzten Import hinzugefügt wurden, in der Datenbank vorhanden sind.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Ich habe unsere Änderungen einmal in die Skripte aus dem aktuellen Trunk eingebaut.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Um zu sehen, welche Beziehungen gelöscht wurden, habe ich eine weitere Tabelle alkis_beziehungen_alt eingerichtet, in die alle Datensätze kopiert werden, bevor diese aus der Tabelle alkis_beziehungen gelöscht werden.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Hier noch eine Übersicht, an welchen Stellen die Änderungen in den Dateien zu finden ist:<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>alkis_PostNAS_schema.sql<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Zeile 148 – 164 (Tabelle alkis_beziehungen)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Zeile 4498 – 4508 (Anlegen der import Tabelle)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>alkis-trigger-kill.sql<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Zeile 6 – 9 (Trigger für die alkis_beziehungen Tabelle)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>alkis-functions.sql<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Zeile 423 – 425 (Beziehungen sichern und löschen)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Zeile 822 – 828 (Funktion für den Trigger auf der Tabelle alkis_beziehungen)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>konv_batch.sh<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Zeile 100 – 101 (Erzeugen des Eintrages in die Import Tabelle)<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Meine Änderungen vom 10.07.2013 nutze ich nicht mehr. Auch die entsprechenden Felder und Funktionen sind in unserer Datenbank entfernt worden.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>Nachdem wir auf diese Lösung umgestellt haben, hatten wir keine Probleme mehr mit alten Einträgen.<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif"'>            <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Mit freundlichen Grüßen<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Im Auftrag<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Marvin Brandt<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Kreis Unna - Der Landrat<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Zentrale Datenverarbeitung<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>DV-Verfahren</span><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'> <o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Friedrich-Ebert-Straße 17<o:p></o:p></span></p><p class=MsoNormal><span lang=EN-US style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>59425 Unna<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'><o:p> </o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Fon 0 23 03 / 27-14 16<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'>Fax 0 23 03 / 27-28 96<o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'><a href="mailto:marvin.brandt@kreis-unna.de"><span style='color:windowtext'>marvin.brandt@kreis-unna.de</span></a><o:p></o:p></span></p><p class=MsoNormal><span style='font-family:"Arial","sans-serif";mso-fareast-language:DE'><a href="http://www.kreis-unna.de/"><span style='color:windowtext'>www.kreis-unna.de</span></a><o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p></div><p>Denken Sie an die Umwelt. Pruefen Sie deshalb bitte, <br>
ob der Ausdruck dieser E-Mail wirklich notwendig ist.<br>
 <br>
 </p><br>
<p>Diese E-Mail wurde beim Ausgang auf Viren geprueft. Wegen der <br>
potentiellen Gefahr auf den Uebertragungswegen wird zu einer <br>
Vireneingangskontrolle geraten. Eine Haftung für Virenfreiheit<br>
wird ausgeschlossen.</p>

<p></p></body></html>