Trigger: Denkblockade

MysterioJN

SQL-Guru
Beiträge
158
Moin zusammen,

ich habe eine Denkblockade bei der Erstellung eines Triggers:

Gegebenheit:
4 Spalten (ImVerkauf = bit, ImVertrieb = bit, AusVertriebAb = Datum, AusVerkaufAb = Datum)

Ziel:
Wenn (ImVerkauf UND ImVertrieb = 0) UND (AusVertriebAb <> Null ODER AusVerkaufAb <> NULL),
dann soll er: SET aid_Medien.dbo.MedStamm.Projektphase_PIDX = 4



Code:
 -- Setzte Projektphase_PIDX auf Bestand = 4 wenn ImVerkauf UND ImVertrieb = 0 und AusVertriebAb <> Null oder AusVerkaufAb <> Null

   UPDATE aid_Medien.dbo.MedStamm
   SET aid_Medien.dbo.MedStamm.Projektphase_PIDX = 4
   FROM aid_Medien.dbo.MedStamm
   INNER JOIN INSERTED i
   ON i.PIDX = aid_Medien.dbo.MedStamm.PIDX
   INNER JOIN DELETED d
   ON d.PIDX = aid_Medien.dbo.MedStamm.PIDX
   WHERE ( i.ImVertrieb = 0
   AND i.ImVerkauf = 0)
   AND ((d.AusVerkaufAb <> NULL AND i.imVertrieb = 0) AND (d.AusVertriebAb <> NULL and i.imVerkauf = 0))
 
Zuletzt bearbeitet:
Werbung:
Also du joinst ja auch DELETED mit INNER JOIN. Dadurch wird der Trigger schonmal nur bei Updates greifen, nicht bei Inserts. Außerdem ist mir nicht ganz klar warum du mal DELETED und mal INSERTED als Abfrage nutzt, mag sinnvoll sein, vielleicht aber auch nicht :)

Bei MSSQL kann ein BIT außerdem nicht nur 0 oder 1 sondern auch NULL sein. Ob das bei dir auftritt mußt du prüfen.

Auf NULL würde ich nicht mit <> prüfen sondern mit IS NULL oder IS NOT NULL.
 
"Also du joinst ja auch DELETED mit INNER JOIN. Dadurch wird der Trigger schonmal nur bei Updates greifen, nicht bei Inserts. Außerdem ist mir nicht ganz klar warum du mal DELETED und mal INSERTED als Abfrage nutzt, mag sinnvoll sein, vielleicht aber auch nicht :)"

Ähm ja, mir wurde hier der Trigger mal so vorgegeben. Wie müsste ich den denn anders bauen damit er ordentlich funktioniert?
 
Werbung:
Ich würde sagen
Code:
UPDATE   aid_Medien.dbo.MedStamm
SET     aid_Medien.dbo.MedStamm.Projektphase_PIDX = 4
FROM   aid_Medien.dbo.MedStamm
INNER JOIN INSERTED i
ON     i.PIDX = aid_Medien.dbo.MedStamm.PIDX
WHERE   isnull(i.ImVertrieb,0) = 0
AND     isnull(i.ImVerkauf,0) = 0
AND   (   i.AusVerkaufAb IS NOT NULL
OR     i.AusVertriebAb IS NOT NULL )
 
Zurück
Oben