- Timestamp:
- 10/31/12 16:46:53 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql
r178 r183 38 38 -- Typ 'GEOMETRY' bei Tabellen: AX_WegPfadSteig, AX_UntergeordnetesGewaesser 39 39 40 -- 2012-10-31 FJ Trigger fuer NAS-Replace-Saetze repariert: 41 -- siehe: FUNCTION delete_feature_kill() 42 -- ax_historischesflurstueck.buchungsart ist Text nicht integer. 43 40 44 -- VERSIONS-NUMMER: 41 45 42 -- Dies Schema kann nichtmehr mit der installierbaren gdal-Version 1.9 verwendet werden.46 -- Dies Schema kann NICHT mehr mit der installierbaren gdal-Version 1.9 verwendet werden. 43 47 -- Derzeit muss ogr2ogr (gdal) aus den Quellen compiliert werden, die o.g. Patch enthalten. 44 48 -- WeiterfÃŒhrung dieses Zweiges als PostNAS 0.7 … … 267 271 END IF; 268 272 273 -- Das beginn-Datum des neuen Objektes ermitteln, der Satz ist kurz zuvor eingefuegt worden 274 275 -- Variante 1 funktioniert, wenn gml_id auch einen Timestamp enthaelt 269 276 sql := 'SELECT beginnt FROM ' || NEW.typename || ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || ''''; 270 277 -- RAISE NOTICE 'SQL: %', sql; 271 272 -- FEHLER: identifier enthÀlt nur gml_id, aber nicht den Timestamp dahinter273 -- Daher wird das zu ersetzende Obejkt nicht gefunden274 275 278 EXECUTE sql INTO endete; 276 279 277 /*278 280 IF endete IS NULL AND length(NEW.replacedBy)>16 THEN 279 RAISE NOTICE '%: Nachfolger % nicht gefunden - versuche ''%''', NEW.featureid, substr(NEW.replacedBy, 1, 16);281 RAISE NOTICE '%: Nachfolger % nicht gefunden - versuche ''%''', NEW.featureid, NEW.replacedBy, substr(NEW.replacedBy, 1, 16); 280 282 sql := 'SELECT beginnt FROM ' || NEW.typename 281 283 || ' WHERE gml_id=''' || substr(NEW.replacedBy, 1, 16) || '''' … … 284 286 EXECUTE sql INTO endete; 285 287 END IF; 286 */287 288 288 289 IF endete IS NULL THEN … … 296 297 END IF; 297 298 298 --RAISE NOTICE '%: Nachfolgeobjekt beginnt um %.', NEW.featureid, endete;299 RAISE NOTICE '%: Nachfolgeobjekt beginnt um %.', NEW.featureid, endete; 299 300 ELSE 300 301 RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context; 301 302 END IF; 302 303 304 -- mit dem zuvor ermittelten Beginn-Datum des replace-Objektes das alte Objekt historisieren 303 305 sql := 'UPDATE ' || NEW.typename 304 306 || ' SET endet=''' || endete || '''' 305 307 || ' WHERE (identifier=''urn:adv:oid:' || NEW.featureid || ''' OR identifier=''urn:adv:oid:' || gml_id || ''')' 306 308 || ' AND endet IS NULL'; 307 --RAISE NOTICE 'SQL: %', sql;309 RAISE NOTICE 'SQL: %', sql; 308 310 EXECUTE sql; 309 311 GET DIAGNOSTICS n = ROW_COUNT; … … 328 330 -- historische Objekte werden sofort gelöscht. 329 331 -- Siehe Mail W. Jacobs vom 23.03.2012 in PostNAS-Mailingliste 332 -- geaendert krz FJ 2012-10-31 330 333 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$ 331 334 DECLARE 332 335 query TEXT; 336 begsql TEXT; 337 aktbeg TEXT; 333 338 gml_id TEXT; 334 339 BEGIN … … 342 347 343 348 IF NEW.context='delete' THEN 344 query := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || ''''; 349 -- ersatzloses Loeschen eines Objektes 350 351 -- Tabelle der Objekt-Art 352 query := 'DELETE FROM ' || NEW.typename 353 || ' WHERE gml_id = ''' || gml_id || ''''; 345 354 EXECUTE query; 346 355 347 query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' OR beziehung_zu = ''' || gml_id || ''''; 356 -- Tabelle alkis_beziehungen 357 query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id 358 || ''' OR beziehung_zu = ''' || gml_id || ''''; 348 359 EXECUTE query; 360 RAISE NOTICE 'Lösche gml_id % in % und Beziehungen', gml_id, NEW.typename; 361 349 362 ELSE 350 -- replace 351 query := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || ''''; 363 -- Ersetzen eines Objektes 364 -- In der objekt-Tabelle sind bereits 2 Objekte vorhanden (alt und neu). 365 -- Die 2 DatensÀtze unterscheiden sich nur in ogc_fid und beginnt 366 367 -- beginnt-Wert des aktuellen Objektes ermitteln 368 -- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(NEW.replacedBy, 1, 16); 369 begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id = ''' || substr(NEW.replacedBy, 1, 16) || ''' AND endet IS NULL'; 370 EXECUTE begsql INTO aktbeg; 371 372 -- Nur alte Objekte entfernen 373 query := 'DELETE FROM ' || NEW.typename 374 || ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || ''''; 352 375 EXECUTE query; 353 -- alkis_beziehungen bleibt so 376 377 -- Tabelle alkis_beziehungen 378 IF gml_id = substr(NEW.replacedBy, 1, 16) THEN -- gml_id gleich 379 -- Beziehungen des Objektes wurden redundant noch einmal eingetragen 380 -- ToDo: HIER sofort die Redundanzen zum aktuellen Objekt beseitigen. 381 -- Work-Arround: Nach der Konvertierung werden im Post-Processing 382 -- ALLE Redundanzen mit einem SQL-Statemant beseitigt. 383 -- RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, NEW.typename; 384 385 -- ENTWURF ungetestet: 386 --query := 'DELETE FROM alkis_beziehungen AS bezalt 387 -- WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||') 388 -- AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu 389 -- WHERE bezalt.beziehung_von = bezneu.beziehung_von 390 -- AND bezalt.beziehung_zu = bezneu.beziehung_zu 391 -- AND bezalt.beziehungsart = bezneu.beziehungsart 392 -- AND bezalt.ogc_fid < bezneu.ogc_fid);' 393 --EXECUTE query; 394 395 ELSE 396 -- replace mit ungleicher gml_id 397 -- Falls dies vorkommt, die Function erweitern 398 RAISE EXCEPTION '%: neue gml_id % bei Replace in %. alkis_beziehungen muss aktualisiert werden!', gml_id, NEW.replacedBy, NEW.typename; 399 END IF; 354 400 END IF; 355 401 … … 361 407 -- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Functions (_hist oder _kill) verlinkt werden, 362 408 -- je nachdem ob nur aktuelle oder auch historische Objekte in der Datenbank gefÃŒhrt werden sollen. 363 364 409 365 410 -- Wenn die Datenbank MIT Historie angelegt wurde, aber eigentlich stört die nur. … … 377 422 LOOP 378 423 EXECUTE 'DELETE FROM ' || c.table_name || ' WHERE NOT endet IS NULL'; 379 RAISE NOTICE 'Lösche ended in: %', c.table_name;424 -- RAISE NOTICE 'Lösche ended in: %', c.table_name; 380 425 END LOOP; 381 426 END; … … 383 428 384 429 385 -- Alle Tabellen löschen 386 -- SELECT alkis_drop();430 -- Alle Tabellen löschen: 431 -- SELECT alkis_drop(); 387 432 388 433 … … 844 889 nachfolgerflurstueckskennzeichen varchar[], 845 890 blattart integer, 846 buchungsart integer, 891 --buchungsart integer, -- Aenderung krz FJ 2012-10-31: Meldung aus Konverter 892 buchungsart varchar, 847 893 buchungsblattkennzeichen double precision, 848 894 bezirk integer, … … 1283 1329 -- beziehtSichAufFlurstueck --> AX_Flurstueck 1284 1330 1331 1332 -- BEGIN - Nur fuer Test-Zwecke 1333 CREATE OR REPLACE FUNCTION info_flurstueck() RETURNS TRIGGER AS $$ 1334 BEGIN 1335 RAISE NOTICE 'Insert Flurstueck %', NEW.gml_id; 1336 RETURN NEW; 1337 END; 1338 $$ LANGUAGE plpgsql; 1339 1340 -- CREATE TRIGGER neues_fs_trigger 1341 -- BEFORE INSERT ON ax_flurstueck 1342 -- FOR EACH ROW 1343 -- EXECUTE PROCEDURE info_flurstueck(); 1344 1345 -- ENDE - Nur fuer Test-Zwecke 1285 1346 1286 1347
Note: See TracChangeset
for help on using the changeset viewer.