【问题标题】:SQL Server 2000 Odd Insert Trigger Behavior -- Recursive LikeSQL Server 2000 奇数插入触发器行为——递归类似
【发布时间】:2009-03-05 03:04:38
【问题描述】:

我在 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 有什么线索吗?难道我做错了什么?

提前致谢 =)

【问题讨论】:

  • @Hugo:也许你可以用文字解释一下它应该做什么?
  • 同意,但是如果有人想跑步,我们应该能够帮助他们尽量减少可能的副作用
  • 我开始跑步时尝试使用安全眼镜,但我认为这还不够 XD

标签: sql sql-server triggers


【解决方案1】:

触发器是基于设置的,所以这样做
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 ...

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

【讨论】:

  • 抱歉,回复晚了,但我必须解决另一个优先级更高的问题,我会对此进行测试并让您知道会发生这种情况,但我认为这将是答案。再次感谢人 =)
【解决方案2】:

插入到表中的 Table_History 表上是否还有另一个触发器?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多