SQL Server 2000 Odd Inserir Gatilho Comportamento - recursiva Como
-
03-07-2019 - |
Pergunta
Eu tenho um gatilho em uma tabela no SQL Server 2000, este é o gatilho:
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
Agora, quando inserir um registro em "Tabelas", o gatilho é chamado, mas ele mantém a inserção de muitos, muitos registros em Table_History.
Eu falei com os meus colegas e não parece que não há nada de errado! = S nenhuma pista sobre isso? Estou fazendo algo errado?
Agradecemos antecipadamente =)
Solução
Os gatilhos são definidos com base, de modo a fazer
IF (@area = 'L')
só olhar para o primeiro registro da tabela inserida. Tente adicionar o cheque como parte de sua cláusula 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'
Você tem certeza de que a principal instrução Select só faz retornar a uma linha? Tenho notado que você tenha usado o qualificador Top (1) extensivamente. Se ela retorna mais de uma linha, em seguida, haverá mais de uma linha inserida na sua tabela de histórico.
Talvez como um tiro cego, tente colocar em um Top (1) para o mais externo, selecione:
INSERT INTO Table_History
SELECT TOP(1) (SELECT TOP 1 ...
Caso contrário, parece que você tem algum recursão acontecendo no gatilho. Eu não posso vê-lo, mas se você quiser, você pode desligar recursiva desencadeante para toda a base de dados, uma vez que é uma opção de banco de dados.
Outras dicas
Existe outra gatilhos na tabela isso é Table_History inserção em tabelas?