求助,一个这样的触发器应该怎么写?
表A:
关键字段:status,值可能为1或2或3或4或5.
表B:
也有同样的字段:status
表A中有N条记录,表B中只有一条记录,记录目前所处的状态,status.
当表A中的某条记录的状态字段[status]被修改时,则触发:
1,先判断如果表A中的N条记录的状态[status]是否全部一致,为相同状态,如果是,则把当前统一的状态[status]更新到表B中.
例如:当修改表A中某一条记录的status=2时,表A中N条记录的状态都是2,则更新表B中的status=2.
2,如果表A中的状态[status]的值不统一,则不更新表B.
我是这样写的,总感觉有点不对,还请高手指点.
--**************************************************************
--新的触发器,当状态为5时,自动备份表
CREATE TRIGGER [TR_GET_STATUS] ON dbo.A
FOR UPDATE
AS
declare @tt int --status是否全部一个状态
declare @status_new nvarchar(50)
declare @description nvarchar(500)
if update(status)
begin
select @tt=count(distinct status) from A
if @tt = 1
--全部状态统一 则触发
begin
select @status_new=status from inserted --最新的状态
if @status_new = 1
set @description = '状态1 '
if @status_new = 2
set @description = '状态2 '
if @status_new = 3
set @description = '状态3 '
if @status_new = 4
set @description = '状态4 '
if @status_new = 5 --如果状态为5,则增加了备份数据表的功能
begin
set @description = ' 完成 '
--备份表
--EXEC sp_bak_tbl;
end
--更新状态表
update B set status=@status_new,description=@description where id=1
end
end
--**************************************************************
------解决方案--------------------1、status 这个字段是什么类型的?
2、if @status_new = 1
set @description = '状态1 '
if @status_new = 2
set @description = '状态2 '
if @status_new = 3
set @description = '状态3 '
if @status_new = 4
set @description = '状态4 '
if @status_new = 5 --如果状态为5,则增加了备份数据表的功能
begin
set @description = ' 完成 '
--备份表
--EXEC sp_bak_tbl;
end
可以精简为:if @status_new <> '5 '
set @description = '状态 '+ @status_new
else
begin
set @description = ' 完成 '
--备份表
--EXEC sp_bak_tbl;
end
3、update B set status=@status_new,description=@description where id=1
既然只有一条记录,where id=1 可以不要。
------解决方案--------------------select @tt=count(distinct status) from A
if @tt = 1
--全部状态统一 则触发
begin
...
----------------------------
--没有问题
还有这样写好像不支持批量修改,
一条一条修改没有问题,批量修改多条就出问题了?
--------------------------------
出什么问题了?
1、批量修改时触发器执行一次。
2、select @status_new=