2016-05-28 8 views
0

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üssel
  • status - integer - Werte: 1 für viel beschäftigte und 0 verfügbare

Tabelle 2:

  • id - integer - Primärschlüssel - automatisch generierte
  • id2 - integer - NULL oder der Wert einer ID aus Tab.1
  • status - integer - Wert: 1 für
  • 0 Arbeits
  • col1 gewartet - irrelevant Spalte 1
  • col2 - irrelevant Spalte 2
  • col3 - 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

+0

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 ... –

+0

'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

Antwort

3

Ihre zweite Anweisung den Update-Befehl fehlt:

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 

Sollte

update table2 set table2.status=1, 
      table2.id = (Select TOP 1 id 
       from table1 
       where status=0) 
    join Inserted as i 
    on table2.id= Inserted.id; 

Dies sollte Ihre Fehler beheben, aber Ihr gesamter Auslöser könnte umgestaltet werden, um ein bisschen sauberer zu sein, aber das ist außerhalb des Bereichs der Frage.

+0

Was ist mit' where table2.id = Insert.id '? –

+0

Ich änderte das und keine Fehler jetzt außer einem, es erkennt nicht ,, eingefügt "Msg 4104, Ebene 16, Zustand 1, Prozedur triggerTursporturi, Linie 12 Die mehrteilige Kennung" Insert.id "konnte nicht gebunden werden – Awesome

+0

@Awesome, das war der Punkt meines Kommentars.Sie sollten eine beigefügte Tabelle haben –

Verwandte Themen