Comportement du déclencheur d'insertion impaire de SQL Server 2000 - Récursif, comme
-
03-07-2019 - |
Question
J'ai un déclencheur dans une table dans SQL Server 2000, il s'agit du déclencheur:
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
Maintenant, lorsqu'ils insèrent un enregistrement dans "Tables", le déclencheur est appelé mais il continue d'insérer de nombreux enregistrements dans Table_History.
J'ai parlé avec mes pairs et il semble qu'il n'y ait rien qui cloche! = S Des indices à ce sujet? Est-ce que je fais quelque chose de mal?
Merci d'avance =)
La solution
Les déclencheurs sont définis en fonction, donc faire
IF (@area = 'L')
ne regardera que le premier enregistrement de la table insérée. Essayez d’ajouter le chèque dans votre clause 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'
Êtes-vous sûr que l'instruction Select principale ne renvoie que la ligne? J'ai remarqué que vous avez largement utilisé le qualificatif Top (1). S'il renvoie plus d'une ligne, plusieurs lignes seront insérées dans votre table d'historique.
Peut-être en aveugle, essayez de placer un Top (1) pour le choix le plus à l'extérieur:
INSERT INTO Table_History
SELECT TOP(1) (SELECT TOP 1 ...
Sinon, il semble que vous ayez une certaine récursion dans le déclencheur. Je ne le vois pas, mais si vous le souhaitez, vous pouvez désactiver le déclenchement récursif pour toute la base de données, car il s'agit d'une option de base de données.
Autres conseils
Existe-t-il un autre déclencheur dans la table Table_History qui s'insère dans les tables?