문제

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 테이블에 또 다른 트리거가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top