Comportamiento extraño del disparador de inserción de SQL Server 2000 & # 8212; Me gusta recursivo
-
03-07-2019 - |
Pregunta
Tengo un activador en una tabla en SQL Server 2000, este es el activador:
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
Ahora, cuando insertan un registro en '' Tablas '', se llama al disparador pero sigue insertando muchos, muchos registros en Table_History.
He hablado con mis compañeros y parece que no hay nada malo! = S ¿Alguna pista sobre esto? ¿Estoy haciendo algo mal?
Gracias de antemano =)
Solución
Los desencadenadores se basan en la configuración, por lo que al hacer
IF (@area = 'L')
solo mirará el primer registro de la tabla insertada. Intente agregar el cheque como parte de su 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'
¿Está seguro de que la instrucción Select principal solo devuelve una fila? Me he dado cuenta de que ha utilizado el calificador Top (1) de forma extensa. Si devuelve más de una fila, habrá más de una fila insertada en su tabla de historial.
Tal vez como un tiro ciego, intente colocar un Top (1) para la selección más externa:
INSERT INTO Table_History
SELECT TOP(1) (SELECT TOP 1 ...
De lo contrario, parece como si tuvieras algo de recursión en el activador. No puedo verlo, pero si lo desea, puede desactivar la activación recursiva para toda la base de datos, ya que es una opción de base de datos.
Otros consejos
¿Hay otro desencadenante en la tabla Table_History que se inserte en Tablas?