Hilfe bei Multible-Row-Trigger

sth_Weird

Grünschnabel
Hallo,
ich versuche gerade einen etwas komplexeren Multible-Row-Trigger zu schreiben und da ich mit Triggern noch nicht so viel Erfahrung habe komme ich nicht weiter, und die Multible-Row-Trigger die ich über Mr.Google gefunden habe waren alle nicht das was ich gesucht habe, da die für alle Einträge einfach in einer Folgeabfrage dasselbe gemacht haben, ich muss aber die einzelnen Zeilen behandeln.
Ich erklär mal wie es sein müsste wenn ich eine Zeile hätte...
Also der Insert/Update Trigger für Tabelle1 müsste gucken ob in Tabelle2 für den 1:1 verknüpften Datensatz in Spalte X null steht. Falls ja müsste er in Tabelle3 (darauf verweist wiederum diese Spalte X aus Tabelle2) einen neuen Datensatz anlegen. Die ID dieses neuen Datensatzes müsste nun in Spalte X aus Tabelle2 eingetragen werden. Ich hoffe das ist soweit verständlich. Einen Trigger der genau das macht habe ich schon programmiert und er geht.
Aber wie oben geschrieben, er funktioniert nur für eine Zeile. Es kann aber auch vorkommen dass mehrere Zeilen gleichzeitig eingefügt werden, d.h. die inserted-Tabelle hat mehr als eine Spalte. Und für jede Spalte müsste der Ablauf oben erfolgen. Irgendwie müsste da eine For-Schleife ausenrum. Aber dazu habe ich wie gesagt beim Googlen nichts gefunden weil die Multible-Row Beispiele alle einfacher waren und man nicht jede Zeile gesondert betrachten musste.
Ich hoffe hier befindet sich der ein oder andere Trigger-Guru der Rat weiß :)

Gruß & Danke
sth_Weird
 
Hmmm.

Bei Oracle definierst du dazu einen Trigger mit dem Zusatz
FOR EACH ROW
Alles weiter geht dann von selbst.

Welche DB verwendest Du und wie ist der Trigger definiert?
 
Ach wie doof von mir, hatte die Frage vorher im SQLServer Forum Bereich eines anderen Forums gestellt und ganz vergessen dass ich hier im allgmeinen Bereich bin und das DBMS angeben sollte.
Also ich verwende SQLServer2005. Den Oracle Zusatz kenne ich mittlerweile da ich beim googlen oft auf "Beschwerden" gestoßen bin von Usern die einen Oracle Trigger im SQLServer umsetzen wollen. Sprich, diesen Zusatz gibt es da leider nicht.
Mittlerweile habe ich das Stichwort Cursor gefunden, aber immer mit dem Zusammenhang dass die ganz böse sind und man sie nicht nutzen soll. Laut Beschreibung sehen die Cursor ganz gut aus und scheinen mir weiterhelfen zu können, aber wenn die wirklich so schlimm sind...

Den Trigger für meine betroffene Tabelle habe ich bisher nicht aber einen der genauso ist nur eine Tabelle weniger hat (die Zwischentabelle 2 von oben fehlt) und der geht.
Was er macht: Als allererstes: er geht nur für eine Zeile (ich weiß in dem Fall dass es immer nur eine geben kann insofern wär die Prüfung garnicht nötig gewesen) er guckt ob in einer Spalte der inserted Tabelle ein Wert < 0 drinsteht, falls ja fehlt in einer anderen Tabelle (TextInformations) evtl noch ein Eintrag oder es fehlt eine Verknüpfung dazu. Fehlt der Eintrag komplett wird eine neue ID geholt und ein neuer Eintrag wird erstellt, und die ID wird in die <0 Spalte der Inserted-Tabelle (bzw. natürlich der Original-Tabelle, aber dieselbe die in inserted drin steht) eingetragen. Und das ganze müsste nun im Falle von mehreren Spalten für jede Spalte gemacht werden...
Hier ist erstmal der Trigger:

CREATE TRIGGER insertErrorTexts ON dbo.tErrorCodeGroups FOR INSERT, UPDATE
AS
BEGIN
IF (SELECT Count(*) FROM inserted) > 1
RETURN

ELSE IF EXISTS (SELECT * FROM inserted WHERE (InformationID < 0))
BEGIN
DECLARE @error nvarchar(12),
@errorID bigint

SELECT @error = 'E_' + RTRIM(LTRIM(STR([ErrorCodeNumber]))), @errorID = [ErrorCodeID]
FROM inserted

IF EXISTS (SELECT * FROM TextInformations WHERE GuiConstName LIKE RTRIM(LTRIM(@error)) AND NamespaceID = 2)
RETURN
ELSE
BEGIN
DECLARE @nextTextInfoID bigint

SET @nextTextInfoID = ([dbo].[GetNewTextInformationID]())

INSERT INTO TextInformations (InformationID, GuiConstName, NamespaceID)
VALUES (@nextTextInfoID, RTRIM(LTRIM(@error)) , 2)

UPDATE tErrorCodeGroups
SET InformationID = @nextTextInfoID
WHERE ErrorCodeID = @errorID

END
END

END
 
Zuletzt bearbeitet:
Zurück