2016-06-23 8 views
0

Ich erhalte eine Fehlermeldung:Fehler bekommen, wenn der Auslöser zu schaffen

Msg 213, Level 16, State 1, Procedure CUSTOMER_DELETE, Line 37
Column name or number of supplied values does not match table definition

bei dem Versuch, diesen Trigger zu erstellen:

CREATE TRIGGER [DBO].[CUSTOMER_DELETE] 
    ON [DBO].[CUSTOMER] 
    AFTER DELETE 
AS 
BEGIN 

    SET NOCOUNT ON; 

     DECLARE @CustNo INT 

     SELECT @CustNo = DELETED.CustNo  
     FROM DELETED 

     INSERT INTO CUSTOMER 
     VALUES(@CustNo, 'Deleted') 
END 
+0

Der Versuch, um herauszufinden, wie diese Trigger korrekt auszuführen ... Bitte um Hilfe! – Gina

+0

Der unmittelbare Fehler ist die Tatsache, dass Ihre Tabelle "Kunde" offensichtlich viel mehr Spalten als nur die zwei hat, für die Sie Werte bereitstellen. Sie sollten ** immer ** explizit die Spalten definieren, die Sie einfügen möchten: 'INSERT INTO dbo.Customer (CustomerNo, Status) VALUES (@CustNo, 'Deleted');' ...... –

Antwort

0

Der unmittelbare Fehler ist die Tatsache, dass Ihre Tabelle Customer offensichtlich viel mehr Spalten als nur die beiden, für die Sie Werte angeben. Sie sollten immer explizit die Spalten definieren Sie einfügen möchten: INSERT INTO dbo.Customer(CustomerNo, Status) VALUES (@CustNo, 'Deleted'); ...

Aber dann wieder: Wenn Sie einen Kunden löschen - tun Sie wirklich eine neue Zeile in die Kundentabelle einfügen möchten ?? Ich vermute, dass Sie eher wollen Update die bestehende (gelöschte) Zeile mit neuen Werten - verwenden Sie eine UPDATE Anweisung dafür.

Aber die viel tiefer Problem ist, dass Ihr Auslöser MAJOR Konstruktionsfehler hat: Sie scheinen es zu übernehmen werdeeinmal pro Zeile genannt werden - das ist nicht der Fall. Der Auslöser wird einmal pro Anweisung einmal ausgelöst, also wenn Ihre DELETE Anweisung, die diesen Auslöser zum Löschen von 25 Zeilen löscht, erhalten Sie den Auslöser ausgelöst einmal, aber dann Deleted Pseudo-Tabelle wird 25 Zeilen enthalten. Welche dieser 25 Zeilen wird Ihr Code auswählen? Es ist nicht deterministisch, Sie erhalten eine beliebige Zeile und Sie werden ignorieren alle anderen Zeilen. Sie müssen Ihren Trigger neu schreiben, um dies zu berücksichtigen! so etwas wie dieses

setzen sie also alle zusammen, ich übernehmen, was Sie wirklich wollen, ist:

CREATE TRIGGER [DBO].[CUSTOMER_DELETE] 
ON [dbo].[CUSTOMER] 
AFTER DELETE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    -- ONE, single nice set-based UPDATE statement to update 
    -- the "Status" column for those rows that were deleted by 
    -- your DELETE statement 
    UPDATE dbo.Customer 
    SET Status = 'Deleted' -- adapt to what your column is really called here!  
    FROM Deleted d 
    WHERE dbo.Customer.CustomerNo = d.CustomerNo 
END 
Verwandte Themen