Comportamiento extraño del disparador de inserción de SQL Server 2000 & # 8212; Me gusta recursivo

StackOverflow https://stackoverflow.com/questions/613447

  •  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 =)

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top