如何将新的更新触发器应用于所有行

时间:2013-03-03 18:04:17

标签: sql-server

我创建了一个简单的触发器:

ALTER TRIGGER [dbo].[idlist_update] ON [dbo].[Store] 
    FOR INSERT, UPDATE 
AS 
BEGIN
    DECLARE @brand varchar(50);
    DECLARE @model varchar(50);
    DECLARE @category varchar(100);
    DECLARE @part varchar(100);

    DECLARE @count int;

    SELECT @count = COUNT(*) FROM inserted;

    SELECT @brand=Brand, @model=Model, @category=AClass, @part=Descript FROM inserted;
    EXECUTE GenerateId_Part @brand, @model, @category, @part;
END

对于由我们的用户(他们使用特殊应用程序)修改的行,它可以正常工作,但我需要将其应用于表中的所有行(超过200.000+)。我试过了:

UPDATE Store SET lastupd={fn NOW()};

但它不起作用。

1 个答案:

答案 0 :(得分:1)

我相信你想要的语法是:

UPDATE dbo.Store SET lastupd = CURRENT_TIMESTAMP;

但是,如果您每次插入或更新单行时更新整个表格,这对我来说似乎相当浪费。为什么不在其他地方存储一次这个事实,而不是将其冗余存储200,000次?它似乎是商店本身的财产,而不是商店中的产品。

另请注意,您的触发器无法正确处理多行操作。你不能这样做“从inserted”技巧中分配一个变量,因为如果一个语句插入两行,你只会影响一个任意行。与某些平台不同,在SQL Server中触发fire per statement ,而不是每行。如果您显示存储过程GenerateId_Part的作用,我们可以帮助您解决此问题。