SQL Server 2000 Odd Insert Trigger-Verhalten - rekursive Wie
-
03-07-2019 - |
Frage
ich einen Trigger in einer Tabelle in SQL Server 2000 haben, ist dies der Auslöser:
ALTER Trigger [dbo].[Set_Asignado_State] ON [dbo].[Tables]
FOR INSERT AS
BEGIN
DECLARE @area varchar(1)
SELECT @area = Table_Area_ID FROM inserted
IF (@area = 'L')
BEGIN
INSERT INTO Table_History
SELECT (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AS Table_Area_Id,
(SELECT SUBSTRING( CAST( YEAR( GETDATE() ) AS VARCHAR), 3, 2) ) AS Table_Year,
(SELECT TOP 1 Table_Seq AS Table_Seq FROM inserted) AS Table_Seq,
(SELECT TOP 1 ID FROM Table_Status WHERE Description = 'Asignado') AS Status,
'' AS Responsible,
(SELECT TOP 1 OrigDept FROM inserted) AS User_Responsible,
GETDATE() AS [DateTime],
'None' AS Comments
FROM Tables
WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND
Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2) )
IF @@ERROR <> 0
BEGIN
DECLARE @errorMsg NVARCHAR(256)
SET @errorMsg = @@ERROR;
PRINT 'Error Inserting in Table_History'
END
END
END
Nun, wenn sie einen Datensatz in „Tabellen“ einzufügen, der Auslöser genannt wird, aber es hält viele, viele Datensätze auf Table_History einfügen.
Ich habe mit meinen Kollegen gesprochen, und es scheint, dass es nichts falsch! = S Irgendwelche Hinweise auf das? Mache ich etwas falsch?
Vielen Dank im Voraus =)
Lösung
Trigger gesetzt basiert, so tun
IF (@area = 'L')
wird nur auf dem ersten Datensatz aus der eingefügten Tabelle suchen. Versuchen Sie, die Prüfung als Teil Ihrer WHERE-Klausel:
WHERE Tables.Table_Area_Id = (SELECT TOP 1 Table_Area_Id AS Table_Area_Id FROM inserted) AND
Tables.Table_Year = (SELECT SUBSTRING(CAST(YEAR(GETDATE()) AS VARCHAR), 3, 2) )
AND SUBSTRING(Tables.Table_Area_Id, 1, 1) = 'L'
Sind Sie sicher, dass die Haupt-Select-Anweisung nur die eine Zeile zurückgibt? Ich habe bemerkt, dass Sie die Top (1), Qualifier ausgiebig genutzt haben. Wenn es mehr als eine Zeile zurückgibt, dann wird es mehr als eine Zeile in die History-Tabelle eingefügt werden.
Vielleicht als blinder Schuss, versuchen Sie in einem Top setzen (1) für die äußerste wählen:
INSERT INTO Table_History
SELECT TOP(1) (SELECT TOP 1 ...
Ansonsten sieht es aus, als ob Sie einige Rekursion los in dem Trigger haben. Ich kann es nicht sehen, aber wenn Sie möchten, können Sie deaktivieren rekursiv für die gesamte Datenbank Auslösen, da es sich um eine Datenbank-Option ist.
Andere Tipps
Gibt es einen anderen Auslöser auf den Table_History Tisch, das ist das Einfügen in den Tabellen?