Ignore:
Timestamp:
09/10/14 12:08:18 (7 years ago)
Author:
frank.jaeger
Message:

Umstellung von PostNAS 0.7 auf PostNAS 0.8, ohne Tabelle "alkis_beziehungen".

File:
1 edited

Legend:

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

    r314 r330  
    1212--             statt dessen verwenden der "import_id" um alte Relationen zu identifizieren und zu löschen. 
    1313 
     14-- 2014-08-27: Angleichung des Datenbank-Schema an die NorBIT-Version. 
     15--             Die Trigger-Function "delete_feature_kill()" arbeitet falsch, wenn "gml_id" als "character varying" angelegt ist. 
     16--             Das Format war bisher charachter(16). 
     17--             Zugriff auf die Spalte gml_id umgestellt von "=" auf "like" um den individuellen Timestamp zu ignorieren. 
     18 
     19-- 2014-09-04  Trigger-Funktion "delete_feature_kill()" angepasst: keine Tabelle "alkis_beziehungen" mehr. 
    1420 
    1521-- Table/View/Sequence löschen, wenn vorhanden 
     
    176182        EXECUTE sql; 
    177183 
    178 --      CREATE UNIQUE INDEX vobjekte_gmlid ON vobjekte(gml_id,beginnt); 
    179 --      CREATE INDEX vobjekte_table ON vobjekte(table_name); 
    180  
    181184        CREATE VIEW vbeziehungen AS 
    182185                SELECT  beziehung_von,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_von) AS typ_von 
     
    184187                        ,beziehung_zu,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_zu) AS typ_zu 
    185188                FROM alkis_beziehungen; 
    186  
    187 --      CREATE INDEX vbeziehungen_von    ON vbeziehungen(beziehung_von); 
    188 --      CREATE INDEX vbeziehungen_vontyp ON vbeziehungen(typ_von); 
    189 --      CREATE INDEX vbeziehungen_art    ON vbeziehungen(beziehungsart); 
    190 --      CREATE INDEX vbeziehungen_zu     ON vbeziehungen(beziehung_zu); 
    191 --      CREATE INDEX vbeziehungen_zutyp  ON vbeziehungen(typ_zu); 
    192189 
    193190        RETURN 'ALKIS-Views erzeugt.'; 
     
    376373$$ LANGUAGE plpgsql; 
    377374 
    378  
    379375-- "delete" und "replace" verarbeiten (OHNE Historie). Historische Objekte werden sofort gelöscht. 
    380376-- Geaendert 2014-02-03 auf Vorschlag M.B. Krs. Unna 
    381 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 
    382 DECLARE 
    383         query TEXT; 
     377 
     378-- 2014-08-27: Anpassung an vereinheitlichtes Datenbank-Schema. 
     379-- Wenn die Spalte gml_id im Format "character varying" (ohne LÀngenbegrenzung) angelegt wird, 
     380-- muss gezielt der ID-Teil vor dem Timestamp angesprochen werden. 
     381-- Zugriff auf die Spalte gml_id umgestellt von "=" auf "like". 
     382CREATE OR REPLACE FUNCTION delete_feature_kill_vers07() RETURNS TRIGGER AS $$ 
     383DECLARE 
    384384        begsql TEXT; 
    385385        aktbeg TEXT; 
    386386        gml_id TEXT; 
    387         query_bez TEXT; 
    388 BEGIN 
    389         NEW.typename := lower(NEW.typename); 
    390         NEW.context := lower(NEW.context); 
    391         gml_id      := substr(NEW.featureid, 1, 16); 
     387BEGIN 
     388        NEW.typename := lower(NEW.typename); -- Objektart = Tabellen-Name 
     389        NEW.context := lower(NEW.context);   -- Operation 'delete', 'replace' oder 'update' 
     390        gml_id      := substr(NEW.featureid, 1, 16); -- ID-Teil der gml_id, ggf. anhÀngender Timestamp abgeschnitten 
    392391 
    393392        IF NEW.context IS NULL THEN 
    394                 NEW.context := 'delete'; 
    395         END IF; 
    396  
    397         IF NEW.context='delete' THEN -- Ersatzloses Loeschen des Objektes 
     393                NEW.context := 'delete'; -- default 
     394        END IF; 
     395 
     396        IF NEW.context='delete' THEN -- ersatzloses Löschen des Objektes 
     397 
    398398          -- In der Objekt-Tabelle 
    399                 EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || ''''; 
    400           -- Beziehungen von und zu dem Objekt sind hinfaellig 
     399                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'''; 
     400  
     401         -- Beziehungen von und zu dem Objekt sind hinfaellig (zukÃŒnftig entfallend) 
    401402                EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' OR beziehung_zu = ''' || gml_id || ''''; 
     403 
    402404                --RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename; 
    403405 
    404406        ELSE -- Ersetzen eines Objektes (Replace). In der Objekt-Tabelle sind jetzt bereits 2 Objekte vorhanden (alt und neu). 
     407 
    405408                -- beginnt-Wert des aktuellen Objektes ermitteln 
    406                 begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id = ''' || substr(NEW.replacedBy, 1, 16) || ''' AND endet IS NULL'; 
     409                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL'; 
    407410                EXECUTE begsql INTO aktbeg; 
     411 
    408412                -- Alte Objekte entfernen 
    409                 EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || ''''; 
    410                 -- Beziehungen vom alten Objekt entfernen, die aus frueheren Importen stammen 
    411                 EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' AND import_id < (SELECT max(id) FROM import)'; 
     413                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'' AND beginnt < ''' || aktbeg || ''''; 
     414 
     415                -- Beziehungen des alten Objektes entfernen, die aus frÃŒheren Importen stammen 
     416                EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von like ''' || gml_id || '%'' AND import_id < (SELECT max(id) FROM import)'; 
     417 
     418        END IF; 
     419 
     420        NEW.ignored := false; 
     421        RETURN NEW; 
     422END; 
     423$$ LANGUAGE plpgsql; 
     424 
     425-- 2014-09-04: Version 0.8 ohne "alkis_beziehungen"-Tabelle 
     426CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 
     427DECLARE 
     428        begsql TEXT; 
     429        aktbeg TEXT; 
     430        gml_id TEXT; 
     431BEGIN 
     432        NEW.typename := lower(NEW.typename); -- Objektart=Tabellen-Name 
     433        NEW.context := lower(NEW.context);   -- Operation 'delete'/'replace'/'update' 
     434        gml_id      := substr(NEW.featureid, 1, 16); -- ID-Teil der gml_id, ohne Timestamp 
     435 
     436        IF NEW.context IS NULL THEN 
     437                NEW.context := 'delete'; -- default 
     438        END IF; 
     439        IF NEW.context='delete' THEN -- Löschen des Objektes 
     440          -- In der Objekt-Tabelle 
     441                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'''; 
     442                --RAISE NOTICE 'Lösche gml_id % in %', gml_id, NEW.typename; 
     443        ELSE -- Ersetzen des Objektes (Replace). In der Objekt-Tabelle sind jetzt bereits 2 Objekte vorhanden (alt und neu). 
     444 
     445                -- beginnt-Wert des aktuellen Objektes ermitteln 
     446                begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id like ''' || substr(NEW.replacedBy, 1, 16) || '%'' AND endet IS NULL'; 
     447                EXECUTE begsql INTO aktbeg; 
     448 
     449                -- Alte Objekte entfernen 
     450                EXECUTE 'DELETE FROM ' || NEW.typename || ' WHERE gml_id like ''' || gml_id || '%'' AND beginnt < ''' || aktbeg || ''''; 
     451 
    412452        END IF; 
    413453 
     
    435475        FOR c IN 
    436476                SELECT table_name 
    437                 FROM information_schema.columns a 
     477                 FROM information_schema.columns a 
    438478                WHERE a.column_name='endet' 
     479            AND a.is_updatable='YES' -- keine Views, die endet-Spalte haben 
    439480                ORDER BY table_name 
    440481        LOOP 
Note: See TracChangeset for help on using the changeset viewer.