SQL Server 2000 Odd Insert 트리거 동작 - 재귀와 같은
-
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
이제 "테이블"에 레코드를 삽입하면 트리거가 호출되지만 테이블 _history에 많은 레코드를 계속 삽입합니다.
나는 내 동료들과 이야기를 나 and으며 아무런 문제가없는 것 같습니다! = 이것에 대한 단서가 있습니까? 내가 뭔가 잘못하고 있습니까?
미리 감사합니다 =)
해결책
트리거는 설정되어 있으므로 수행됩니다
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'
메인 셀렉트 문자가 한 행만 반환한다고 확신하십니까? 나는 당신이 상단 (1) 예선을 광범위하게 사용했다는 것을 알았습니다. 하나 이상의 행을 반환하면 기록 테이블에 한 줄 이상이 삽입됩니다.
아마도 블라인드 샷으로, 가장 바깥 쪽을 선택하려면 상단 (1)을 넣으십시오.
INSERT INTO Table_History
SELECT TOP(1) (SELECT TOP 1 ...
그렇지 않으면 트리거에서 재귀가 진행되는 것처럼 보입니다. 볼 수는 없지만 원하는 경우 데이터베이스 옵션이므로 전체 데이터베이스에 대한 재귀 트리거를 끄질 수 있습니다.
다른 팁
테이블에 테이블에 삽입되는 테이블 _history 테이블에 또 다른 트리거가 있습니까?
제휴하지 않습니다 StackOverflow