【问题标题】:How can I stop the execution of a trigger from inside itself?如何从内部停止触发器的执行?
【发布时间】:2014-11-13 03:25:44
【问题描述】:

这里是代码。它是一个在插入之后执行的触发器

 ALTER TRIGGER [dbo].[GameStacker]
 ON [dbo].[CDKeyUser]
 AFTER INSERT AS 
 BEGIN
    INSERT INTO User_Achivement
            ( User_ID ,
            Achivement_ID,
            Date 
            )
    VALUES  ((SELECT User_ID from inserted),
            (SELECT 
                CASE
                    WHEN COUNT(cd.User_ID)=1 THEN   1
                    WHEN COUNT(cd.User_ID)=5 THEN   2
                    WHEN COUNT(cd.User_ID)=10 THEN  3
                    WHEN COUNT(cd.User_ID)=15 THEN  4
                END
            FROM CDKeyUser cd
            WHERE cd.User_ID=(SELECT User_ID from inserted)
            ),                  
            GETDATE()
            )
 END

所以我的问题是这个触发器在每次插入之后执行。(我知道它应该是这样工作的。)但是,如果 WHEN COUNT(cd.User_ID) 的值不是这里指定的值,它应该不执行,或者只是中断执行。如果我在WHEN COUNT(cd.User_ID)=15 THEN 4 之后添加一个 else 语句,我不能在其中包含任何代码,例如 raiseerror,因为它被转换为 Achivement_ID 的值,它给了我一个错误。 所以基本上我必须中断插入语句的执行。

如果有人能帮我解决这个问题,我将不胜感激

【问题讨论】:

  • 它只是以 alter 开头,因为它是创建的,我只是在修改它。

标签: sql-server triggers insert-into


【解决方案1】:

试试这样的。

IF EXISTS (SELECT Count(A.User_ID) cnt
           FROM   CDKeyUser A
                  JOIN inserted B
                    ON a.User_ID = b.User_ID
           HAVING Count(A.User_ID) IN ( 1, 5, 10, 15 ))
  BEGIN
      INSERT INTO User_Achivement
                  (User_ID,Achivement_ID,Date)
      VALUES      ((SELECT User_ID
                    FROM   inserted),(SELECT CASE
                                               WHEN Count(cd.User_ID) = 1 THEN 1
                                               WHEN Count(cd.User_ID) = 5 THEN 2
                                               WHEN Count(cd.User_ID) = 10 THEN 3
                                               WHEN Count(cd.User_ID) = 15 THEN 4
                                             END
                                      FROM   CDKeyUser cd
                                      WHERE  cd.User_ID = (SELECT User_ID
                                                           FROM   inserted)),Getdate() )
  END 

【讨论】:

    【解决方案2】:

    试试:

    if (select count(cd1.User_ID) 
        FROM CDKeyUser cd1
        WHERE cd1.User_ID=(SELECT User_ID from inserted)) IN (1, 5, 10, 15)
    begin
        --your insert statement
    end
    

    完整代码:

    ALTER TRIGGER [dbo].[GameStacker]
     ON [dbo].[CDKeyUser]
     AFTER INSERT AS 
     BEGIN
     if (select count(cd1.User_ID) 
        FROM CDKeyUser cd1
        WHERE cd1.User_ID=(SELECT User_ID from inserted)) IN (1, 5, 10, 15)
     begin
        INSERT INTO User_Achivement
                ( User_ID ,
                Achivement_ID,
                Date 
                )
        VALUES  ((SELECT User_ID from inserted),
                (SELECT 
                    CASE
                        WHEN COUNT(cd.User_ID)=1 THEN   1
                        WHEN COUNT(cd.User_ID)=5 THEN   2
                        WHEN COUNT(cd.User_ID)=10 THEN  3
                        WHEN COUNT(cd.User_ID)=15 THEN  4
                    END
                FROM CDKeyUser cd
                WHERE cd.User_ID=(SELECT User_ID from inserted)
                ),                  
                GETDATE()
                )
      end
      END
    

    【讨论】:

    • 但是 if 语句在这里有效吗?我的意思是它在语法上正确吗?
    【解决方案3】:
    ALTER TRIGGER [dbo].[GameStacker]
     ON [dbo].[CDKeyUser]
     AFTER INSERT AS 
     BEGIN
     if (selet COUNT(User_ID) from CDKeyUser)<=15
     begin
     'your code'
     END
     end 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      相关资源
      最近更新 更多