具体情况如下:
我本来有table1 和 table2 ,当table1中的数据变化时引起table2对应数据的变化,我写了一个update触发器,触发器的内容很简单,就是把table1的数据求和插入table2中,table2和table1是个一对多的关系!
我现在对table1是没有一条条录入,而是直接导入了一批数据,这样table2中的数据还没有变化,所以我就用一条update语句把table1的数据加1减1更新了一次,这时我发现table2中只有两条数据更新了,其他的都没有更新,说明触发器只对两条数据产生了作用,但是在我的本机上触发器却是可以把所有数据都一次性写入table2中的,所以我想是数据库的设置有问题!
还请各位高手帮帮忙!

解决方案 »

  1.   

    你参考下面的说明,可以找到答案
    关于多行的考虑事项
    在写触发器代码时需要考虑的一个重要问题就是,引发触发器的语句可以是一个影响多行的单一语句,而不仅是影响一行。这在 UPDATE 和 DELETE 触发器中很常见,因为这些语句经常作用于多行。而这在 INSERT 触发器中就比较少见,因为基本的 INSERT 语句只添加一行。然而,由于 INSERT 触发器可由 INSERT INTO (table_name) SELECT 语句激发,所以插入许多行可能导致单个的触发器调用。在下列情况下关于多行的考虑尤为重要:触发器的功能是自动重新计算表中的汇总值,并将结果存储在另一个正在进行的计数中。说明  由于存在对性能的潜在负面影响,不推荐在触发器中使用游标。使用基于行集的逻辑而非游标来设计影响多行的触发器。
    示例
    下例中触发器的目的是在另一个表中存储某列的运行总计。A. 存储单行插入的运行总计
    第一种触发器在一行数据装载入 sales 表中时能很好地进行单行插入。INSERT 语句激发触发器,新行在触发器执行期间装载在 inserted 表中。UPDATE 语句读取该行的 qty 列值,并将其添加到 titles 表的 ytd_sales 列中已有的值上。WHERE 子句则确保已在 sales 表中更新的行与 inserted 表中行的 title_id 相匹配。-- Trigger is valid for single-row inserts.
    CREATE TRIGGER intrig
    ON sales
    AFTER INSERT AS   UPDATE titles
       SET ytd_sales = ytd_sales + qty
       FROM inserted
       WHERE titles.title_id = inserted.title_idB. 存储多行或单行插入的运行总计
    如果要进行多行插入,示例 A 中的触发器可能就不会正确工作;位于 UPDATE 语句 (ytd_sales + qty) 中赋值表达式右边的表达式只能是一个值,而不能是一个值列表。因此该触发器的作用就是获取 inserted 表中任意一行的值,并将其添加到 titles 表中特定 title_id 值的已有 ytd_sales 值上。如果某个 title_id 值在 inserted 表中出现了多次,则可能无法得到预期的效果。为了正确地更新 titles 表,触发器就必须适应 inserted 表中出现多行的可能性。这可以通过 SUM 函数实现,它为 inserted 表中每个 title_id 计算一组行的总计 qty。SUM 函数存放于相关子查询中(SELECT 语句在括号内)。该子查询为 inserted 表中与 titles 表的 title_id 匹配或相关的每个 title_id 返回一个单一值。-- Trigger is valid for multirow and single-row inserts.
    CREATE TRIGGER intrig
    ON sales
    AFTER INSERT AS   UPDATE titles
       SET ytd_sales = ytd_sales +
          (SELECT SUM(qty) -- Correlated subquery.
          FROM inserted
          WHERE titles.title_id = inserted.title_id)
       WHERE titles.title_id IN
          (SELECT title_id FROM inserted)该触发器对单行插入同样适用;qty 值列的总计为单行的总计。不过,使用该触发器时,WHERE 子句中所使用的相关子查询和 IN 运算符需要 Microsoft® SQL Server™ 2000 的额外处理,而这对于单行插入来说是不必的。C. 存储基于插入类型的运行总计
    可以更改触发器以针对不同行数使用最优方法。例如,可以在触发器逻辑中使用 @@ROWCOUNT 函数以区分单行插入和多行插入。-- Trigger valid for multirow and single row inserts
    -- and optimal for single row inserts.
    CREATE TRIGGER intrig
    ON sales
    FOR INSERT AS
    IF @@ROWCOUNT = 1
    BEGIN
       UPDATE titles
       SET ytd_sales = ytd_sales + qty
       FROM inserted
       WHERE titles.title_id = inserted.title_id
    END
    ELSE
    BEGIN
       UPDATE titles
       SET ytd_sales = ytd_sales +
       (SELECT SUM(qty)
          FROM inserted
          WHERE titles.title_id = inserted.title_id)
       WHERE titles.title_id IN
          (SELECT title_id FROM inserted)
    END
      

  2.   

    我想你的问题是在trigger中update另外一个表的记录(多条)吧。
    请你注意inserted,deleted是临时表,成批操作时将有多条记录。
    注意要使用inserted,deleted与你想更新的表join;
    例如
    create trigger example
    on tablea 
    for insert
    as
    update tableb
    set field0=a.field0 from inserted a left join tableb b on 
    a.(..)=b.(..)(..)为连接条件。
      

  3.   

    根据superzhou(学海无涯) 所说的,我把触发器写为:
    CREATE TRIGGER table1_update ON [table1] 
    FOR UPDATE
    AS
    --修改合同信息表
    begin
      update table2 set table2.money = (select  sum (table1.money) from table1 where table1.id = table2.id  ) where table2.id in (select table1.id from inserted )
    end
    然后我用下面那条update语句更新
    update table1.money = table1.money +1 from table1
    可是最后得出的结果还是没有把table2里对应的数据全部更新掉!