Trigger mit where clause

T.Melzer

Neuer Benutzer
Beiträge
1
Ich stehe vor der folgenden Anforderung und habe keinen Lösungsansatz:

In der Tabelle A sind Daten enthalten die bei Veränderung (update) oder beim Anfügen (insert) mittels Trigger in eine Tabelle B geschrieben bzw. aktualisiert werden sollen.
Das ist ja kein Problem, doch in Tabelle A sind nicht alle Datensätze, die so behandelt werden sollen.
So sind dort z.B. Adressen gespeichert wie Kunden, Lieferanten, Interessenten usw. und lediglich für den Adresstyp Kunden soll der Trigger angewendet werden.

Ist da überhaupt lösbar? Ich finde in der MS SQL Dokumentation leider keine Hinweise zu einer möglichen Syntax und Google half bisher auch nicht :(
Vielleicht hat hier ja jemand eine Idee.

Besten Dank,
Thorsten
 
Werbung:
Ich stehe vor der folgenden Anforderung und habe keinen Lösungsansatz:

In der Tabelle A sind Daten enthalten die bei Veränderung (update) oder beim Anfügen (insert) mittels Trigger in eine Tabelle B geschrieben bzw. aktualisiert werden sollen.
Das ist ja kein Problem, doch in Tabelle A sind nicht alle Datensätze, die so behandelt werden sollen.
So sind dort z.B. Adressen gespeichert wie Kunden, Lieferanten, Interessenten usw. und lediglich für den Adresstyp Kunden soll der Trigger angewendet werden.

Ist da überhaupt lösbar? Ich finde in der MS SQL Dokumentation leider keine Hinweise zu einer möglichen Syntax und Google half bisher auch nicht :(
Vielleicht hat hier ja jemand eine Idee.

Besten Dank,
Thorsten

Nennt sich conditional trigger, also in PostgreSQL. Ob das mit M$SQL geht weiß ich aber nicht. Demo:

Code:
test=# create table foo (a int, b int);
CREATE TABLE
Time: 16,195 ms
test=*# create function f_trigger () returns trigger as $$begin raise notice 'trigger'; return new; end;$$language plpgsql;
CREATE FUNCTION
Time: 0,580 ms
test=*# create trigger trg before insert or update on foo for each row when (new.b=1) execute procedure f_trigger();
CREATE TRIGGER
Time: 0,394 ms
test=*# insert into foo values (1,1);
NOTICE:  trigger
INSERT 0 1
Time: 0,860 ms
test=*# insert into foo values (2,2);
INSERT 0 1
Time: 0,176 ms

Das NOTICE kommt nur bei b=1, nicht bei b=2.

Ansonsten mußt Du das eben innerhalb der Triggerfunktion prüfen und diese verlassen, wenn die Bedingung nicht paßt.
 
Werbung:
Ich wüsste jetzt drei Möglichkeiten:

A) Dein Trigger feuert nur wenn Bedingungen erfüllt wurden. Z.B.:
Code:
ALTER TRIGGER    [dbo].[adr]
    ON            [dbo].[adr]
    AFTER UPDATE, INSERT
AS
IF (    SELECT    kunde
        FROM    INSERTED ) = 1
BEGIN

B) Dein Trigger guckt im nachhinein ob per IF Abfrage ob wirklich aktualisiert werden muss...
C) Dein UPDATE-Statement im Trigger hat einer WHERE Bedingung die prüft ob es sich um einen Kunden handelt.

A ist für mich hier naheliegend, sofern es ein Flag gibt das diese Adresse klar als Kunden kennzeichnet oder etwas ähnlich leicht prüfbares.
 
Zurück
Oben