SQL 触发器问题 写了个触发器 表里有同数据的时候不行插入

大飞为 2017-12-14 04:58:57
代码入选
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER trigger [dbo].[T_addStudent]
on [dbo].TBMemberIntegralCode
for insert
as
declare @count int
select @count=count(*) from TBMemberIntegralCode where JFcode=(select JFcode from inserted)
if @count>0
begin
ROLLBACK TRAN
end
else
begin
insert into TBMemberIntegralCode select [Member_ID]
,[JFcode]
,[GainIntegral]
,[AvailableIntegral]
,[WorkDate]
,[Type]
,[Results]
,[State]
,[Creator_ID]
,[Creator_Time]
,[ToBranch_ID] from inserted
end




问题是我第一条插入的时候就报错了

消息 3609,级别 16,状态 1,第 1 行
事务在触发器中结束。批处理已中止。

怎么修改~~
...全文
415 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
大飞为 2017-12-14
  • 打赏
  • 举报
回复
引用 5 楼 qq_37170555 的回复:

if @count>0
      begin
       ROLLBACK TRAN
      end
你的问题把这里的0改成1就可以了。触发器是在你插入数据后才执行的,所以你插入第一条数据触发这个触发器的时候,表里面已经有了一条数据了(先插入才会执行触发器的内容,第一条数据已经进了表里了)。因此你把这里的0改成1就没问题了。 但是你这样写这个触发器还是有点问题的。你有没有想过当你一个批处理同时插入多笔记录的时候会发生什么。这个触发器就直接报错了。注意不是回滚而是报错。
对 后面我也发现了这个问题~~
听雨停了 2017-12-14
  • 打赏
  • 举报
回复

if @count>0
      begin
       ROLLBACK TRAN
      end
你的问题把这里的0改成1就可以了。触发器是在你插入数据后才执行的,所以你插入第一条数据触发这个触发器的时候,表里面已经有了一条数据了(先插入才会执行触发器的内容,第一条数据已经进了表里了)。因此你把这里的0改成1就没问题了。 但是你这样写这个触发器还是有点问题的。你有没有想过当你一个批处理同时插入多笔记录的时候会发生什么。这个触发器就直接报错了。注意不是回滚而是报错。
RINK_1 2017-12-14
  • 打赏
  • 举报
回复
你这触发器是不是得用instead of
OwenZeng_DBA 2017-12-14
  • 打赏
  • 举报
回复
IF @count > 0 BEGIN ROLLBACK TRAN; END; 为什么你这里一来就回滚事务。应该是这里报错吧
二月十六 2017-12-14
  • 打赏
  • 举报
回复
试试这样
ALTER  TRIGGER [dbo].[T_addStudent] ON [dbo].TBMemberIntegralCode
    FOR INSERT
AS
    DECLARE @count INT
    SELECT  @count = COUNT(*)
    FROM    TBMemberIntegralCode
    WHERE   JFcode IN ( SELECT   JFcode			--这里返回的是结果集改成in
                       FROM     inserted
                     )
    IF @count > 0
        BEGIN
            ROLLBACK TRAN
        END
    ELSE
        BEGIN
            INSERT  INTO TBMemberIntegralCode
                    SELECT  [Member_ID] ,
                            [JFcode] ,
                            [GainIntegral] ,
                            [AvailableIntegral] ,
                            [WorkDate] ,
                            [Type] ,
                            [Results] ,
                            [State] ,
                            [Creator_ID] ,
                            [Creator_Time] ,
                            [ToBranch_ID]
                    FROM    inserted
        END
吉普赛的歌 2017-12-14
  • 打赏
  • 举报
回复
ALTER TRIGGER [dbo].[T_addStudent]
ON [dbo].TBMemberIntegralCode
FOR  INSERT
AS
BEGIN
	SELECT * 
	INTO #tmp
	FROM INSERTED AS a WHERE NOT EXISTS (
		SELECT 1 FROM TBMemberIntegralCode AS b WHERE a.JFcode=b.JFcode
	)
	
	IF EXISTS(SELECT 1 FROM #tmp)
	BEGIN
		INSERT INTO TBMemberIntegralCode
	    SELECT [Member_ID],
	           [JFcode],
	           [GainIntegral],
	           [AvailableIntegral],
	           [WorkDate],
	           [Type],
	           [Results],
	           [State],
	           [Creator_ID],
	           [Creator_Time],
	           [ToBranch_ID]
	    FROM   #tmp
	END
	
	DROP TABLE #tmp
END
这样看看行不行?

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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