注册 登录
编程论坛 SQL Server论坛

请帮个忙!这个触发器实现了一个什么功能

jimmy1982 发布于 2007-01-17 10:45, 1395 次点击
create trigger deltrigger on employee for
delete
as
if @@rowcount=0
return
if @@rowcount>1
begin
rollback transaction
raiserror('you can only delete one information at one time',16,1)
end
return
13 回复
#2
Kendy1234562007-01-17 11:02
楼主是英文不过关吗?
raiseerror连错误描述都给出来了 还问是实现什么功能...

这个trigger实现的功能就是 一次操作只允许删除一条记录 如果超过一条 就拒绝并报错
#3
棉花糖ONE2007-01-17 11:28
create trigger deltrigger on employee for
delete
as
if @@rowcount=0
return
if @@rowcount>1
begin
rollback transaction
raiserror('you can only delete one information at one time',16,1)
end
return

这个是比较好的触发器写法(英文书上说),楼主去查一下@@rowcount的帮助就能看懂了.不会的就去查帮助,帮助的解释比较清楚
#4
jimmy19822007-01-17 11:29

raiserror 拼写是对的,我删除三条记录,他也能成功

#5
棉花糖ONE2007-01-17 11:31
对啊,删除三条当然能成功啦,
if @@rowcount=0
return
这一句才是这个触发器的优秀所在
#6
jimmy19822007-01-17 11:50

什么时候会弹出raiserror('you can only delete one information at one time',16,1)的提示信息,if @@rowcount=0
return不理解,
if @@rowcount>1
begin
rollback transaction
raiserror('you can only delete one information at one time',16,1)
end
是说删除的行数大于一行的话就执行begin----end 中的语句麻?还是另有意思?

#7
棉花糖ONE2007-01-17 11:54

删除的数多于一条的话就不能让它删除.删除数多于一条就会有警告,这个触发器就是控制只能删除一条的
if @@rowcount=0
return
没有记录被删除就退出触发器.避免它在触发器中逗留的时间过长

#8
jimmy19822007-01-17 11:57

我一次删除三条它都不告警呀!

#9
棉花糖ONE2007-01-17 12:18

drop trigger deltrigger
go
create trigger deltrigger on tb after
delete
as
if @@rowcount=0
return
if ( select count(*) from deleted )>1
begin
rollback transaction
raiserror('you can only delete one information at one time',16,1)
end
改成这个吧,不知道你那个为什么不行


create trigger deltrigger on tb after
delete
as
declare @count int
set @count=@@rowcount
if @@rowcount=0
return
if @count>1
begin
rollback transaction
raiserror('you can only delete one information at one time',16,1)
end

这样也行.可能是@@rowcount的使用有限制吧,具体的我也不清楚

#10
jimmy19822007-01-17 14:15
drop trigger upord
go
create trigger upord on orders
after update
as
declare @row int
set @row = @@rowcount
if @row = 0
return
if (update(p_name))
begin
if @row > 1
begin
rollback transaction
raiserror('you can only one information at one time',16,1)
end
return
update p set p.p_name = i.p_name from product p,inserted i,deleted d where p.p_name = d.p_name
end

我想要实现修改orders的p_name时,product的p_name也更新了,我这样写问题在那里?
#11
李彬2007-01-17 17:58

楼主也可以在触发器里面声明一个用来表示行数的变量啊!

#12
jimmy19822007-01-18 09:54
if (columns_update() & 14) /*表示第2、、3、4列修改时,执行下面的语句

那位大哥帮忙指点一下,是怎么计算的第2、、3、4列,谢谢!!!
#13
chenxkfox2007-01-18 11:01

这样就可以
alter trigger deltrigger on t_user for
delete
as
if @@rowcount=0
return
else
begin

rollback transaction
raiserror('you can only delete one information at one time',16,1)
end
return

这样也可以
alter trigger deltrigger on t_user for
delete
as
if @@rowcount=0
return
if @@rowcount<>1
begin

rollback transaction
raiserror('you can only delete one information at one time',16,1)
end
return

由此可见
@@rowcount>1 这个判断条件是不行的

#14
LouisXIV2007-01-20 08:33
以下是引用jimmy1982在2007-1-18 9:54:36的发言:
if (columns_update() & 14) /*表示第2、、3、4列修改时,执行下面的语句

那位大哥帮忙指点一下,是怎么计算的第2、、3、4列,谢谢!!!

MSDN上有说明的

power(2,2-1)+power(2,3-1)+power(2,4-1)=14

你没有好好查过吧

1