代码之家  ›  专栏  ›  技术社区  ›  Hugo

SQL Server 2000奇数插入触发器行为-类似递归

  •  0
  • Hugo  · 技术社区  · 17 年前

    我在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
    

    提前感谢=)

    2 回复  |  直到 17 年前
        1
  •  0
  •   Sam Saffron James Allen    17 年前

    在插入到表中的表\u历史表上是否还有另一个触发器?

        2
  •  0
  •   Anthony K    17 年前

    触发器是基于集合的,所以
    IF (@area = 'L')

    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)限定符。如果它返回多行,那么历史记录表中将插入多行。

    也许作为一种盲目射击,试着为最外层选择一个顶部(1):

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

    否则,看起来好像触发器中正在进行一些递归。我看不到它,但如果需要,可以关闭整个数据库的递归触发,因为它是一个数据库选项。