Changeset 421 for trunk/import
- Timestamp:
- 07/26/19 14:01:57 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/import/alkis-functions.sql
r338 r421 32 32 -- 2014-09-23 FJ: Korrektur "delete_feature_kill()": 33 33 -- Die neue Hist-Version vereinfachen (endet nicht benötigt) und zum Löschen umbauen. 34 35 -- 2019-07-26 FJ: "delete_feature_kill" ÃŒberarbeitet. 36 -- Der Sonderfall "ModellschwÀche ausgleichen" im ibR-ALKIS wird behandelt: replace fÃŒr bereits vorhandene Objekte ignorieren. 37 -- 16stellig Feature-IDs werden nicht mehr erwartet. 34 38 35 39 -- Table/View/Sequence löschen, wenn vorhanden … … 548 552 549 553 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 -- "Kill-Trigger" 555 -- Historische Objekte werden sofort entfernt und nicht auf "endet" gesetzt. 556 -- Dies kann auch Abgabeart 3100 verarbeiten. 554 557 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 555 558 DECLARE 556 559 n INTEGER; 557 vbeginnt TEXT; 558 replgml TEXT; 559 featgml TEXT; 560 featgml TEXT; -- vorderer Teil von featureid: gml_id ohne Zeit 561 vbeginnt TEXT; -- hinterer Teil von featureid: beginnt-Zeit 560 562 s TEXT; 561 563 BEGIN 562 -- Version 2014-09-23, replace fÃŒhrt auch zum Löschen des VorgÀngerobjektes564 -- Trigger-Version 2019-07-22 kompatibel zu "NBA-ModellschwÀche ausgleichen" (ibR) 563 565 NEW.context := coalesce(lower(NEW.context),'delete'); 564 566 565 567 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 568 NEW.anlass := ARRAY[]::varchar[]; 569 END IF; 570 IF length(NEW.featureid)<>32 THEN 571 RAISE EXCEPTION '%: Identifikator gescheitert. Falsche Laenge.', NEW.featureid; 572 END IF; 573 574 featgml := substr(NEW.featureid, 1, 16); 575 576 -- beginnt-Zeit der zu löschenden VorgÀnger-Version des Objektes 577 vbeginnt := substr(NEW.featureid, 17, 4) || '-' 578 || substr(NEW.featureid, 21, 2) || '-' 579 || substr(NEW.featureid, 23, 2) || 'T' 580 || substr(NEW.featureid, 26, 2) || ':' 581 || substr(NEW.featureid, 28, 2) || ':' 582 || substr(NEW.featureid, 30, 2) || 'Z'; 583 584 IF NEW.context='replace' THEN 594 585 NEW.safetoignore := lower(NEW.safetoignore); 595 586 IF NEW.safetoignore IS NULL THEN … … 598 589 RAISE EXCEPTION '%: safeToIgnore ''%'' ungÃŒltig (''true'' oder ''false'' erwartet).', NEW.featureid, NEW.safetoignore; 599 590 END IF; 591 592 IF NEW.replacedby=NEW.featureid THEN 593 -- RAISE NOTICE '%: Replace fuer identisches Objekt ausgelassen. Sonderfall Modellschwaeche.', NEW.featureid; 594 NEW.ignored := true; 595 -- 1. Fall: Die NBA-ModellschwÀche wurde erfolgreich ausgeglichen. Dies Objekt fehlte bisher, es gibt daher keinen VorgÀnger. 596 -- 2. Fall: Der Insert wurde zuvor von der Datenbank abgelehnt (Unique-Constraint: gml_id, beginnt). Der Delete wÃŒrde daher die EINZIGE Version löschen, nicht den VorgÀnger. 597 -- safetoignore ist false, trotzdem ignorieren 598 ELSE 599 -- VorgÀnger-ALKIS-Objekt löschen 600 s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ; 601 EXECUTE s; 602 GET DIAGNOSTICS n = ROW_COUNT; 603 IF n=1 THEN 604 NEW.ignored := false; 605 ELSE 606 RAISE NOTICE '%: % schlug fehl ignoriert [%]', NEW.featureid, NEW.context, n; 607 NEW.ignored := true; 608 END IF; 609 END IF; 610 611 ELSIF NEW.context IN ('delete', 'update') THEN 612 613 -- VorgÀnger-ALKIS-Objekt löschen 614 s := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id=''' || featgml || ''' AND beginnt=''' || vbeginnt || '''' ; 615 EXECUTE s; 616 GET DIAGNOSTICS n = ROW_COUNT; 617 IF n=1 THEN 618 NEW.ignored := false; 619 ELSE 620 RAISE NOTICE '%: % schlug fehl ignoriert [%]', NEW.featureid, NEW.context, n; 621 NEW.ignored := true; 622 END IF; 623 600 624 ELSE 601 625 RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'', ''replace'' oder ''update'' erwartet).', NEW.featureid, NEW.context; 602 626 END IF; 603 627 604 -- Vorgaenger ALKIS-Objekt Loeschen605 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 THEN610 RAISE EXCEPTION '%: % schlug fehl [%]', NEW.featureid, NEW.context, n;611 -- dieser Satz kommt nicht in die delete-Tabelle?612 END IF;613 614 NEW.ignored := false;615 628 RETURN NEW; 616 629 END;
Note: See TracChangeset
for help on using the changeset viewer.