2016-06-16 8 views
0

Ich kann nicht bekommen, was ein einfacher Auslöser sein sollte, um zu arbeiten. Es wird nach INSERT ausgelöst, testet, ob Spalte A null ist, und wenn ja, setzt es auf den Wert von Spalte B in derselben Zeile. Nach der Einfügung, überprüfe ich die eingefügte Zeile und Spalte B hat einen Wert, aber Spalte A ist null. Der Trigger ist aktiviert und wird ausgelöst, weil ich in Verzweiflung Werte an einer Arbeitstabelle an verschiedenen Punkten protokolliert habe, und diese Werte sind, was erwartet wird.Was mache ich falsch mit diesem SQL Server 2012-Trigger?

Ich habe sogar versucht, eine vorübergehende Umgehung dieses Problems zu machen, indem ich in dieser Tabelle in Design gehe und einen "Default Value" von 1000 für diese Spalte festlege, aber es kommt immer noch Null heraus. Und ich habe versucht, den Auslöser zu ändern, um Spalte A auf einen festen Wert von 987 festzulegen, aber es kommt immer noch Null heraus.

Gibt es etwas Idiosynkrasie über Inserts, von denen ich nichts weiß? Jeder Rat wird geschätzt.

HINTERGRUND --------------------------------------------- --------------------------------

OPTIONS ist eine Tabelle, die "Optionen" speichert, die ein Teilnehmer an einem von unseren Veranstaltungen können sich anmelden (zB ein Ticket für die Veranstaltung, ein optionales Steak oder Hühnchen Abendessen, etc.) Diese Optionen werden eingefügt, wenn das Event definiert wird (Termine, Veranstaltungsorte, Kontaktinformationen und die Optionen welche die Teilnehmer haben können registrieren für).

Die Optionen Tabelle:

OptionID INT (Identity, primary key) 
... 
MaxAttendees INT 
... 
AvlbRemainingRegQty INT 

Die letzte Spalte ist die Spalte nicht gesetzt zu werden - es soll ein Lauf insgesamt, wie viele Hühner Abendessen zu verbleiben

verkauft wird Ich dachte, ich wäre verrückt werden und/oder etwas Dummes tun, also habe ich eine zTestTrigger-Tabelle erstellt, um die Werte aus der Zeile INSERTED zu speichern und zu überprüfen, ob der Trigger bestimmte Punkte erreicht hat.

WhichPartOfTest VARCHAR(100) 
OptionID  INT 
AvlbRemRegQty INT 
MaxAttendees INT 

--DETAILS ---------------------------------------- -----------

USE [dbname] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[trig_Options_AvlbRemainingRegQty] 
ON [dbo].[Options] 
AFTER INSERT 
AS 
SET NOCOUNT ON 

DECLARE @I_OptionID INT 
DECLARE @I_AvlbRemainingRegQty INT 
DECLARE @I_MaxAttendees INT 

SELECT 
    @I_OptionID   = I.OptionID, 
    @I_AvlbRemainingRegQty = ISNULL(I.AvlbRemainingRegQty,-1), 
    @I_MaxAttendees  = MaxAttendees 
FROM Inserted I 

insert into zTestTrigger values ('Start of new test - values from INSERTED row are:',@I_OptionID, @I_AvlbRemainingRegQty, @I_MaxAttendees) 

IF ISNULL(@I_AvlbRemainingRegQty,-1) = -1 --(I had also tried checking IF I_AvlbRemainingRegQty IS NULL) 

    begin 

    insert into zTestTrigger values ('About to update table, setting AvlbRemQty = ' + cast(@I_MaxAttendees as varchar) + ' where id = ' + cast(@I_OptionID as varchar), 
@I_OptionID, @I_AvlbRemainingRegQty, @I_MaxAttendees) 

    UPDATE Options SET AvlbRemainingRegQty = @I_MaxAttendees WHERE OptionID = @I_OptionID 

    --Originally, I tried this: 
    --UPDATE OPTIONS SET AvlbRemainingRegQty = ISNULL(MaxAttendees,1000) WHERE OptionID = @I_OptionID 
    --This doesn't work either: 
    --UPDATE OPTIONS SET SET AvlbRemainingRegQty = SELECT ISNULL(MaxAttendees,1000) FROM Options WHERE OptionID = @I_OptionID) WHERE OptionID = @I_OptionID 
    --I even tried: 
    --UPDATE OPTIONS SET AvlbRemainingRegQty = 987 WHERE OptionID = @I_OptionID 

    declare @error int 
    set @error = @@ERROR 
    insert into zTestTrigger values ('@@ERROR is ' + cast(@error as varchar), 0,0,0) --Shows that @Error is 0 

    end 

aus der Tabelle zTestTrigger Auswahl zeigt

"About to update table, setting AvlbRemQty = 1000 where id = 491" , 491, -1, and 1000 

und ich kann die Zeile mit der ID 491, aber seine AVLB Rem Menge ist null wählen.

Antwort

1

Ich würde persönlich verwenden Sie einen instead of Trigger für diese, da es uns ermöglicht, die Daten richtig zu setzen, gleich von Anfang an.

Aber jetzt werden wir die nach Abzug tun:

ALTER TRIGGER [dbo].[trig_Options_AvlbRemainingRegQty] 
ON [dbo].[Options] 
AFTER INSERT 
AS 
    SET NOCOUNT ON 

    UPDATE Options 
    SET 
     AvlbRemainingRegQty = COALESCE(AvlbRemainingRegQty, MaxAttendees) 
    WHERE 
     OptionID in (select OptionID from inserted) 

Und beachten Sie, dass diese Trigger (im Gegensatz zu Ihnen) erkennt an, dass inserted 0 enthalten kann, 1 oder mehrere Reihen. Behandeln Sie es also als eine Tabelle, nicht als etwas, aus dem separate, skalare Variablen können sinnvolle Werte zugewiesen haben.

Genau wie ein anderer Punkt aber:

es soll eine laufende Summe, wie viele Huhn Abendessen zu verbleiben

Im Allgemeinen verkauft werden, dann ist dies eine schlechte Idee. Wenn Sie Details zu jedem Verkauf separat speichern, ist die verbleibende Anzahl ein Wert, der berechnet werden kann. Alles, was Sie tun, ist Speichern solch ein Wert ist eine Gelegenheit für den gespeicherten Wert inkonsistent mit dem Rest Ihrer Daten geben.

+0

Danke für den Vorschlag ... aber ein INSTEAD OF-Trigger hatte ebenfalls keine Wirkung.

asdf –

+0

Ack, brauchte <> 5 Minuten um zu antworten, so verlor es meinen bearbeiteten Kommentar. Dein vorgeschlagener Code sollte offensichtlich funktionieren, aber die Spalte wird immer noch nicht aktualisiert. Ein INSTEAD OF-Trigger hat einen Fehler ausgelöst, den ich als nächstes untersuchen werde. Ich bin nur irgendwie verblüfft - etwas wirklich Grundlegendes ist falsch. Übrigens, ich stimme Ihrem zweiten Punkt zu, aber der Typ, für den ich das tue, ist Senior in unserem kleinen Laden und kümmert sich nicht um Datennormalisierung. –