Changeset 330 for trunk/import/alkis-functions.sql
- Timestamp:
- 09/10/14 12:08:18 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/import/alkis-functions.sql
r314 r330 12 12 -- statt dessen verwenden der "import_id" um alte Relationen zu identifizieren und zu löschen. 13 13 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. 14 20 15 21 -- Table/View/Sequence löschen, wenn vorhanden … … 176 182 EXECUTE sql; 177 183 178 -- CREATE UNIQUE INDEX vobjekte_gmlid ON vobjekte(gml_id,beginnt);179 -- CREATE INDEX vobjekte_table ON vobjekte(table_name);180 181 184 CREATE VIEW vbeziehungen AS 182 185 SELECT beziehung_von,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_von) AS typ_von … … 184 187 ,beziehung_zu,(SELECT table_name FROM vobjekte WHERE gml_id=beziehung_zu) AS typ_zu 185 188 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);192 189 193 190 RETURN 'ALKIS-Views erzeugt.'; … … 376 373 $$ LANGUAGE plpgsql; 377 374 378 379 375 -- "delete" und "replace" verarbeiten (OHNE Historie). Historische Objekte werden sofort gelöscht. 380 376 -- 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". 382 CREATE OR REPLACE FUNCTION delete_feature_kill_vers07() RETURNS TRIGGER AS $$ 383 DECLARE 384 384 begsql TEXT; 385 385 aktbeg TEXT; 386 386 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); 387 BEGIN 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 392 391 393 392 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 398 398 -- 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) 401 402 EXECUTE 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' OR beziehung_zu = ''' || gml_id || ''''; 403 402 404 --RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename; 403 405 404 406 ELSE -- Ersetzen eines Objektes (Replace). In der Objekt-Tabelle sind jetzt bereits 2 Objekte vorhanden (alt und neu). 407 405 408 -- 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'; 407 410 EXECUTE begsql INTO aktbeg; 411 408 412 -- 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; 422 END; 423 $$ LANGUAGE plpgsql; 424 425 -- 2014-09-04: Version 0.8 ohne "alkis_beziehungen"-Tabelle 426 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 427 DECLARE 428 begsql TEXT; 429 aktbeg TEXT; 430 gml_id TEXT; 431 BEGIN 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 412 452 END IF; 413 453 … … 435 475 FOR c IN 436 476 SELECT table_name 437 FROM information_schema.columns a477 FROM information_schema.columns a 438 478 WHERE a.column_name='endet' 479 AND a.is_updatable='YES' -- keine Views, die endet-Spalte haben 439 480 ORDER BY table_name 440 481 LOOP
Note: See TracChangeset
for help on using the changeset viewer.