【问题标题】:Trigger should be, but is not, recursive, right?触发器应该是但不是递归的,对吧?
【发布时间】:2014-09-17 16:11:37
【问题描述】:

触发器的新手并试图弄清楚为什么此触发器末尾的嵌套IF 似乎不是递归的。我想要的是它一次又一次地触发自己,直到它达到 4 的@ProcessStatus。它只达到 1。不太清楚为什么,有什么建议吗?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[tr_ProcessRecord] ON [dbo].[_ShipMain]
FOR UPDATE
AS
BEGIN TRANSACTION

    declare @cqID nvarchar(24),
            @carrier nvarchar(24),
            @shipCode nvarchar(24),
            @Note nvarchar(255),
            @ProcessStatus nvarchar(24);

    SELECT @cqID = i.ConnectQueryID from inserted i;
    SELECT @carrier = i.Carrier from inserted i;
    SELECT @shipCode = i.ShipCode from inserted i;
    SELECT @ProcessStatus = i.Status from inserted i;
    SELECT @Note = 'ID: ' + @cqID + ' ' +
                   'Carrier: ' + ' ' + convert(nvarchar(24), @carrier) + ' ' +
                   'Ship Code: ' + @shipCode + ' ' +
                   (SELECT CASE @ProcessStatus
                        WHEN 0 THEN 'Recieved'
                        WHEN 1 THEN 'Processing'
                        WHEN 2 THEN 'More Processing'
                        WHEN 3 THEN 'Finishing'
                        WHEN 4 THEN 'Processed'
                    END);

    INSERT INTO [_ShipLog]
    SELECT @cqID
          ,GETDATE()
          ,@Note
          ,@ProcessStatus

    IF @ProcessStatus = 0
    BEGIN
        UPDATE [_ShipMain]
        SET [Status] = @ProcessStatus + 1
        WHERE [ConnectQueryID] = @cqID;
    END
    IF @ProcessStatus = 1
    BEGIN
        UPDATE [_ShipMain]
        SET [Status] = @ProcessStatus + 1
        WHERE [ConnectQueryID] = @cqID;
    END
    IF @ProcessStatus = 2
    BEGIN
        UPDATE [_ShipMain]
        SET [Status] = @ProcessStatus + 1
        WHERE [ConnectQueryID] = @cqID;
    END
    IF @ProcessStatus = 3
    BEGIN
        UPDATE [_ShipMain]
        SET [Status] = @ProcessStatus + 1
        WHERE [ConnectQueryID] = @cqID;
    END

COMMIT TRANSACTION

【问题讨论】:

  • 您希望触发器是递归的?检查RECURSIVE_TRIGGERS 数据库设置。

标签: sql sql-server-2008 tsql recursion triggers


【解决方案1】:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[tr_ProcessRecord] ON [dbo].[_ShipMain]
FOR UPDATE
AS
BEGIN TRANSACTION

    declare @cqID nvarchar(24),
            @carrier nvarchar(24),
            @shipCode nvarchar(24),
            @Note nvarchar(255),
            @ProcessStatus nvarchar(24);

    SELECT 
            @cqID = i.ConnectQueryID
            ,@carrier = i.Carrier
            ,@shipCode = i.ShipCode
            ,@ProcessStatus = i.Status 
        from inserted i;
    SELECT @Note = 'ID: ' + @cqID + ' ' +
                   'Carrier: ' + ' ' + convert(nvarchar(24), @carrier) + ' ' +
                   'Ship Code: ' + @shipCode + ' ' +
                   (SELECT CASE @ProcessStatus
                        WHEN 0 THEN 'Recieved'
                        WHEN 1 THEN 'Processing'
                        WHEN 2 THEN 'More Processing'
                        WHEN 3 THEN 'Finishing'
                        WHEN 4 THEN 'Processed'
                    END);

    INSERT INTO [_ShipLog]
    SELECT @cqID
          ,GETDATE()
          ,@Note
          ,@ProcessStatus

UPDATE [_ShipMain]
        SET [Status] = @ProcessStatus + 1
        WHERE [ConnectQueryID] = @cqID
        and @ProcessStatus in (0,1,2,3)

COMMIT TRANSACTION

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 2021-04-10
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2013-02-01
    • 2017-12-07
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多