Changeset 210


Ignore:
Timestamp:
01/25/13 16:01:22 (11 years ago)
Author:
j.e.fischer
Message:

delete_feature_hist erneut geändert:

  • Es kommt vor, dass mit Timestamp qualifizierte Objekte angeblich durch sich selbst ersetzt werden (dann wir der Timestamp ignoriert)
  • dto Oracle-Version delete_feature_trigger


Schemaänderung:

  • Kommentare auf PostGIS-Metadatentabellen entfernt (geometry_columns ist ein View in PostGIS 2.0)
Location:
trunk/data/konvert/postnas_0.7
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/data/konvert/postnas_0.7/alkis-functions.sql

    r192 r210  
    273273CREATE OR REPLACE FUNCTION delete_feature_hist() RETURNS TRIGGER AS $$ 
    274274DECLARE 
    275         sql TEXT; 
    276         gml_id TEXT; 
     275        s TEXT; 
     276        alt_id TEXT; 
     277        neu_id TEXT; 
     278        beginnt TEXT; 
    277279        endete TEXT; 
    278280        n INTEGER; 
    279281BEGIN 
    280282        NEW.context := lower(NEW.context); 
    281         gml_id      := substr(NEW.featureid, 1, 16); 
    282  
    283283        IF NEW.context IS NULL THEN 
    284284                NEW.context := 'delete'; 
     285        END IF; 
     286 
     287        -- TIMESTAMP weder in gml_id noch identifier verlÀßlich. 
     288        -- also ggf. aus Datenbank holen 
     289 
     290        IF length(NEW.featureid)=32 THEN 
     291                alt_id  := substr(NEW.featureid, 1, 16); 
     292 
     293                IF NEW.featureid<>NEW.replacedBy THEN 
     294                        -- Beginnt-Datum aus Timestamp 
     295                        beginnt := substr(NEW.featureid, 17, 4) || '-' 
     296                                || substr(NEW.featureid, 21, 2) || '-' 
     297                                || substr(NEW.featureid, 23, 2) || 'T' 
     298                                || substr(NEW.featureid, 26, 2) || ':' 
     299                                || substr(NEW.featureid, 28, 2) || ':' 
     300                                || substr(NEW.featureid, 30, 2) || 'Z' 
     301                                ; 
     302                END IF; 
     303        ELSIF length(NEW.featureid)=16 THEN 
     304                alt_id  := NEW.featureid; 
     305        ELSE 
     306                RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.featureid, length(NEW.featureid); 
     307        END IF; 
     308 
     309        IF beginnt IS NULL THEN 
     310                -- Beginnt-Datum des Àltesten Eintrag, der nicht untergegangen ist 
     311                -- => der Satz dessen 'endet' gesetzt werden muß 
     312                EXECUTE 'SELECT min(beginnt) FROM ' || NEW.typename 
     313                        || ' WHERE gml_id=''' || alt_id || '''' 
     314                        || ' AND endet IS NULL' 
     315                        INTO beginnt; 
    285316        END IF; 
    286317 
     
    297328                END IF; 
    298329 
    299                 IF NEW.replacedBy IS NULL OR length(NEW.replacedBy)<16 THEN 
    300                         IF NEW.safetoignore = 'true' THEN 
    301                                 RAISE NOTICE '%: Nachfolger ''%'' nicht richtig gesetzt - ignoriert', NEW.featureid, NEW.replacedBy; 
    302                                 NEW.ignored := true; 
    303                                 RETURN NEW; 
    304                         ELSE 
    305                                 RAISE EXCEPTION '%: Nachfolger ''%'' nicht richtig gesetzt - Abbruch', NEW.featureid, NEW.replacedBy; 
     330                IF length(NEW.replacedBy)=32 THEN 
     331                        -- Beginnt-Datum aus Timestamp 
     332                        neu_id := substr(NEW.replacedBy, 1, 16); 
     333 
     334                        IF NEW.featureid<>NEW.replacedBy THEN 
     335                                endete  := substr(NEW.replacedBy, 17, 4) || '-' 
     336                                        || substr(NEW.replacedBy, 21, 2) || '-' 
     337                                        || substr(NEW.replacedBy, 23, 2) || 'T' 
     338                                        || substr(NEW.replacedBy, 26, 2) || ':' 
     339                                        || substr(NEW.replacedBy, 28, 2) || ':' 
     340                                        || substr(NEW.replacedBy, 30, 2) || 'Z' 
     341                                        ; 
    306342                        END IF; 
    307                 END IF; 
    308  
    309                 IF length(NEW.replacedBy)=16 THEN 
    310                         EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 
    311                                 ' WHERE gml_id=''' || NEW.replacedBy || ''' AND endet IS NULL' || 
    312                                 ' ORDER BY beginnt DESC LIMIT 1' 
    313                            INTO endete; 
    314                 ELSE 
    315                         -- replaceBy mit Timestamp 
    316                         EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 
    317                                 ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || '''' 
    318                            INTO endete; 
    319                         IF endete IS NULL THEN 
    320                                 EXECUTE 'SELECT beginnt FROM ' || NEW.typename || 
    321                                         ' WHERE gml_id=''' || substr(NEW.replacedBy,1,16) || ''' AND endet IS NULL' || 
    322                                         ' ORDER BY beginnt DESC LIMIT 1' 
    323                                    INTO endete; 
    324                         END IF; 
     343                ELSIF length(NEW.replacedBy)=16 THEN 
     344                        neu_id  := NEW.replacedBy; 
     345                ELSIF length(NEW.replacedBy)<>16 THEN 
     346                        RAISE EXCEPTION '%: LÀnge 16 oder 32 statt % erwartet.', NEW.replacedBy, length(NEW.replacedBy); 
    325347                END IF; 
    326348 
    327349                IF endete IS NULL THEN 
    328                         IF NEW.safetoignore = 'true' THEN 
    329                                 RAISE NOTICE '%: Nachfolger % nicht gefunden - ignoriert', NEW.featureid, NEW.replacedBy; 
    330                                 NEW.ignored := true; 
    331                                 RETURN NEW; 
    332                         ELSE 
    333                                 RAISE EXCEPTION '%: Nachfolger % nicht gefunden', NEW.featureid, NEW.replacedBy; 
    334                         END IF; 
     350                        -- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist 
     351                        -- => Enddatum fÃŒr vorherigen Satz 
     352                        EXECUTE 'SELECT max(beginnt) FROM ' || NEW.typename 
     353                                || ' WHERE gml_id=''' || neu_id || '''' 
     354                                || ' AND beginnt>''' || beginnt || '''' 
     355                                || ' AND endet IS NULL' 
     356                                INTO endete; 
    335357                END IF; 
    336358        ELSE 
     
    338360        END IF; 
    339361 
    340         sql     := 'UPDATE ' || NEW.typename 
    341                 || ' SET endet=''' || endete || '''' 
    342                 || ' WHERE gml_id=''' || gml_id || '''' 
    343                 || ' AND endet IS NULL' 
    344                 || ' AND beginnt<''' || endete || ''''; 
    345         -- RAISE NOTICE 'SQL: %', sql; 
    346         EXECUTE sql; 
     362        IF alt_id<>neu_id THEN 
     363                RAISE NOTICE 'Objekt % wird durch Objekt % ersetzt.', alt_id, neu_id; 
     364        END IF; 
     365 
     366        IF beginnt IS NULL THEN 
     367                RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden.', alt_id; 
     368        END IF; 
     369 
     370        IF endete IS NULL THEN 
     371                RAISE NOTICE 'Kein Beginndatum fuer Objekt % gefunden.', neu_id; 
     372        END IF; 
     373 
     374        IF beginnt IS NULL OR endete IS NULL OR beginnt=endete THEN 
     375                RAISE EXCEPTION 'Objekt % wird durch Objekt % ersetzt (leere Lebensdauer?).', alt_id, neu_id; 
     376        END IF; 
     377 
     378        s   := 'UPDATE ' || NEW.typename 
     379            || ' SET endet=''' || endete || '''' 
     380            || ' WHERE gml_id=''' || alt_id || '''' 
     381            || ' AND beginnt=''' || beginnt || '''' 
     382            || ' AND endet IS NULL'; 
     383        EXECUTE s; 
    347384        GET DIAGNOSTICS n = ROW_COUNT; 
    348385        IF n<>1 THEN 
    349                 RAISE NOTICE 'SQL: %', sql; 
     386                RAISE NOTICE 'SQL: %', s; 
    350387                IF NEW.context = 'delete' OR NEW.safetoignore = 'true' THEN 
    351                         RAISE NOTICE '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - ignoriert', NEW.featureid, n, endete; 
     388                        RAISE NOTICE '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - ignoriert', NEW.featureid, n, endete; 
     389                        NEW.ignored := true; 
     390                        RETURN NEW; 
     391                ELSIF n=0 THEN 
     392                        EXECUTE 'SELECT endet FROM ' || NEW.typename || 
     393                                ' WHERE gml_id=''' || alt_id || '''' || 
     394                                ' AND beginnt=''' || beginnt || '''' 
     395                                INTO endete; 
     396 
     397                        IF NOT endete IS NULL THEN 
     398                                RAISE NOTICE '%: Objekte bereits % ungegegangen - ignoriert', NEW.featureid, endete; 
     399                        ELSE 
     400                                RAISE NOTICE '%: Objekt nicht gefunden - ignoriert', NEW.featureid; 
     401                        END IF; 
     402 
    352403                        NEW.ignored := true; 
    353404                        RETURN NEW; 
    354405                ELSE 
    355                         RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt nur einem auf % gesetzt - Abbruch', NEW.featureid, n, endete; 
     406                        RAISE EXCEPTION '%: Untergangsdatum von % Objekten statt einem auf % gesetzt - Abbruch', NEW.featureid, n, endete; 
    356407                END IF; 
    357408        END IF; 
  • trunk/data/konvert/postnas_0.7/alkis-trigger-hist-oracle.sql

    r209 r210  
    4747DECLARE 
    4848        s varchar2(2047); 
    49         gml_id varchar2(13); 
     49        alt_id varchar2(16); 
     50        neu_id varchar2(16); 
     51        beginnt varchar2(20); 
    5052        endete varchar2(20); 
    5153        n INTEGER; 
     
    5355        :NEW.typename := upper(substr(:NEW.typename, 1, 30)); 
    5456        :NEW.context  := lower(:NEW.context); 
    55         gml_id        := substr(:NEW.featureid, 1, 16); 
    56  
    5757        IF :NEW.context IS NULL THEN 
    5858                :NEW.context := 'delete'; 
    5959        END IF; 
    6060 
     61        -- TIMESTAMP weder in gml_id noch identifier verlÀßlich. 
     62        -- also ggf. aus Datenbank holen 
     63 
     64        IF length(:NEW.featureid)=32 THEN 
     65                alt_id  := substr(:NEW.featureid, 1, 16); 
     66 
     67                IF :NEW.featureid<>:NEW.replacedBy THEN 
     68                        -- Beginnt-Datum aus Timestamp 
     69                        beginnt := substr(:NEW.featureid, 17, 4) || '-' 
     70                                || substr(:NEW.featureid, 21, 2) || '-' 
     71                                || substr(:NEW.featureid, 23, 2) || 'T' 
     72                                || substr(:NEW.featureid, 26, 2) || ':' 
     73                                || substr(:NEW.featureid, 28, 2) || ':' 
     74                                || substr(:NEW.featureid, 30, 2) || 'Z' 
     75                                ; 
     76                END IF; 
     77        ELSIF length(:NEW.featureid)=16 THEN 
     78                alt_id := :NEW.featureid; 
     79        ELSE 
     80                raise_application_error(-20100, :NEW.featureid || ': LÀnge 16 oder 32 statt ' || length(:NEW.featureid) || ' erwartet.'); 
     81        END IF; 
     82 
     83        IF beginnt IS NULL THEN 
     84                -- Beginnt-Datum des Àltesten Eintrag, der nicht untergegangen ist 
     85                -- => der Satz dessen 'endet' gesetzt werden muß 
     86                EXECUTE IMMEDIATE 'SELECT min(beginnt) FROM ' || :NEW.typename 
     87                        || ' WHERE gml_id=''' || alt_id || '''' 
     88                        || ' AND endet IS NULL' 
     89                        INTO beginnt; 
     90        END IF; 
     91 
    6192        IF :NEW.context='delete' THEN 
    62                 SELECT to_char(sysdate, 'UTC','YYYY-MM-DD"T"HH24:MI:SS"Z"') INTO endete FROM dual; 
     93                SELECT to_char(sysdate, 'YYYY-MM-DD"T"HH24:MI:SS"Z"') INTO endete FROM dual; 
    6394 
    6495        ELSIF :NEW.context='replace' THEN 
     
    71102                END IF; 
    72103 
    73                 IF :NEW.replacedBy IS NULL OR length(:NEW.replacedBy)<16 THEN 
    74                         IF :NEW.safetoignore = 'true' THEN 
    75                                 dbms_output.put_line( :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht richtig gesetzt - ignoriert' ); 
    76                                 :NEW.ignored := 'true'; 
    77                                 RETURN; 
    78                         ELSE 
    79                                 raise_application_error(-20100, :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht richtig gesetzt - Abbruch'); 
     104                IF length(:NEW.replacedBy)=32 THEN 
     105                        -- Beginnt-Datum aus Timestamp 
     106                        neu_id := substr(:NEW.replacedBy, 1, 16); 
     107 
     108                        IF :NEW.featureid<>:NEW.replacedBy THEN 
     109                                endete  := substr(:NEW.replacedBy, 17, 4) || '-' 
     110                                        || substr(:NEW.replacedBy, 21, 2) || '-' 
     111                                        || substr(:NEW.replacedBy, 23, 2) || 'T' 
     112                                        || substr(:NEW.replacedBy, 26, 2) || ':' 
     113                                        || substr(:NEW.replacedBy, 28, 2) || ':' 
     114                                        || substr(:NEW.replacedBy, 30, 2) || 'Z' 
     115                                        ; 
    80116                        END IF; 
    81                 END IF; 
    82  
    83                 IF length(:NEW.replacedBy)=16 THEN 
    84                         EXECUTE IMMEDIATE 'SELECT MAX(beginnt) FROM ' || :NEW.typename || 
    85                                 ' WHERE gml_id=''' || :NEW.replacedBy || ''' AND endet IS NULL' 
    86                            INTO endete; 
    87                 ELSE 
    88                         -- replaceBy mit Timestamp 
    89                         EXECUTE IMMEDIATE 'SELECT beginnt FROM ' || :NEW.typename || 
    90                                 ' WHERE identifier=''urn:adv:oid:' || :NEW.replacedBy || '''' 
    91                            INTO endete; 
    92                         IF endete IS NULL THEN 
    93                                 EXECUTE IMMEDIATE 'SELECT MAX(beginnt) FROM ' || :NEW.typename || 
    94                                         ' WHERE gml_id=''' || substr(:NEW.replacedBy,1,16) || ''' AND endet IS NULL' 
    95                                    INTO endete; 
    96                        END IF; 
     117                ELSIF length(:NEW.replacedBy)=16 THEN 
     118                        neu_id  := :NEW.replacedBy; 
     119                ELSIF length(:NEW.replacedBy)<>16 THEN 
     120                        raise_application_error(-20100, :NEW.replacedBy || ': LÀnge 16 oder 32 statt ' || length(:NEW.replacedBy) || ' erwartet.'); 
    97121                END IF; 
    98122 
    99123                IF endete IS NULL THEN 
    100                         IF :NEW.safetoignore = 'true' THEN 
    101                                 dbms_output.put_line(:NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - ignoriert'); 
    102                                 :NEW.ignored := 'true'; 
    103                                 RETURN; 
    104                         ELSE 
    105                                 raise_application_error(-20100, :NEW.featureid || ': Nachfolger ''' || :NEW.replacedBy || ''' nicht gefunden - Abbruch'); 
    106                         END IF; 
     124                        -- Beginnt-Datum des neuesten Eintrag, der nicht untergegangen ist 
     125                        -- => Enddatum fÃŒr vorherigen Satz 
     126                        EXECUTE IMMEDIATE 'SELECT max(beginnt) FROM ' || :NEW.typename 
     127                                || ' WHERE gml_id=''' || neu_id || '''' 
     128                                || ' AND beginnt>''' || beginnt || '''' 
     129                                || ' AND endet IS NULL' 
     130                                INTO endete; 
    107131                END IF; 
    108132        ELSE 
     
    110134        END IF; 
    111135 
    112         s       := 'UPDATE ' || :NEW.typename 
    113                 || ' SET endet=''' || endete || '''' 
    114                 || ' WHERE gml_id=''' || gml_id || '''' 
    115                 || ' AND endet IS NULL' 
    116                 || ' AND beginnt<''' || endete || ''''; 
     136        IF alt_id<>neu_id THEN 
     137                dbms_output.put_line('Objekt ' || alt_id || ' wird durch Objekt ' || neu_id || ' ersetzt.'); 
     138        END IF; 
     139 
     140        IF beginnt IS NULL THEN 
     141                dbms_output.put_line('Kein Beginndatum fuer Objekt ' || alt_id || '.'); 
     142        END IF; 
     143 
     144        IF endete IS NULL THEN 
     145                dbms_output.put_line('Kein Beginndatum fuer Objekt ' || neu_id || '.'); 
     146        END IF; 
     147 
     148        IF beginnt IS NULL OR endete IS NULL OR beginnt=endete THEN 
     149                raise_application_error(-20100, 'Objekt ' || alt_id || ' wird durch Objekt ' || neu_id || ' ersetzt (leere Lebensdauer?).'); 
     150        END IF; 
     151 
     152        s   := 'UPDATE ' || :NEW.typename 
     153            || ' SET endet=''' || endete || '''' 
     154            || ' WHERE gml_id=''' || alt_id || '''' 
     155            || ' AND beginnt=''' || beginnt || '''' 
     156            || ' AND endet IS NULL'; 
    117157        EXECUTE IMMEDIATE s; 
    118158        n := SQL%ROWCOUNT; 
  • trunk/data/konvert/postnas_0.7/alkis-trigger-hist.sql

    r192 r210  
    55 
    66CREATE TRIGGER insert_beziehung_trigger 
    7         AFTER INSERT ON alkis_beziehungen 
    8         FOR EACH ROW 
    9         EXECUTE PROCEDURE alkis_beziehung_inserted(); 
     7        AFTER INSERT ON alkis_beziehungen 
     8        FOR EACH ROW 
     9        EXECUTE PROCEDURE alkis_beziehung_inserted(); 
  • trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql

    r209 r210  
    44184418-- Digitales Gelaendemodell50  = DGM50 
    44194419 
    4420  
    4421 -- wenn schon, dann auch alle Tabellen mit Kommentaren versehen: 
    4422 COMMENT ON TABLE geometry_columns IS 'Metatabelle der Geometrie-Tabellen, Tabellen ohne Geometrie bekommen Dummy-Eintrag fÃŒr PostNAS-Konverter (GDAL/OGR)'; 
    4423 COMMENT ON TABLE spatial_ref_sys  IS 'Koordinatensysteme und ihre Projektionssparameter'; 
    4424  
    44254420-- Schema aktualisieren (setzt auch die Indizes neu) 
    44264421-- SELECT alkis_update_schema(); 
Note: See TracChangeset for help on using the changeset viewer.