【发布时间】:2018-12-16 03:34:07
【问题描述】:
我正在更新系统,尝试创建原始表的“影子”表,通过触发器接收更改,但不使用原始表,因为我真的不喜欢原始程序的设计方式。
其中一个是团队配置表,其中包含所有用户及其团队 ID。具有相同团队 id 的用户属于同一团队。我正在尝试在此处创建触发器以将数据截获到新的团队历史日志中。 (1 行 / 1 个团队 ID) 但是由于在团队设置之后,表格的多行会被更新,并且更新不是批量完成的,因此很难判断新的团队设置何时结束。幸运的是有这个 member_count 列,可以用来统计成员数量,并确定与这个新的 team_id 相关的所有必要记录何时更新。
| team id | uid | member_count |
|201701010800A| 1 | 3 |
|201701010800A| 2 | 3 |
|201701010800A| 3 | 3 |
我的问题是我应该如何在更新后触发器中指定这个条件。 这就是我现在要做的。但这似乎很hacky。我想还有更明智的表达方式。
if exists(
select 1 from ( values (1) ) t(c)
outer apply (
select count(team_id) tc, max(member_count) mx, min(member_count) mm
from old_teamtable
where team_id = ( select top 1 team_id from inserted )
) e
where tc = mx and mx = mm
)
【问题讨论】:
-
Count(team) = member_count with a group by on member_count,team_id 应该可以吗?做同样的事情,但对我来说似乎更简单
-
是的,但我想去掉的部分是
from ( value (1)) t(c) outer apply,感觉有点无意义。 -
我根本不懂触发器,但不幸的是我觉得这个问题很有趣......你能解释一下你需要这个过滤器的输出吗?当 count(Id) = member_count 时,我认为这是一个真实的(布尔值)。一个触发器是否同时处理两个或一个新行/更新?
-
这取决于数据的提交方式,它可以为每个uid执行多个
update set team_id=? where uid=?;,也可以为批量更新执行update set team_id=? where uid in (1,2,3)。我只使用inserted.team_id 来定位新的团队成员,并确定所有成员何时设置了新的team_id,这样我确信我不会错过任何成员。触发器可以多次调用,但只有在时机合适时才起作用。team_id是一个始终唯一的 id,这是它工作的另一个先决条件......
标签: sql-server tsql sql-server-2012 triggers