Trigger programmieren

Advantage Database Server

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Trigger programmieren

Beitrag von UliTs »

Hallo allerseits,

ich habe inzwischen schon oft Trigger programmiert. Jetzt habe ich ein spezielles Problem: ich möchte nach einem Post eine Aktion durchführen, aber nur, wenn sich auch wirklich ein Datenbankfeld geändert hat. Für eine Tabelle mit bekannter Struktur (im Beispiel die Felder Preis und SchaetzPr) könnte das Script zum Trigger wie folgt aussehen:

Code: Alles auswählen

declare lChanged boolean;
set lChanged = ((select Preis       from __Old) <> (select Preis       from __New)) or
               ((select SchaetzPr   from __Old) <> (select SchaetzPr   from __New));
if lChanged
  // Aktion durchführen...
end if;
return;
Jetzt müsste ich bei jeder Änderung in der Datenbankstruktur (z.B. hinzufügen eines Feldes) den Trigger anpassen. Gibt es eine Möglichkeit, dies auch so zu programmieren, dass der Trigger nicht angepasst werden muß?
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
HaPe
1000 working lines a day
1000 working lines a day
Beiträge: 995
Registriert: So, 15. Nov 2015 17:44
Wohnort: 71665 Vaihingen-Enz
Hat sich bedankt: 17 Mal
Danksagung erhalten: 15 Mal

Re: Trigger programmieren

Beitrag von HaPe »

Hallo Uli !
Jetzt habe ich ein spezielles Problem: ich möchte nach einem Post eine Aktion durchführen, aber nur, wenn sich auch wirklich ein Datenbankfeld geändert hat.
Sollen alle Felder dieser Tabelle geprüft werden?

Wenn ja, dann könnte man mit einem Data Dictionary arbeiten welches du dann in einer Schleife durcharbeiten mußt.
Andernfalls die Struktur der Tabelle zur Laufzeit/beim Programmstart bestimmen und den Trigger-Code passend zusammen bauen.

PS: Für den Zugriff auf $MS SQL-Server erstelle ich direkt nach Aufbau der Connection ein lokales Data Dictionary für die (VFP-)CursorAdapter. Auch bei Änderung der Datenstruktur muss an den CAs nichts mehr geändert werden.
OK, ist zunächst sehr viel Aufwand für die Zugriffs-Klassen aber nach einiger Zeit hat es sich rentiert weil dann nie mehr händische Anpassungen notwendig sind.
Das Beste ist aber dass Man(n)/Frau nicht mehr dran denken muß Änderungen nachzuziehen.
--
Hans-Peter
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger programmieren

Beitrag von nightcrawler »

Achtung .... jetzt wirds böse ;)
Du kannst zwei Datenmengen mit UNION zusammenfassen. UNION filtert dabei Dubletten heraus (im Gegensatz zu UNION ALL). Wenn Also die Datenmenge aus

Code: Alles auswählen

select * from __old 
union 
select * from __new
mehr als einen Datensatz hat, so hat sich mindestens ein Feld darin geändert. Die Anzahl bekommst Du mit einem COUNT(*) auf ein Subselect (beachte die ganzen Klammern und den Alias a):

Code: Alles auswählen

  declare @cnt Integer;
  @cnt = (select count(*) from (select * from __old union select * from __new) a);
Daraus ergibt sich der gesamte Trigger:

Code: Alles auswählen

create trigger trig_test on MeineTabelle instead of update
begin
  declare @cnt Integer;
  @cnt = (select count(*) from (select * from __old union select * from __new) a);
  if @cnt > 1 then
    raise my_exception(-1, 'Datensatz wurde geändert');
  end;
end;
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Trigger programmieren

Beitrag von UliTs »

:angry7: :angry3: :angry2: :angry1: :badgrin: :doubt: :| :shock: :o :) :D :D :D

Danke :angel3:
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Trigger programmieren

Beitrag von UliTs »

So genial die Lösungsidee ist, so scheitert es in meinem Fall an einer Kleinigkeit: wenn es MEMO-Felder gibt, funktioniert es so nicht :( .
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Trigger programmieren

Beitrag von nightcrawler »

Hallo Uli,
in diesem Fall kommst Du um eine Konvertierung der Memo-Inhalte für den Select wahrscheinlich nicht herum ...

Code: Alles auswählen

select feld1, feld2, cast(memofeld as sql_char), feld 3 ...
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Trigger programmieren

Beitrag von UliTs »

Ja, nur dann müßte ich halt wieder die Feldnamen kennen...
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten