2017-07-23 2 views
0

Ich bin neu in SQL Server und löst aus. Ich habe einen vorhandenen Auslöser, den ich anpassen muss. Es gibt zwei Tabellen Produkte (die die Gesamtmenge der Produkte im Bestand enthält. Menge) und OrdersLines (die alle Informationen über Aufträge enthält. Eine Beispielzeile hätte OrderID, ProductID und Betrag) Wenn ich ein Produkt bestelle Betrag ist reserviert. Ich brauche den Trigger, um zu überprüfen, ob die neue bestellte Menge nicht über die Menge hinausgeht. Wenn dies der Fall ist, werfen Sie RAISERROR, wenn nicht, lassen Sie die Transaktion weiterlaufen.Einfügen/Update-Trigger in SQL-Server, um Werte zu überprüfen

Ich habe Probleme mit der Identifizierung der Gesamtzahl der Bestellung, um die Menge auf Lager zu überprüfen.

Trigger ist für OrdersLines Tabelle ich von etwas entlang der Linien zu tun, dachte:

IF EXISTS ((SELECT * 
      FROM Products AS p 
      JOIN inserted AS i 
      ON p.ProductID = i.ProductID 
      JOIN OrdersLines AS o 
      ON p.ProductID = o.ProductID 
      WHERE (SUM(o.Amount) + i.Amount) <= p.Quantity) 
BEGIN 
    GOTO ContinueTransaction 
END ELSE BEGIN 
    GOTO RollbackTransaction 
    END 

aber ich denke, das ist nicht richtig. Auch in ELSE brauche ich RAISERROR, um zu informieren, dass die Bestellung nicht hinzugefügt wurde, aber ich bin mir nicht sicher, wie. Es gibt Argumente, die ich im Moment darlegen muss und die mich verwirren.

Antwort

0
create trigger CheckOrderAmount 
On orderLines 
for insert, update 
As 
Begin 
Set NoCount On; 

    if exists (Select * from inserted I 
       join products p 
        on p.ProductID = i.ProductID 
       group by i.ProductID 
       having SUM(i.Amount) > p.Quantity) 
    begin 
     rollback transaction 
     raiserror("There are not enough items in inventory", 16, 1) 
    end 
end 
+0

doesnt eingefügt Tisch bestehen nur aus eingeführt (neu) Reihen? Oder mit anderen Worten, es hat keine Zeilen, die vor dem Einfügen existierten? edit: und würde auch nicht Beispiel Rollback-Transaktion, wenn es genug von Artikeln auf Lager sind? und auch, wenn es nicht zu viel ist, warum "16, 1"? – NulisDefo

+0

Ja, aber es hat alle Spalten, einschließlich derjenigen, die Sie nicht geändert haben. Und aktualisieren Sie nicht die Menge in der Tabelle Produkte nach dem Einfügen der Bestellung? Wenn Sie es sind, dann müssen Sie nur sicherstellen, dass diese neuen Bestellungen die * aktuelle * Menge nicht überschreiten, oder? –

+0

Und es rollt nur zurück Transaktion, wenn die Summe der Menge in eingefügten (neuen) Bestellungen die aktuelle Menge überschreitet. Der Rollback befindet sich innerhalb des Begin-End-Blocks, der davon abhängig ist, dass das Existiert ist. –

0

Problem mit folgenden gelöst. für Insert-Trigger:

IF EXISTS (SELECT * 
      FROM atbv_Sales_Products p 
      JOIN inserted i 
      ON p.ProductID = i.ProductID 
      JOIN atbv_Sales_OrdersLines ol 
      ON p.ProductID = i.ProductID 
      GROUP BY i.ProductID, i.Amount, p.Quantity 
      HAVING (SUM(ol.Amount) + i.Amount) > p.Quantity) 
BEGIN 
    DECLARE @ProductName NVARCHAR(60) 
      SET @ProductName = (SELECT p.ProductName 
            FROM atbv_Sales_Products p 
            JOIN inserted i 
            ON i.ProductID = p.ProductID) 
      RAISERROR ('----There is not enough items (%s) left----', 18, 1, @ProductName) ROLLBACK TRANSACTION 
      RETURN 
END 

für Update-Trigger:

IF EXISTS (SELECT * 
      FROM atbv_Sales_Products p 
      JOIN atbv_Sales_OrdersLines ol 
      ON ol.ProductID = p.ProductID 
      GROUP BY p.ProductID, ol.Amount, p.Quantity 
      HAVING SUM(ol.Amount) > p.Quantity) 
BEGIN 
    DECLARE @ProductName NVARCHAR(60) 
      SET @ProductName = (SELECT p.ProductName 
            FROM atbv_Sales_Products p 
            JOIN atbv_Sales_OrdersLines ol 
            ON ol.ProductID = p.ProductID 
            GROUP BY p.ProductID, ol.Amount, p.Quantity, p.ProductName 
            HAVING SUM(ol.Amount) > p.Quantity) 
      RAISERROR ('----There is not enough items (%s) left----', 18, 1, @ProductName) ROLLBACK TRANSACTION 
      RETURN 
END      
Verwandte Themen