Поведение нечетного триггера SQL Server 2000 - рекурсивный лайк - PullRequest
0 голосов
/ 05 марта 2009

У меня есть триггер в таблице в SQL Server 2000, это триггер:

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

Теперь, когда они вставляют запись в «Таблицы», вызывается триггер, но он продолжает вставлять много-много записей в Table_History.

Я разговаривал со своими сверстниками, и, похоже, в этом нет ничего плохого! = S Есть какие-нибудь подсказки по этому поводу? Я делаю что-то неправильно?

Заранее спасибо =)

Ответы [ 2 ]

0 голосов
/ 05 марта 2009

Триггеры устанавливаются на основе, так что
IF (@area = 'L') будет смотреть только на первую запись из вставленной таблицы. Попробуйте добавить проверку как часть предложения 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'

Вы уверены, что основной оператор Select возвращает только одну строку? Я заметил, что вы широко использовали квалификатор Top (1). Если он возвращает более одной строки, в таблицу истории будет добавлено более одной строки.

Возможно, в качестве слепого выстрела, попробуйте поставить Top (1) для крайнего выбора:

    INSERT INTO Table_History
    SELECT TOP(1) (SELECT TOP 1 ...

В противном случае это выглядит так, как будто в триггере происходит некоторая рекурсия. Я не вижу его, но при желании вы можете отключить рекурсивный запуск для всей базы данных, поскольку это опция базы данных.

0 голосов
/ 05 марта 2009

Есть ли еще один триггер в таблице Table_History, который вставляется в таблицы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...