首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列中的Server更新触发器

列中的Server更新触发器
EN

Stack Overflow用户
提问于 2013-11-19 00:53:17
回答 1查看 6.2K关注 0票数 0

日安。我正试图在Server中创建一个内部触发器。我希望根据列中更新的文本更改执行触发器。我希望更改栏有条件。例如,我希望触发器在(列名)从Scheduled更改为Queued时激活,反之亦然。如果列更改为Complete或其他文本,则不希望触发器发生。

我的代码如下。谢谢

代码语言:javascript
复制
ALTER TRIGGER [WIP].[Trigger] ON [WIP].[Roaster]
AFTER INSERT, update, delete
AS
   if update (roastprofile)
      select status 
      from wip.Roaster
      where status = 'scheduled' and status != 'Complete' and status = 'Queued'

      update controls.TriggerUpdate
      set TriggerNumber = triggernumber + 1
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-19 01:50:47

晚上好,

我在想你的逻辑。

首先,你只是在寻找更新,对吗?如果是,则从触发器定义中删除FOR插入和删除。

第二,由于您对触发器是新手,所以我把它们留在这里,教您如何插入和删除表。delete只有一个非空的已删除表,而insert只有一个非空插入表。

另一方面,更新中的两个表都已填写完毕。记录集的前后值。我说记录集,因为它们可能是多个记录。

http://technet.microsoft.com/en-us/library/ms191300.aspx

第三,请不要将触发器命名为保留字触发器

第四,我不明白烤面包是怎么起作用的。您只是在寻找在两个选定的对之间翻转状态的更新。当该组合满足时,您需要更新触发器。

最后但并非最不重要的是,删除和插入的表可能有多个记录。您将需要在键值(pk)上加入它们。我添加了一个假设的.id,您需要修改它。

此外,我还将加入记录和组合测试的结果保存到一个临时表中。然后查询此表,并根据命中次数更新触发器编号。

我不知道这是否符合您的业务逻辑;但是,它修复了我在您的设计中看到的缺陷。

代码语言:javascript
复制
-- Delete the existing trigger.
IF EXISTS (select * from sysobjects where id = object_id('CustomCode')and type = 'TR')
   DROP TRIGGER [WIP].[CustomCode]
GO

-- Create the new trigger.
CREATE TRIGGER [WIP].[CustomCode] on [WIP].[Roaster]
FOR INSERT, UPDATE, DELETE NOT FOR REPLICATION
AS

BEGIN

    -- declare local variable
    DECLARE @MYMSG VARCHAR(250);
    DECLARE @MYCNT INT;


    -- nothing to do?
    IF (@@rowcount = 0) RETURN;

    -- do not count rows
    SET NOCOUNT ON;

    -- deleted data
    IF NOT EXISTS (SELECT * FROM inserted) 
        BEGIN
            SET @MYMSG = 'DELETE ACTION'
            RETURN;
        END

    ELSE 
        BEGIN

            -- inserted data
            IF NOT EXISTS (SELECT * FROM deleted)
            BEGIN           
                SET @MYMSG = 'INSERT ACTION'
                RETURN;
            END

            -- updated data
            ELSE
            BEGIN
                SET @MYMSG = 'UPDATE ACTION'

                -- get the status before and after
                SELECT 
                    CASE
                        WHEN LOWER(del.status) = 'scheduled' AND LOWER(ins.status) = 'queued' THEN 1
                        WHEN LOWER(del.status) = 'queued' AND LOWER(ins.status) = 'scheduled' THEN 1
                        ELSE 0
                     END AS FLAG
                INTO 
                     #MyTemp
                FROM 
                    inserted as ins JOIN deleted as del ON ins.id = del.id;

                -- Total number of conditions satisfied
                SELECT @MYCNT = SUM(FLAG) FROM #MyTemp;

                -- your business logic
                update controls.TriggerUpdate
                set TriggerNumber = TriggerNumber + @MYCNT;


            END

            RETURN;
       END

END
GO
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20061086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档