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.
Danke für den Vorschlag ... aber ein INSTEAD OF-Trigger hatte ebenfalls keine Wirkung.
asdf –
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. –