2012-03-24 100 views
7

我正在对基于SQL Server 2000的传统应用程序进行一些调整,不用说我只想做最小的事情,因为它可能会全部崩溃。INSTEAD OF UPDATE触发器 - 这可能吗?

我有一个用户的大表,tbUsers,与IsDeleted BIT标志。我想将所有当前和未来的IsDeleted = 1用户记录归档到我的归档表tbDeletedUsers中。

移动当前被删除的用户很简单,但我想要一种方法来移动设置了IsDeleted标志的未来用户。我可以在列上使用标准的AFTER触发器,但是我打算在tbUser表中添加一些违反此约束的约束,我希望我的INSTEAD OF UPDATE触发器触发并将记录移动到归档表中?

我想我的问题是......是否有可能在更新某个列时触发INSTEAD OF UPDATE触发器?这是我到目前为止:

CREATE TRIGGER trg_ArchiveUsers 
INSTEAD OF UPDATE ON tbUsers 
AS 
    BEGIN 
     ... 
    END 
GO 

如果是这样一个例子(SQL 2000兼容)将不胜感激!

回答

12

使用UPDATE(columnname)测试,可以在检查触发特定的列是否被更新(再采取具体行动),但你不能有一个触发只对特定列的更新。无论实际更新的目标是哪一列,它都会在执行更新后立即触发。

所以,如果你认为你必须使用INSTEAD OF UPDATE触发,你需要实现两个种类的动作在里面:

1)插入tbDeletedUserstbUsers +删除 - 当IsDeleted被更新(或,更确切地说,更新设置为1);

2)更新tbUsers正常 - 当IsDeleted没有更新(或更新,但未设置为1)。

由于多行可以用一个UPDATE指令进行更新,你可能还需要考虑到一些行可能IsDeleted设置为1和其他人没有。

我不是INSTEAD OF触发一个大风扇,但如果我真的不得不使用一个像你这样的任务,我可能会忽略UPDATE()测试和实施这样的触发:

CREATE TRIGGER trg_ArchiveUsers 
ON tbUsers 
INSTEAD OF UPDATE 
AS 
BEGIN 
    UPDATE tbUsers 
    SET 
    column = INSERTED.column, 
    … 
    FROM INSERTED 
    WHERE INSERTED.key = tbUsers.key 
    AND INSERTED.IsDeleted = 0 
    ; 
    DELETE FROM tbUsers 
    FROM INSERTED 
    WHERE INSERTED.key = tbUsers.key 
    AND INSERTED.IsDeleted = 1 
    ; 
    INSERT INTO tbDeletedUsers (columns) 
    SELECT columns 
    FROM INSERTED 
    WHERE IsDeleted = 1 
    ; 
END 
+1

最新动态( columnName)在SQL Server中不存在。而是使用COLUMNS_UPDATED(columnName)。 http://msdn.microsoft.com/en-us/library/ms186329.aspx – 2013-01-04 21:19:08

+1

谢谢你的评论。你是对的,在SQL Server中没有UPDATES()函数,也没有UPDATED(),正如我最初写的那样。它实际上称为[UPDATE()](http://msdn.microsoft.com/en-us/library/ms187326.aspx)。编辑我的答案,并再次感谢我的错误引起我的注意。 – 2013-01-05 11:44:21

+0

而你似乎也错了,因为COLUMNS_UPDATED()不接受参数。它返回一个位掩码,它反映了调用触发器的语句所影响的所有列。我从来没有使用过这个功能,但是从手册来看,我想我已经有了一个大概的想法。 – 2013-01-05 11:49:48

相关问题