具体情况如下:
我本来有table1 和 table2 ,当table1中的数据变化时引起table2对应数据的变化,我写了一个update触发器,触发器的内容很简单,就是把table1的数据求和插入table2中,table2和table1是个一对多的关系!
我现在对table1是没有一条条录入,而是直接导入了一批数据,这样table2中的数据还没有变化,所以我就用一条update语句把table1的数据加1减1更新了一次,这时我发现table2中只有两条数据更新了,其他的都没有更新,说明触发器只对两条数据产生了作用,但是在我的本机上触发器却是可以把所有数据都一次性写入table2中的,所以我想是数据库的设置有问题!
还请各位高手帮帮忙!
我本来有table1 和 table2 ,当table1中的数据变化时引起table2对应数据的变化,我写了一个update触发器,触发器的内容很简单,就是把table1的数据求和插入table2中,table2和table1是个一对多的关系!
我现在对table1是没有一条条录入,而是直接导入了一批数据,这样table2中的数据还没有变化,所以我就用一条update语句把table1的数据加1减1更新了一次,这时我发现table2中只有两条数据更新了,其他的都没有更新,说明触发器只对两条数据产生了作用,但是在我的本机上触发器却是可以把所有数据都一次性写入table2中的,所以我想是数据库的设置有问题!
还请各位高手帮帮忙!
关于多行的考虑事项
在写触发器代码时需要考虑的一个重要问题就是,引发触发器的语句可以是一个影响多行的单一语句,而不仅是影响一行。这在 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
请你注意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.(..)(..)为连接条件。
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里对应的数据全部更新掉!