定义一个instead of触发器,工资变动时绝对值不能超过2000,超过2000的不变动工资,不超过2000的则修改工资
修改前的数据库:编号 姓名 性别 年龄 所属部门 工资
---- ------------------------------------------------
1 陈有朋 男 28 项目部 3000
3 刘燕 女 29 项目部 3500
2 孙晓群 女 30 项目部 1000执行
update 员工数据表
set 工资=5000
where 所属部门='项目部'修改后的数据库:编号 姓名 性别 年龄 所属部门 工资
---- ------------------------------------------------
1 陈有朋 男 28 项目部 5000
3 刘燕 女 29 项目部 5000
2 孙晓群 女 30 项目部 1000执行结果:修改了2条记录有1条记录未被修改
以下是我个人做的,可是不对。if exists(select name from sysobjects where name='RM')
drop trigger RM
go
create trigger RM
on 员工数据表
instead of update
asif(select abs(inserted.工资-deleted.工资) from inserted,deleted
where inserted.编号=deleted.编号)<=2000
begin
update 员工数据表
set 员工数据表.工资=inserted.工资
from 员工数据表,inserted
where 员工数据表.编号=inserted.编号print '修改了'+cast(@@rowcount as varchar)+'条记录'
endif(select abs(inserted.工资-deleted.工资) from inserted,deleted
where inserted.编号=deleted.编号)>2000
print '有'+cast(@@rowcount as varchar)+'条记录未被修改'goupdate 员工数据表
set 工资=5000
where 所属部门='项目部'
修改前的数据库:编号 姓名 性别 年龄 所属部门 工资
---- ------------------------------------------------
1 陈有朋 男 28 项目部 3000
3 刘燕 女 29 项目部 3500
2 孙晓群 女 30 项目部 1000执行
update 员工数据表
set 工资=5000
where 所属部门='项目部'修改后的数据库:编号 姓名 性别 年龄 所属部门 工资
---- ------------------------------------------------
1 陈有朋 男 28 项目部 5000
3 刘燕 女 29 项目部 5000
2 孙晓群 女 30 项目部 1000执行结果:修改了2条记录有1条记录未被修改
以下是我个人做的,可是不对。if exists(select name from sysobjects where name='RM')
drop trigger RM
go
create trigger RM
on 员工数据表
instead of update
asif(select abs(inserted.工资-deleted.工资) from inserted,deleted
where inserted.编号=deleted.编号)<=2000
begin
update 员工数据表
set 员工数据表.工资=inserted.工资
from 员工数据表,inserted
where 员工数据表.编号=inserted.编号print '修改了'+cast(@@rowcount as varchar)+'条记录'
endif(select abs(inserted.工资-deleted.工资) from inserted,deleted
where inserted.编号=deleted.编号)>2000
print '有'+cast(@@rowcount as varchar)+'条记录未被修改'goupdate 员工数据表
set 工资=5000
where 所属部门='项目部'
楼主的触发器之对UPDATE有效果。
但是你怎么在后面使用了inserted,deleted
修改前的数据库:编号 姓名 性别 年龄 所属部门 工资
---- ------------------------------------------------
1 陈有朋 男 28 项目部 3000
3 刘燕 女 29 项目部 3500
2 孙晓群 女 30 项目部 1000执行
update 员工数据表
set 工资=5000
where 所属部门='项目部'修改后的数据库:编号 姓名 性别 年龄 所属部门 工资
---- ------------------------------------------------
1 陈有朋 男 28 项目部 5000
3 刘燕 女 29 项目部 5000
2 孙晓群 女 30 项目部 1000执行结果有以下就可以了:修改了2条记录有1条记录未被修改
怎么做呢?
我上面做的是不对的,请不要责怪小弟乱做的。
http://blog.csdn.net/sdhdy/archive/2009/06/07/4249668.aspx
--簡單寫個例子
create table T(id int,qty int)
insert into T select 1,30
insert into T select 2,35
insert into T select 3,10
insert into T select 4,10
insert into T select 5,30
GO
Create trigger tri_t on T
instead of update
as
begin
if update(qty)
update a
set qty=case when abs(b.qty-c.qty)>20
then a.qty
else b.qty
end
from T a, inserted b,deleted c
where a.id=b.id
and a.id=c.id
end
GO
update T
set qty=50
where id in(1,2,3)
GO
select * from T
/*
id qty
----------- -----------
1 50
2 50
3 10 --絕對值超過20
4 10 --不是更新項目
5 30 --不是更新項目
*/
drop trigger RM
go
create trigger RM
on 员工数据表
instead of update
as--绝对值<2000,工资<2000 才變更
if(select abs(inserted.工资-deleted.工资) from inserted,deleted
where inserted.编号=deleted.编号 and delete.工资<2000)<=2000
begin
update 员工数据表
set 员工数据表.工资=inserted.工资
from 员工数据表,inserted
where 员工数据表.编号=inserted.编号print '修改了'+cast(@@rowcount as varchar)+'条记录'
end--其它不變更
if(select abs(inserted.工资-deleted.工资) from inserted,deleted
where inserted.编号=deleted.编号)>2000
print '有'+cast(@@rowcount as varchar)+'条记录未被修改'goupdate 员工数据表
set 工资=5000
where 所属部门='项目部'