ich einen Trigger für diese erstellen möchten: Ich habe zwei Tabellen:SQL Server-Trigger für die Aktualisierung eingefügten Zeile
Tabelle 1:
id
- integer - Primärschlüsselstatus
- integer - Werte: 1 für viel beschäftigte und 0 verfügbare
Tabelle 2:
id
- integer - Primärschlüssel - automatisch generierteid2
- integer - NULL oder der Wert einer ID aus Tab.1status
- integer - Wert: 1 für 0 Arbeits
col1
gewartet - irrelevant Spalte 1col2
- irrelevant Spalte 2col3
- irrelevant Spalte 3
und wenn die Mitglieder geben diesen
INSERT INTO table2 (col1, col2, col3)
VALUES (val1, val2, val3);
den Trigger tabelle1 überprüfen und wenn es und verfügbar ID findet (Status = 0) aktualisiert er die eingefügte Zeile table2.id2 = table1.id und table2.status wird 1 sonst bleibt table2.id2 NULL und table2.status wird 0.
Jetzt habe ich es ausprobiert und bekomme immer Fehlermeldungen.
Dies ist mein letzter Versuch:
CREATE TRIGGER myTrigger
ON table2
AFTER INSERT
AS
BEGIN
IF NOT EXISTS (SELECT TOP 1 id
FROM table1
WHERE status = 0)
BEGIN
UPDATE table2
SET status = 0
WHERE table2.id = Inserted.id
END
ELSE
BEGIN
SET status = 1
WHERE table2.id = Inserted.id
SET [email protected] = (SELECT TOP 1 id
FROM table1
WHERE status = 0)
WHERE table2.id = Inserted.id
END
END
und Fehler:
Msg 102, Ebene 15, Status 1, Prozedur MyTrigger, Zeile 17
falsche Syntax in der Nähe von '='.17 Zeile: Set status = 1
Msg 156, Stufe 15, Status 1, Prozedur MyTrigger, Zeile 22
falsche Syntax nahe dem Schlüsselwort 'wo'.Zeile 22: where table2.id = Eingefügt.id
Und wenn Sie großzügig fühlen das nächste, was ich tun müssen, ist einen Trigger zu erstellen, dass, wenn eine Spalte aus gelöscht table2 es den Status der entsprechenden ID in Tabelle 1 auf 0 (verfügbar) setzt
ich bin mit SQL Server 2012
Sie haben eine Menge Fehler in Ihrem Trigger und eine Logik selbst. Sie sagen, Sie können NULL in der Tabelle2 ID-Spalte haben, aber es ist PK mit automatisch generierter Eigenschaft ... –
'eingefügt' und' gelöscht' sind Tabellen, so dass sie die Ergebnisse von Mengenoperationen darstellen können. Das Entwerfen eines Triggers unter der Annahme, dass er immer genau eine Zeile verarbeiten wird, ist im Allgemeinen ein schlechter Plan. Wenn Sie absolut sicher sind, dass es nie mehr als eine Zeile geben wird, dann fügen Sie _please_ eine Überprüfung für die Anzahl der Zeilen hinzu und verwenden 'RaIsError' oder' Throw', um diejenigen, die später kommen, explizit darauf hinzuweisen, dass sie eine inakzeptable Anweisung ausgeführt haben. ('if (wähle Count (*) von eingefügt)> 1 RaIsError ('FooTable_Insert: Nicht mehr als eine Zeile darf verarbeitet werden.', 25, 42) mit log') – HABO