sql update trigger 问题

EdsionWang 2015-05-05 09:15:49
假设有表 T_Test (colA, colB, colC, colD),在T_Test表上建立如下触发器

create trigger trigger_triggerupdatetable
on T_Test
after update
as
begin
if update([colA])
begin
update T_Test set colB = newvalue;
end
if update([colB])
begin
update T_Test set colC = newvalue;
end
if update([colC])
begin
update T_Test set colD = newValue;
end
end

当我对colA进行update操作时,触发器能够将每一列都检查一遍?其实目的是想针对某一列修改后,判断该列相关的其他列是否要做修改。有点递归的感觉,不知道这个触发器能不能实现这样效果
...全文
244 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
EdsionWang 2015-05-18
  • 打赏
  • 举报
回复
谢谢各位的回复,最终还是开启了递归
tcmakebest 2015-05-06
  • 打赏
  • 举报
回复
一个计算列的示例:
declare @t table
( dt datetime default(getdate()), y as datepart(yyyy,dt), m as datepart(mm,dt), d as datepart(d,dt) )
insert into @t values ( default )
select * from @t
tcmakebest 2015-05-06
  • 打赏
  • 举报
回复
一条记录中,一个字段的值决定了其他字段的值,那这张表设计得就有问题. 何不把其他字段设成计算列,通过写一个函数来自动计算呢
Tiger_Zhao 2015-05-06
  • 打赏
  • 举报
回复
根本不需要递归的,用ABCDE演示一下
DECLARE @T_Test TABLE(A int, B int,C int, D int, E int)

INSERT INTO @T_Test
SELECT 0, 0, 1, 0, 1 -- 用这个模拟当前行

SELECT * FROM @T_Test

UPDATE @T_Test
SET B = 2
WHERE B = 0
AND C = 1
AND D = 1
AND E = 1

UPDATE @T_Test
SET A = 2
WHERE A = 0
AND B = 1

PRINT '->'
SELECT * FROM @T_Test

          A           B           C           D           E
----------- ----------- ----------- ----------- -----------
0 0 1 0 1
->
A B C D E
----------- ----------- ----------- ----------- -----------
0 0 1 0 1

          A           B           C           D           E
----------- ----------- ----------- ----------- -----------
0 0 1 1 1
->
A B C D E
----------- ----------- ----------- ----------- -----------
0 2 1 1 1

          A           B           C           D           E
----------- ----------- ----------- ----------- -----------
0 1 1 1 1
->
A B C D E
----------- ----------- ----------- ----------- -----------
2 1 1 1 1

          A           B           C           D           E
----------- ----------- ----------- ----------- -----------
1 1 1 1 1
->
A B C D E
----------- ----------- ----------- ----------- -----------
1 1 1 1 1
还在加载中灬 2015-05-06
  • 打赏
  • 举报
回复
递归触发 这个配置默认是关闭的,要主动开启,但是,这个是配置是数据库级别的,改了对整个数据库都有效,不建议开启 最后,因为你都是修改为2不满足修改为1的情况,不需要递归触发啊~
EdsionWang 2015-05-06
  • 打赏
  • 举报
回复
引用 8 楼 ky_min 的回复:
后续节点 前面节点 同级节点 上级节点 这两组概念不一样吗? 没明白
额,没描述清楚吗?那我举个例子 初始状态全部为0, 1. 对B修改为1,此时B的前一个节点A状态为0,那么将A修改为2(如果再此之前已经将A修改为1了,则这步操作不修改A) 2. C,D,E全部为1了(这三个同级),B若为0,那么将B修改为2(同时也要判断A是否需要修改) 后面节点的修改和上面规则一样,不知道这次说清楚了没。暂时不用考虑状态3了。
还在加载中灬 2015-05-06
  • 打赏
  • 举报
回复
后续节点 前面节点 同级节点 上级节点 这两组概念不一样吗? 没明白
EdsionWang 2015-05-06
  • 打赏
  • 举报
回复
引用 4 楼 tcmakebest 的回复:
一个计算列的示例:
declare @t table
( dt datetime default(getdate()), y as datepart(yyyy,dt), m as datepart(mm,dt), d as datepart(d,dt) )
insert into @t values ( default )
select * from @t
谢谢您的回复,学到新知识了。
EdsionWang 2015-05-06
  • 打赏
  • 举报
回复
引用 5 楼 ky_min 的回复:
可以递归触发,但如果你没处理,则会成了无限递归了,虽然实际上,SQLSERVER不会让无限递归发生,但逻辑上那就是错了 你要不举些数据例子,描述一下需求,说不定不需要递归触发
谢谢您的回复。我在写判断的时候就在考虑是否会出现无限递归的事情,但事实上不会出现无限递归发生的情况。 需求是这样:一张顺序图,我把图的每个节点状态放在这张表(每个列值代表该节点状态)。假设图的先后顺序为: A -> B -> (C,D,E) -> F-> G ->(H,I) -> J 。 每个节点有 0(初始状态),1,2,3四种状态,当后续节点状态为1时,判断前面节点是否为0。若为0,则赋值为2。同级的全部为1时,上级节点若为0,则置上级节点为2。 不知道这样的情况用触发器是否有问题。
还在加载中灬 2015-05-06
  • 打赏
  • 举报
回复
可以递归触发,但如果你没处理,则会成了无限递归了,虽然实际上,SQLSERVER不会让无限递归发生,但逻辑上那就是错了 你要不举些数据例子,描述一下需求,说不定不需要递归触发
EdsionWang 2015-05-05
  • 打赏
  • 举报
回复
按行操作这个我知道。问题是,我某一个操作只涉及某一列修改,但这一列值的变化会影响前一列的值(至于前一列变或不变还需要再做判断)。所以就想问问,上面的触发器if判断里面的update执行以后会不会再次触发该触发器,从而达到检查其他列是否需要改变。
shoppo0505 2015-05-05
  • 打赏
  • 举报
回复
你要的功能可以实现。 但是对于你的问题没有实际意义。Insert,Update,delete都是以数据行为操作单元的,不是以列为单位。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧