Comportamento del trigger di inserimento dispari di SQL Server 2000 & # 8212; Mi piace ricorsivo
-
03-07-2019 - |
Domanda
Ho un trigger in una tabella in SQL Server 2000, questo è il trigger:
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
Ora, quando inseriscono un record in " Tabelle " ;, viene chiamato il trigger, ma continua a inserire molti, molti record su Table_History.
Ho parlato con i miei colleghi e sembra che non ci sia nulla di sbagliato! = S Qualche idea su questo? Sto facendo qualcosa di sbagliato?
Grazie in anticipo =)
Soluzione
I trigger sono impostati in base, quindi facendo
IF (@area = 'L')
guarderà solo il primo record dalla tabella inserita. Prova ad aggiungere il segno di spunta come parte della tua clausola WHERE:
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'
Sei sicuro che l'istruzione Select principale restituisca solo una riga? Ho notato che hai utilizzato ampiamente il qualificatore Top (1). Se restituisce più di una riga, nella tabella della cronologia verranno inserite più righe.
Forse come tiro alla cieca, prova a inserire una Top (1) per la selezione più esterna:
INSERT INTO Table_History
SELECT TOP(1) (SELECT TOP 1 ...
Altrimenti sembra che tu abbia una ricorsione in corso nel trigger. Non riesco a vederlo, ma se vuoi, puoi disattivare il trigger ricorsivo per l'intero database, poiché è un'opzione di database.
Altri suggerimenti
Esiste un altro trigger nella tabella Table_History che viene inserito nelle tabelle?