列中的Sql Server更新触发器

时间:2013-11-19 00:53:17

标签: sql sql-server sql-server-2008 sql-server-2012

美好的一天。我试图在SQL Server中创建一个内部触发器。我希望触发器基于列中的更新文本更改来执行。我希望列更改有条件。例如,我希望在(列名称)从Scheduled更改为Queued时激活触发器,反之亦然。如果列更改为Complete或其他文本;我不希望触发器发生。

我的代码如下。谢谢

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

1 个答案:

答案 0 :(得分:4)

晚上好,

我想知道你的逻辑。

首先,您只是在寻找更新,对吗? 如果是这样,请从触发器定义中删除FOR INSERT和DELETE。

其次,由于您不熟悉触发器,因此我让他们了解插入和删除的表格。 删除只有一个非空的已删除表格,而插入只有一个非空的已插入表格。

另一方面,更新了两个表都填写了。记录集的前后值。我说记录集可能是多个记录。

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

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

第四,我不明白roastprofile是如何发挥作用的。您只是在寻找可以在两个选定对之间翻转状态的更新。满足该组合时,您需要更新触发器。

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

另外,我将加入记录和测试组合的结果保存到临时表中。然后查询该表,并通过命中数更新触发号码。

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

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