
"#################################################################
'Zugang zur Datenbank'
"################################################################


1. Öffnen Sie Projektes FossGis2026_Trigger_und_Geodaten.qgz im QGIS
2. Im QGIS-Browser unter Projektverzeichnis: Rechtsklick auf trigger_kurs_fossgis_2026.gpkg und "Verbindung hinzufügen" wählen.
3. Legen Sie eine neue PostGis-Verbindung im Browser über Rechtsklick auf PostgreSQL an 

Name: QGISTrigger
Host: 85.215.48.125
Port: 51353
Datenbank: fossgis
SSL: verlangen
user: fg1 bis fg20
PW: querc_12x

3. Öffnen Sie Projektes FossGis2026_Trigger_und_Geodaten_pg.qgz im QGIS
4. Layer werden nicht geladen: "Für 10 sekunden ignorieren klicken,"
5. Nicht verfügbare Layer behalten anklicken
6. Rechte Maustaste auf einen Layer und Datenquelle reparieren wählen
7. Im erscheinenden Fenster zur PostgreSQL-Verbindung QGISTrigger scrollen
8. Das Schema fgx ausklappen
9. die passende Tabelle wählen
10 Für sämtliche Layer durchführen

11. Im QGIS den DB-Manager öffnen (Datenbank > DB-Verwaltung



"#############################################################
 Eine  Methode, mit der sich Daten dynamisch im Kontext anderer Daten aktualsieren lassen, sind Auslöser-Funktionen, die sogenannten Trigger.
Ein Trigger wird von einer vorher definierten Aktion ausgelöst. Die Aktion kann auf dem selben oder einem anderen Layer stattfinden.
Auf dem Geopackage  jeweils ein eigener trigger für Insert, Update und Delete geschrieben werden.
"####################################################################################

'#################################################
Trigger in SQLite und Geopackage
Genrelle Infos im Skript Zaubern_mit_dem_Geopackage.sql*/
'##########################################################


In SQlite bzw. Geopackwg  kann ein Trigger nur für Update oder Insert oder Delete arbeiten

drop trigger if exists trigger_name; --Trigger löschen wenn vorhanden
create trigger trigger_name			-- Trigger mit namen anlegen
	-- Die Aktion wird ausgelöst von...
	after update of spalte1,spalte2.. on tabelle  -- Beim Update können die Spalten definiert werden, auf deren Änderunge reagiert wird
	--oder
	after insert on tabelle				--
	--odet
	after delete on tabelle
		
		BEGIN							--Aktion beginnt
			update baeume				--In diesem Fall ein Update
				set 
					utm_ost = round(st_x(geom)), -- Koordinaten in die Spalten schreiben
					utm_nord = round(st_y(geom))
				
				from (Abfrage oder Tablle)  -- Es ist auch möglich aus einer tabelle oder einer Abfrage zu lesen
				where  NEW.FID = FID  -- Einschränkungen über where, in diesem Fall nur für die Geänderten Objekte: NEW:
			;
		END								-- Aktion endet
		;

--Beispiel: Im Bäume Layer werden die Koordinatenspalten automatisch aktualisiertt
drop trigger if exists koord_utm_up 
create trigger koord_utm_up			-- Trigger (Auslöser) koord_utm_up auf der Tabelle Bäume  angelegt
	after update of geom on baeume		-- Äktion wird nach Änderung der Geometrie ausgelöst
		BEGIN							-- Die folgende Aktion wird ausgelöst
			update baeume				--bäume wird aktualsiert
				set 
					utm_ost = round(st_x(geom)), -- Koordinaten in die Spalten schreiben
					utm_nord = round(st_y(geom))
				
				where  NEW.FID = FID  -- Nur für die geänderten Objekte
			;
		END								-- Aktion endet
		;
		

create trigger koord_utm_ins			-- Trigger (Auslöser) de_nam_up auf der tabelle wege_netz  anlegen
	after insert   on baeume				-- Äktion wird nach Einfügen eines neuen Objektes ausgelöst
		BEGIN							-- Die folgende Aktion wird ausgelöst
			update baeume				--bäume wird aktualsiert
				set 
					utm_ost = round(st_x(geom)), -- Koordinaten in die Spalten schreiben
					utm_nord = round(st_y(geom))
				
				where  NEW.FID = FID  -- Nur für die geänderten Objekte
			;
		END								-- Aktion endet
		;


-- das Gleiche mit Flächenberechnung
drop trigger if exists gebiet_ha_ins;
create trigger gebiet_ha_ins			
	after insert   on gebiet				
		BEGIN							
			update gebiet				
				set 
					ha = round((st_area(geom) / 10000),4)
				
				where  NEW.fid = fid  
			;
		END								-- Aktion endet
		;

drop trigger if exists gebiet_ha_upd;	
create trigger  gebiet_ha_upd			
	after update  of geom on gebiet				
		BEGIN							
			update gebiet				
				set 
					ha = round((st_area(geom) / 10000),4)
				
				where  NEW.fid = fid  
			;
		END								-- Aktion endet
		;


"#############################################################
Die Vorgehensweise im Postgis unterscheidet sich erheblich von der im Geopackage.
Es ist zunächst eine Triggerfunktion zu definieren, auf die dann der eigentliche Trigger zugreift.
"#################################################################################


		
		
--trigger zum Koordinatenberechnen auf Ounktöayer		
drop trigger if exists koord_utm  on daten.baeume; -- alter Trigger löschen

	CREATE OR REPLACE FUNCTION daten.utm_koord_as_attribut() 		--Namen der Funktion definieren
	RETURNS "trigger" AS 				-- Rückgabe für Trigger
		$$ 
		BEGIN		--Funktion beginn
			update daten.baeume
				set 
					utm_ost = round(st_x(NEW.geom)), -- Koordinaten in die Spalten schreiben
					utm_nord = round(st_y(NEW.geom))				
				where  NEW.FID = FID  -- Nur für die geänderten Objekte
			;
			RETURN NEW;
		END; 
		$$		--Funktion Ende			
 	LANGUAGE 'plpgsql';	
	
	-- Der eigentliche Trigger
	create trigger koord_utm
	After INSERT OR UPDATE of geom 	-- Trigger läuft für insert und Update
	ON daten.baeume   	-- Für die bez_gemannte Tabelle 
	FOR EACH ROW
	EXECUTE PROCEDURE daten.utm_koord_as_attribut(); 	--wnede die Funktion an
	

-- Trigger für die Flächenberechnung

drop trigger if exists ha_berech  on daten.gebiet; -- alter Trigger löschen
	CREATE OR REPLACE FUNCTION daten.gebiet_ha_berech() 		--Namen der Funktion definieren
	RETURNS "trigger" AS 				-- Rückgabe für Trigger
		$$ 
		BEGIN		--Funktion beginn
		update daten.gebiet				
				set 
					ha = round((st_area(NEW.geom) / 10000)::numeric(10,4),4)
				
				where  NEW.fid = fid  
			;
			RETURN NEW;
		END; 
		$$		--Funktion Ende			
 	LANGUAGE 'plpgsql';	
	
	-- Der eigentliche Trigger
	create trigger ha_berech
	After INSERT OR UPDATE of geom 	-- Trigger läuft für insert und Update
	ON daten.gebiet   	-- Für die bez_gemannte Tabelle 
	FOR EACH ROW
	EXECUTE PROCEDURE daten.gebiet_ha_berech(); 	-- Wende die Funktion calc_ha() an  
	
Eine Alternative sind für diese Anwendung auch genratet columns:	
alter table daten.gebiet
add column hektar_gen numeric(10,4)  GENERATED ALWAYS AS (round((st_area(geom) / 10000)::numeric(10,4),4))STORED

'###############################################		
Bäume in den GebietsPolygonen zählen		
Dazu muss eine räumliche Abfrage durhcgeführt werden.
################################################'

'##############################
Geopackage
###############################'

drop trigger if exists geb_nu_baumanzahl_upd;
create trigger geb_nu_baumanzahl_upd		
	after update  of geom on gebiet				-- Wenn die Geometrie des Nutzungslayers geändert wird
		BEGIN							
				update gebiet
				set
				anzahl_baeume= a.anzahl,  -- Anzahl Bäume wird auf die ermittelte Anzahl aus der Abfrage a gesetzt.
				baum_liste = a.baumliste
				from 
					(	-- Unterabfrage über die Räumliche Beziehung zwischen Bäumen und Polygonen geprüft wird
						select
						a.fid as fl_fid,
						count(b.fid) as anzahl							-- Zählt die baum.fid je Polygon
						,replace(group_concat(distinct art_de order by art_de) ,',',','||char(10)) as baumliste -- erzeugt eine Baumliste mit Zeilenumbruch
						from gebiet as a join baeume as b on st_intersects(a.geom,b.geom)  --Prüfen der räumlichen Überlagerung mit st_intersects
						where a.fid = NEW.fid 							-- Nur die geänderten Objekte
						group by a.fid								-- gruppieren nach den Polygonen über den Primärschlüssel der Polygone
					) as a										-- Abfrage kann im Update als a. angesprochen werden
					where    gebiet.fid = a.fl_fid and NEW.fid = gebiet.fid 
					;				
			END								-- Aktion endet
		;
		
drop trigger if exists geb_nu_baumanzahl_ins;
create trigger geb_nu_baumanzahl_ins		
	after insert on gebiet				-- Wenn die Geometrie des Nutzungslayers geändert wird
		BEGIN							
				update gebiet
				set
				anzahl_baeume= a.anzahl,  -- Anzahl Bäume wird auf die ermittelte Anzahl aus der Abfrage a gesetzt.
				baum_liste = a.baumliste
				from 
					(	-- Unterabfrage über die Räumliche Beziehung zwischen Bäumen und Polygonen geprüft wird
						select
						a.fid as fl_fid,
						count(b.fid) as anzahl							-- Zählt die baum.fid je Polygon
						,replace(group_concat(distinct art_de order by art_de) ,',',','||char(10)) as baumliste -- erzeugt eine Baumliste mit Zeilenumbruch
						from gebiet as a join baeume as b on st_intersects(a.geom,b.geom)  --Prüfen der räumlichen Überlagerung mit st_intersects
						where a.fid = NEW.fid 							-- Nur die geänderten Objekte
						group by a.fid								-- gruppieren nach den Polygonen über den Primärschlüssel der Polygone
					) as a										-- Abfrage kann im Update als a. angesprochen werden
					where    gebiet.fid = a.fl_fid and NEW.fid = gebiet.fid 
					;				
			END								-- Aktion endet
		;

'##############################
Postgis
###############################'
		
	drop trigger if exists fl_nu_baumanzahl  on daten.gebiet; -- alter Trigger löschen
	CREATE OR REPLACE FUNCTION daten.baumanzahl_auf_geb_berech() 		--Namen der Funktion definieren
	RETURNS "trigger" AS 				-- Rückgabe für Trigger
		$$ 
		BEGIN		--Funktion beginn
			with abf as  -- Unterabfrage über with
				(
				select
				a.fid as fl_fid,
				count(b.fid) as anzahl							-- Zählt die baum.fid je Polygon
				,replace(string_agg(distinct art_de,',' order by art_de) ,',',','||chr(10)) as baumliste -- erzeugt eine Baumliste mit Zeilenumbruch
				from daten.gebiet as a join daten.baeume as b on st_intersects(a.geom,b.geom)  --Prüfen der räumlichen Überlagerung mit st_intersects
				where a.fid = NEW.fid 							-- Nur die geänderten Objekte
				group by a.fid -- gruppieren für jedes Flurstück
				)
			update daten.gebiet
			set
			anzahl_baeume= a.anzahl,  -- Anzahl Bäume wird auf die ermittelte Anzahl aus der Abfrage a gesetzt
			baum_liste = a.baumliste  -- Baumliste aus Abfrage
			from abf as a
			where    daten.gebiet.fid = a.fl_fid and NEW.fid = daten.gebiet.fid 
			;

			RETURN NEW;
		END; 
		$$		--Funktion Ende			
 	LANGUAGE 'plpgsql';	
	
	-- Der eigentliche Trigger
	create trigger fl_nu_baumanzahl
	After INSERT OR UPDATE of geom 	-- Trigger läuft für insert und Update auf Geometrie
	ON daten.gebiet   	-- Für die gemannte Tabelle 
	FOR EACH ROW
	EXECUTE PROCEDURE daten.baumanzahl_auf_geb_berech() ; 	-- Wende die Funktion  an  
		
		
		
		
		
'###############################################	
/Es ist auch möglich vorher einen View anzulegen und die räumliche Abfrage auszulagern. 
Dann ist es wichtig im Geopackage den räumlichen Index
explizit anzusprechen. 
###############################################'
drop view if exists  baumzahl; 
create view baumzahl as
with abf as
    (
    select
    a.fid as fl_fid,
    b.fid as ba_fid,
    count(b.fid) as anzahl,  -- Bäume zählen
	group_concat(distinct art_de order by art_de) as arten	
    from nutzung as a join baeume as b on st_intersects(a.geom,b.geom)
           
				where 	b.fid IN --Anhand der fid des Baum-Layers, 
                (SELECT r.id FROM rtree_baeume_geom as r WHERE    -- ob die id des jeweiligen Objektes zu Features gehört
															-- Deren Ausdehnung sich innerhalb der Box des Nutzungslayers bedindet
									r.maxx >= ST_MinX(a.geom) AND  --
								    r.minx <= ST_MaxX(a.geom) AND
								    r.maxy >= ST_MinY(a.geom) AND
								    r.miny <= ST_MaxY(a.geom)
								    )
    group by a.fid
    )
SELECT
row_number() over() as fid,  -- Eine Zeilemnummer als Primärschlüssel für den View  ablegen
* from abf; -- alle übrigen Spalten

-- Den View im Geopackage anmelden, damit im QGIS sichtbar
insert into gpkg_contents (table_name, data_type, identifier, srs_id)
values ('baumzahl', 'attributes', 'baumzahl', 0)
;


'###############################################	
Das Gleiche in Postgis
###############################################'

drop view if exists  daten.baumzahl; 
create view daten.baumzahl as
with abf as
    (
		select
		a.fid as fl_fid,
		count(b.fid) as anzahl							-- Zählt die baum.fid je Polygon
		,string_agg(distinct art_de,',' order by art_de) as baumliste -- erzeugt eine Baumliste mit Zeilenumbruch
		from daten.nutzung as a join daten.baeume as b on st_intersects(a.geom,b.geom)  --Prüfen der räumlichen Überlagerung mit st_intersects
						-- Nur die geänderten Objekte
           
    group by a.fid
    )
SELECT
row_number() over() as fid,  -- Eine Zeilemnummer als Primärschlüssel für den View  ablegen
* from abf; -- alle übrigen Spalten

'##########################################
Verschärfte Variante mit Anzahl je Art   */
###########################################'

drop view baumzahl; 
create view baumzahl as
with abf as
			(  -- Unterabfrage wie oben
			select
			a.fid as fl_fid,
			b.fid as ba_fid,
			count(b.fid) as anzahl,
			group_concat(distinct b.art_de order by art_de) arten	
			from nutzung as a join baeume as b on st_intersects(a.geom,b.geom)
				   
				where 	b.fid IN --Anhand der fid des Baum-Layers, 
                (SELECT r.id FROM rtree_baeume_geom as r WHERE    -- ob die id des jeweiligen Objektes zu Features gehört
															-- Deren Ausdehnung sich innerhalb der Box des Nutzungslayers bedindet
									r.maxx >= ST_MinX(a.geom) AND  --
								    r.minx <= ST_MaxX(a.geom) AND
								    r.maxy >= ST_MinY(a.geom) AND
								    r.miny <= ST_MaxY(a.geom)
								    )
			group by a.fid,b.art_de  -- Es wird gruppiert nach Polygon und Art
			)
	SELECT -- Zweite Aggregierung
	row_number() over() as fid,
	fl_fid,
	sum(anzahl) as anzahl,
	group_concat(
				distinct (arten || ': ' ||
											iif(length(arten) > 5, 
												char(9),
												char(9)||char(9)
												) 
											|| anzahl
							)  
							order by arten
				) as arten

	from abf
	group by fl_fid  -- hier wird nur nach Flächen-ID gruppiert und so die Arten je Polygon summiert

	'#################################
	In Postgis
	###################################'
drop view if exists  daten.baumzahl; 
create view daten.baumzahl as
with abf as
    (
		select
		a.fid as fl_fid,
		count(b.fid) as anzahl							-- Zählt die baum.fid je Polygon
		,replace(string_agg(distinct art_de,',' order by art_de) ,',',','||chr(10)) as arten -- erzeugt eine Baumliste mit Zeilenumbruch
		from daten.nutzung as a join daten.baeume as b on st_intersects(a.geom,b.geom)  --Prüfen der räumlichen Überlagerung mit st_intersects
						-- Nur die geänderten Objekte
           
    group by a.fid,b.art_de
    )
	SELECT -- Zweite Aggregierung
	row_number() over() as fid,
	fl_fid,
	sum(anzahl) as anzahl,
	string_agg(
				 (arten || ': ' ||
											case 
												when length(arten) > 5
												then chr(9)
												else chr(9)||chr(9)
											end 
											|| anzahl
							)  
							
				,',' ) as arten --,','||chr(10) ) as arten

	from abf
	group by fl_fid  -- hier wird nur nach Flächen-ID gruppiert und so die Arten je Polygon summiert
	;

'#####################################
Die folgende Trigger greifen auf die Views zu
######################################'

drop trigger if exists fl_nu_baumanzahl_ins;
create trigger fl_nu_baumanzahl_ins		
	after insert on nutzung				-- Nach Einfügen im layer Nutzung
		BEGIN							
				update nutzung
				set
				anzahl_baeume= a.anzahl
				,baum_liste  = replace(a.arten,',',','||char(10)) -- Baumliste: Einbau des Zeilenumbruchs mit Char(10)
				from baumzahl as a
                where  NEW.fid = nutzung.fid  and  nutzung.fid = a.fl_fid
					;				
			END								-- Aktion endet
		;

drop trigger if exists fl_nu_baumanzahl_upd;
create trigger fl_nu_baumanzahl_upd		
	after update  of geom on nutzung				-- Wenn die Geometrie des Nutzungslayers geändert wird
		BEGIN							
				update nutzung
				set
				anzahl_baeume= a.anzahl
				,baum_liste  = replace(a.arten,',',','||char(10)) -- Baumliste: Einbau des Zeilenumbruchs mit Char(10)
				from baumzahl as a
                where  NEW.fid = nutzung.fid  and  nutzung.fid = a.fl_fid
					;				
			END								-- Aktion endet
		;
		
'###############################
Postgis
#############################'

drop trigger if exists fl_nu_baumanzahl  on daten.nutzung; -- alter Trigger löschen
	CREATE OR REPLACE FUNCTION daten.baumanzah_auswertung_aufnutzung() 		--Namen der Funktion definieren
	RETURNS "trigger" AS 				-- Rückgabe für Trigger
		$$ 
		BEGIN		--Funktion beginn
			update daten.nutzung
			set
				anzahl_baeume= a.anzahl
				,baum_liste  = replace(a.arten,',',','||chr(10)) -- Baumliste: Einbau des Zeilenumbruchs mit Char(10)
				from daten.baumzahl as a
                where  NEW.fid = nutzung.fid  and  nutzung.fid = a.fl_fid
			;
			RETURN NEW;
		END; 
		$$		--Funktion Ende			
 	LANGUAGE 'plpgsql';	
	
	-- Der eigentliche Trigger
	create trigger fl_nu_baumanzahl
	After INSERT OR UPDATE of geom 	-- Trigger läuft für insert und Update
	ON daten.nutzung   	-- Für die gesamte Tabelle 
	FOR EACH ROW
	EXECUTE PROCEDURE daten.baumanzah_auswertung_aufnutzung(); 	--
	
'###################################################
 Trigger die beim Ändern der Baum-Layer ausgelöst werden und auf die Views zugreifen
 ########################################################'
 
drop trigger if exists baeu_baumanzahl_upd;
create trigger baeu_baumanzahl_upd		
	after update  of geom on baeume				
		BEGIN							
				update nutzung
				set
				anzahl_baeume= a.anzahl
                ,baum_liste  = replace(a.arten,',',','||char(10))
				from baumzahl as a
                where  nutzung.fid = a.fl_fid --and NEW.fid = a.ba_fid  
					;				
			END								-- Aktion endet
		;
drop trigger if exists baeu_baumanzahl_ins;
create trigger baeu_baumanzahl_ins		
	after insert on baeume				
		BEGIN							
				update nutzung
				set
				anzahl_baeume= a.anzahl
				,baum_liste  = replace(a.arten,',',','||char(10))
				from baumzahl as a
                where    nutzung.fid = a.fl_fid --and NEW.fid = a.ba_fid  
					;				
			END;								-- Aktion endet

drop trigger if exists 	baeu_baumanzahl_del		;
create trigger baeu_baumanzahl_del		
	after delete on baeume				
		BEGIN							
				update nutzung
				set
				anzahl_baeume= a.anzahl
				,baum_liste  = replace(a.arten,',',','||char(10))
				from baumzahl as a
                where   nutzung.fid = a.fl_fid -- and OLD.fid = a.ba_fid  
					;				
			END								-- Aktion endet
		;
'###################################################
 In Postgis
 ########################################################'
		
drop trigger if exists baeu_baumanzahl  on daten.baeume; -- alter Trigger löschen
	CREATE OR REPLACE FUNCTION daten.baumanzah_auswertung_aufbaeumen() 		--Namen der Funktion definieren
	RETURNS "trigger" AS 				-- Rückgabe für Trigger
		$$ 
		BEGIN		--Funktion beginn
			update daten.nutzung
			set
			anzahl_baeume= a.anzahl
			,baum_liste  = replace(a.arten,',',','||chr(10))
			from daten.baumzahl as a
			where    daten.nutzung.fid = a.fl_fid  
			;
			RETURN NEW;
		END; 
		$$		--Funktion Ende			
 	LANGUAGE 'plpgsql';	
	
	-- Der eigentliche Trigger
	create trigger baeu_baumanzahl
	After INSERT OR delete or UPDATE of geom 	-- Trigger läuft für insert und Update
	ON daten.baeume   	-- Für die gesamte Tabelle 
	FOR EACH ROW
	EXECUTE PROCEDURE daten.baumanzah_auswertung_aufbaeumen(); 	--
	
'##################################################################
Trigger lassen sich auch verwenden, um daten in einen anderen layer via insert hineinzuschreiben.
Z.B. für die Protokollierung von Änderungen, oder Ereignisse in einen . Im Folgenden Beispiel können auf dem Baum-Layer in 
die Spalte kontroll_text Ereignisse einggegeben werden, die über einen Trigger in die Tabelle baum_kontrolle geschrieben werden.
der Eintrag in die Spalte kontroll_text des Bäume-Layers wird anschließend über den Trigger gelöscht 
###############################################################################'

drop trigger kontroll_eintrag;
create trigger kontroll_eintrag			
	after update of   kontroll_text  on baeume		-- Auslösung nach Eintrag in kontroll_text
		BEGIN							--
			insert into baum_kontrolle    -- Einfügen in Baum-Kontrolle
			(baum_id,datum,inhalt)
				SELECT
				fid as baum_id,					-- fid des Baum-Layers für die Zuordnung zum Baum,
				date()|| '|'||substr(time(),1,5) as datum, -- Aktuelles Datum und Zeit
				kontroll_text as inhalt						-- Der Inhalt wird in die Tabelle baum_kontrolle eingetragen
				from baeume
				where  NEW.FID = FID AND kontroll_text != ''  -- Die Eintragung erfolgt nur aus geänderten Objekten und wenn kontroll_text keine leere Zeichenkette enthälz
			;
			
			update baeume							-- Mit diesem Update wird in kontroll_text eine leere Zeichenkette geschrieben 
			SET
			kontroll_text = ''
			where kontroll_text != ''
			;
			
		END								-- Aktion endet
		;
		
'###########################################
In Postgis
###################################'
drop trigger if exists kontroll_eintrag  on daten.baeume; -- alter Trigger löschen
	CREATE OR REPLACE FUNCTION daten.kontrolle_eintragen() 		--Namen der Funktion definieren
	RETURNS "trigger" AS 				-- Rückgabe für Trigger
		$$ 
		BEGIN		--Funktion beginn					--
			insert into baum_kontrolle    -- Einfügen in Baum-Kontrolle
			(baum_id,datum,inhalt)
				SELECT
				fid as baum_id,					-- fid des Baum-Layers für die Zuordnung zum Baum,
				current_date::text|| '|'||substr(current_time::text,1,5) as datum, -- Aktuelles Datum und Zeit
				kontroll_text as inhalt						-- Der Inhalt wird in die Tabelle baum_kontrolle eingetragen
				from baeume
				where  NEW.FID = FID AND kontroll_text != ''  -- Die Eintragung erfolgt nur aus geänderten Objekten und wenn kontroll_text keine leere Zeichenkette enthälz
			;
			
			update baeume							-- Mit diesem Update wird in kontroll_text eine leere Zeichenkette geschrieben 
			SET
			kontroll_text = ''
			where kontroll_text != ''
			;
			RETURN NEW;
		END; 
		$$		--Funktion Ende			
 	LANGUAGE 'plpgsql';	
	
	-- Der eigentliche Trigger
	create trigger kontroll_eintrag
	After  UPDATE of kontroll_text 	-- Trigger läuft für insert und Update
	ON daten.baeume   	-- Für die gesamte Tabelle 
	FOR EACH ROW
	EXECUTE PROCEDURE daten.kontrolle_eintragen(); 	



		
/*Dieser Trigger schreibt das datum der  letzte Änderunge eines Layers in die Spalte Änderung */

drop trigger if exists last_ins;
create trigger last_ins
after insert on layername
	Begin
		update layername
			set
			aenderung =  (date() ||'|:|' || time())
		where  NEW.fid = fid
		;
	END;

	
drop trigger if exists last_up;
create trigger last_up
after update on layername
	Begin
		update layername
			SET
			aenderung = (date() ||'|:|' || time())
		where aenderung is NULL or (NEW.fid = fid and  (date() ||'|:|' || time()) <> aenderung)
		-- Null Felder füllen und nur Schreiben, w
		;
	END;

##################################################
