读书人

又是触发器的有关问题所引发的有关问题

发布时间: 2012-01-26 19:40:46 作者: rapoo

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

首先我用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()

读书人网 >SQL Server

热点推荐