Поведение нечетного триггера SQL Server 2000 & # 8212; Рекурсивный лайк
-
03-07-2019 - |
Вопрос
У меня есть триггер в таблице в 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 Есть какие-нибудь подсказки по этому поводу? Я делаю что-то неправильно? Р>
Заранее спасибо =)
Решение
Триггеры устанавливаются на основе, так что делать
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 ...
В противном случае это выглядит так, как будто в триггере происходит некоторая рекурсия. Я не вижу его, но если вы хотите, вы можете отключить рекурсивный запуск для всей базы данных, так как это опция базы данных.
Другие советы
Есть ли еще один триггер в таблице Table_History, который вставляется в таблицы? Р>