Trigger
-
Hallo Forum,
könntet Ihr mir bei diesem Trigger helfen?
CREATE TRIGGER NeuObst
NO CASCADE BEFORE UPDATE ON Obst
REFERENCING NEW AS N OLD AS O
FOR EACH ROW MODE DB2SQL
WHEN ((N.Preis!=O.Preis) AND (N.PreisDutzend IS NULL))
AS
(N.PreisDutzend = 12*N.Preis)
GO;Ich habe eine Obst Tabelle mit zwei Preisen. Den Einzelpreis (Preis) und den ermässigten Preis im Dutzend (PreisDutzend). Ich möchte nun wenn sich der Einzelpreis per SQL-Update ändert das dann auch der Dutzendpreis um einen bestimmten Faktor geändert wird. Ausnahme: Im SQL-Update Stmt ist auch der Dutzendpreis angegeben. Wie kann ich das machen?
Vielen Dank
Luigi
-
Ich kenne mich nicht mit DB2 aus, aber bei MSSQL gibt's eine Funktion "UPDATED(row-name)".
-
WHEN ((N.Preis!=O.Preis) AND (N.PreisDutzend IS NULL))
gehört auf jeden Fall geändert auf:
WHEN (N.Preis != O.Preis) AND (N.PreisDutzend IS NULL OR N.PreisDutzend = O.PreisDutzend)
MfG SideWinder
-
@Sidewinder: Dann habe ich das falsch verstanden. New gibt also den Zustand nach der Änderung und Old den Zustand vor der Änderung an. Aber wie kriege ich heraus ob im Update Stmt ein Preis für das Dutzend angegeben wurde?
Fall 1: Es wird ein Update-SQL Stmt erstellt in dem beide Preise enthalten sind. In diesem Fall soll der Trigger nicht auslösen, da der User selbst Angaben gemacht hat.
Fall 2: Es wird nur der Einzelpreis geändert. Dann soll sich der DutzendPreis mit anpassen. (Waren vielleicht vorher 10% Preisrabatt, dann bleibt der erhalten. Muss ich mir aber noch überlegen was da genau geschehen soll.)
Fall 3: An den Preisen ändert sich nichts, dann soll der Trigger auch nichts machen.@hustbaer: Es ist eine Übungsaufgabe. Ich habe mir nur ein Bsp aus dem Netz genommen und da stand DB2SQL dran. Das Mode Stmt scheint es in anderen SQL Dialekten nicht zu geben. ->Ich lasse es dann weg. UPDATED() gibt es in SQL nicht. Wenn es eine Funktion ist, kann ich es nicht so gut gebrauchen, da der Schwerpunkt der Vorlesung SQL ist.
-
Ich glaube, hustbaer meint, das gehört oben beim Trigger dran.
Evtl. geht auch "BEFORE UPDATE ON Obst(Spaltenname)". Das ist von DB zu DB verschieden, Google da einfach mal danach.
MfG SideWinder
-
Er. Ich denke es heisst UPDATE(row) und nicht UPDATED(row).
Naja, egal.
Ja, es ist eine Funktion, aber eine SQL Funktion.
Verwendung eben innerhalb von triggern.CREATE TRIGGER .... AS BEGIN IF UPDATE(spalte_so_und_so) BEGIN ... END END
-
Vielen Dank Hustbaer
ich habe es so übernommen:
IF UPDATE(Col1) AND NOT UPDATE(Col1) BEGIN
...Da eh kein reales RDMS vorgegeben war eicht mir der Source.
-
jopp, genau so müsste das passen.