关于SQL Server触发器的问题

jilate 2006-04-04 09:54:42
我希望在插入新的数据或者修改的时候,有个计划号,这个不能冲突。
我用了自增字段做主键,我用触发器来控制,触发器很简单代码如下
CREATE trigger trg_CheckRepeatNo
on t_Plan
for insert,update
as
declare @NewNo varchar(50)
select @NewNo = PlanNo from inserted
if exists(select * from t_Plan where PlanNo = @NewNo)
begin
raiserror('存在重复的投料单号',16,1)
end
但是发生问题的是,我无论修改什么值,都会提示已经存在重复的投料单号
for语句不是应该在sql语句执行前触发的吗?
例如我随意修改一个计划单号,他都会提示,我新增,也会出现这个提示。哪怕号码不重复。
以前不会这样的啊,是不是哪里设置问题啊?
谢了
...全文
126 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jilate 2006-04-04
  • 打赏
  • 举报
回复
结合了二位朋友的答案,问题成功解决
xeqtr1982 2006-04-04
  • 打赏
  • 举报
回复
如果update操作需要处理的话,
增加一段:
if(@count_ins>0 and @count_del>0) --update操作
.
.
.
.
xeqtr1982 2006-04-04
  • 打赏
  • 举报
回复
CREATE trigger trg_CheckRepeatNo
on t_Plan
for insert,update
as

declare @NewNo varchar(50)
select @NewNo = PlanNo from inserted
declare @count_ins int
declare @count_del int
select @count_ins=count(*) from inserted
select @count_del=count(*) from deleted

if(@count_ins>0 and @count_del=0) --insert操作
if exists(select PlanNo from t_Plan where PlanNo = @NewNo)
begin
raiserror('存在重复的投料单号',16,1)
rollback tran
end
go
huailairen 2006-04-04
  • 打赏
  • 举报
回复
这是真对insert触发器的
CREATE trigger trg_CheckRepeatNo
on t_Plan
instead of insert
as
begin
declare @NewNo varchar(50)
--select @NewNo = PlanNo from inserted
if exists(select * from t_Plan where PlanNo in(select planno from inserted ))
begin
raiserror('存在重复的投料单号',16,1)
end
else
begin
insert into t_plan select * from inserted
end

end
xeqtr1982 2006-04-04
  • 打赏
  • 举报
回复
当你update时,会触发触发器,inserted存放你更新的新记录,所以你查询select * from t_Plan where PlanNo = @NewNo肯定是存在的,因而执行你后面的语句
begin
raiserror('存在重复的投料单号',16,1)
end
huailairen 2006-04-04
  • 打赏
  • 举报
回复
改为instead of insert,update
然后再修改触发器语句

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧