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

又是触发器的问题所引发的问题, 请指教
我的问题是这样的:

首先我用dataset绑定了一个表   Tab_a
其中Tab_a   中有一个   字段   X_OnOff   (其值为0   或   1,缺省为0)

现在我有一个用户界面   通过上面绑定的Dataset更新数据到Tab_a中,

问题是:
如果X_OnOff   为1   时   如何让前面的更新   失效   (也就是   说   X_OnOff为1
的记录   将保持先前的记录不变)

这样是否可以通过   对   Tab_a   的   UPDATE   触发事件来实现,如果可行,如何写
这个事件

谢谢先

hellowork(一两清风)  
create   trigger   trg_update_Tab_a   ON   Tab_a
for   UPDATE
as
if   exists(select   1   from   DELETED   where   X_OnOff   =   1)
begin
        ROLLBACK   TRANSACTION       /*回滚触发器,使更新失效*/
        RETURN         /*返回*/
end


上面的问题是解决了,但是新的问题又出现了

现在的问题是:
如果用户对于个别的纪录(特殊情况)要求恢复   X_OnOff   到   0的状态   ,
此时   任何更新却不能生效

该如何修改




------解决方案--------------------
create trigger trg_update_Tab_a ON Tab_a
for UPDATE
as
if exists(select 1 from DELETED where X_OnOff = 1)
or exists(select 1 from inserted i join deleted d on d.主键 = i.主键
where i.X_OnOff = 0 and d.X_OnOff = 1 and i.主键 in (个别的纪录))

begin
ROLLBACK TRANSACTION /*回滚触发器,使更新失效*/
RETURN /*返回*/
end
------解决方案--------------------
说说你的个别记录特殊需求是什么样的?

hellowork(一两清风)的触发器是针对所有的X_OnOff = 1记录修改做了回滚操作。
排除掉你的特别操作即可的

------解决方案--------------------
新增个表
create table Tab_a_con(
value int default (0))
触发器改成
create trigger trg_update_Tab_a ON Tab_a
for UPDATE
as
if exists(select 1 from DELETED where X_OnOff = 1) and not exists (select * from Tab_a_con where value = 1)
begin
ROLLBACK TRANSACTION /*回滚触发器,使更新失效*/
RETURN /*返回*/
end

特殊更新时
update Tab_a_con set value=1
update Tab_a set X_OnOff=0 where xxxxxxxx
update Tab_a_con set value = 0
------解决方案--------------------
用户对于个别的纪录(特殊情况)回滚到 X_OnOff 到 0的状态
------解决方案--------------------
create trigger trg_update_Tab_a ON Tab_a
for UPDATE
as
if exists(select 1 from DELETED where X_OnOff = 1)
and exists(select 1 from insertED where X_OnOff = 1)--加的
begin
ROLLBACK TRANSACTION /*回滚触发器,使更新失效*/
RETURN /*返回*/
end
--如果有标识列,可简化条件
------解决方案--------------------
或者专门建个用户,触发器里加上对用户的判断。user_name()