日期:2014-05-18  浏览次数:20700 次

求助,一个这样的触发器应该怎么写?
表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=