update触发器为什么不执行?

wea1978 2005-06-06 04:42:54
CREATE TRIGGER updateprice ON [dbo].[j_user]
FOR UPDATE
AS
declare @pf int,@selpf int
set @pf=(select j_pf from j_user where j_int =(select j_int from inserted))
set @selpf=(select j_pf from inserted)
if @pf<>@selpf
begin
if @selpf<60
begin
update j_user set j_price=0 where j_int =(select j_int from inserted)
end
else
begin
if @selpf<80
begin
update j_user set j_price=j_price*0.8 where j_int =(select j_int from inserted)
end
end
end
---------------------不知为什么不执行这个触发器,就算直接在表上面作更新也没有反应
...全文
285 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2005-06-06
  • 打赏
  • 举报
回复
在查询分析器中应该不会有此问题吧?

程序中的话,可能与程序的处理机制有关.


这种触发器产生的是直接递归,默认是禁止的,如果你的数据库是允许直接递归的,那报的错误就不是这个.
wea1978 2005-06-06
  • 打赏
  • 举报
回复
zjcxc(邹建)给的代码可以实现,谢谢了!
wea1978 2005-06-06
  • 打赏
  • 举报
回复
出现错误:
其它用户已修改了该表或视图的内容,你正在修改的数据库行在所在的数据库中已不存在...
-------因为我在update触发器里的update的还是本表的内容,也就是说会触发两次……
这要做其它特别的设置吗?
zjcxc 元老 2005-06-06
  • 打赏
  • 举报
回复
楼主写的是after 触发器,触发器被触发的时候,原表的数据和inserted中的数据一样. 要取update前的数据,应该从deleted中取
hsj20041004 2005-06-06
  • 打赏
  • 举报
回复
原来的数据在表deleted,更新的数据在inserted表中
zjcxc 元老 2005-06-06
  • 打赏
  • 举报
回复
--楼主应该是想实现这样的更新吧?

CREATE TRIGGER updateprice ON [dbo].[j_user]
FOR UPDATE
AS
UPDATE a set
j_price=CASE
WHEN i.j_pf<60 THEN 0
ELSE i.j_price*0.8 END
FROM j_user a,inserted i,deleted d
WHERE a.j_int=i.j_int
AND i.j_int=d.j_int
AND i.j_pf<>d.j_pf
wea1978 2005-06-06
  • 打赏
  • 举报
回复
我的触发器是正常的,因为其它表都可以正确触发...
hsj20041004(光芒)说我取的2个数据是相等的,是真的吗?因为第一次取的是从原表里取的,也会相等吗?
hsj20041004 2005-06-06
  • 打赏
  • 举报
回复
CREATE TRIGGER updateprice ON [dbo].[j_user]
FOR UPDATE
AS
declare @pf int,@selpf int
select @pf=j_pf from j_user where j_int =(select j_int from inserted)
select @selpf=j_pf from inserted
if @pf<>@selpf
begin
if @selpf<60
begin
update j_user set j_price=0 where j_int =(select j_int from inserted)
end
else
begin
if @selpf<80
begin
update j_user set j_price=j_price*0.8 where j_int =(select j_int from inserted)
end
end
end
wea1978 2005-06-06
  • 打赏
  • 举报
回复
谢谢楼上的两位...
如果相等,
请问楼上,那我要怎样才可以取原来的数据和更新的数据进行比较呢?
zjcxc 元老 2005-06-06
  • 打赏
  • 举报
回复
1. 可能是你的触发器被禁用,用下面的语句可以查询你的触发器是否被禁用:
SELECT CASE WHEN OBJECTPROPERTY(OBJECT_ID(N'updateprice'),N'ExecIsTriggerDisabled')=1 THEN N'触发器被禁用' ELSE N'触发器正常' END


2; 可能是你的处理代码问题,触发器被触发了,但代码因为设计错误而没有按照预想的方式执行,导致你误以为没有触发器.
可以在触发器的AS 后面加一句:
RAISERROR('UPDATE啦',16,1)
如果修改数据并保存的时候,收到了错误信息"UPDATE啦",说明是你的代码设计问题.
hsj20041004 2005-06-06
  • 打赏
  • 举报
回复
set @pf=(select j_pf from j_user where j_int =(select j_int from inserted))
set @selpf=(select j_pf from inserted)
上面你的语句中就注定了@pf和@selpf是永远相等的!!!!
orcale 2005-06-06
  • 打赏
  • 举报
回复
你的sql可以簡化如下.刪除原Trigger。新建一次看看

update a set a.j_price=case when b.j_pf<60 then 0 else a.j_price*0.8 end from j_user ,inserted b where a.j_int=b.j_int and a.j_pf!=b.j_pf

34,588

社区成员

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

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