【问题标题】:Conditional after trigger触发后的条件
【发布时间】:2013-09-16 05:57:12
【问题描述】:

我需要创建一个后触发器。 (仅在触发后)。我认为我在正确的轨道上,但似乎无法让它正确执行。它似乎总是执行触发器并在所有插入语句上显示错误消息,而不是仅在存在重复时。这就是我所拥有的;

    CREATE TRIGGER Copies
    ON table
    AFTER INSERT

    AS
    Declare @number int 
    Set @number = (Select Count(*) from inserted)

    If @number >0
       (
       SELECT *
       FROM table O
       JOIN inserted AS i 
       ON t.q_id = i.q_id 

       WHERE O.username = i.username 
        AND t.q_id = i.q_id
       )

    BEGIN
            RAISERROR ('Already answered', 16, 1);
            ROLLBACK TRANSACTION;
            RETURN 
    END;
    GO

附言。 请不要回复触发器。谢谢:)

【问题讨论】:

  • 简单注释t在哪里被别名?
  • 还有为什么你尝试使用 () 封装条件语句时没有报错...不应该是 IF(@Number>0) BEGIN ....END ELSE BEGIN rolbackcode这里END
  • 抱歉,SELECT * FROM table O -- 这个 O 意味着要插入 JOIN,因为我在脚本中对其进行了更改。没有区别:/
  • sql server 管理工作室
  • sql server management studio 不是 DBMS,它只是一个用于访问 SQL Server 的程序(尽管它很智能)。

标签: sql triggers conditional


【解决方案1】:
If (NOT EXISTS(..code to test for existance ))
 BEGIN    
            RAISERROR ('Already answered', 16, 1);
            ROLLBACK TRANSACTION;
            RETURN 
 END

【讨论】:

  • 还有什么想法吗?
【解决方案2】:

使用count尝试这个新触发器

CREATE TRIGGER Copies
ON table
AFTER INSERT

AS
DECLARE @Counter int
SELECT @Counter = COUNT(*)
FROM table T
JOIN inserted AS i 
    ON T.username = i.username 
    AND t.q_id = i.q_id
GROUP BY T.username, t.q_id 

If (@Counter > 1) 
BEGIN
        RAISERROR ('Already answered', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN 
END;
GO

【讨论】:

  • 同样的问题,即使插入语句具有唯一数据,也会收到此消息。 Msg 50000, Level 16, State 1, Procedure Copies, Line 19 已经回答 Msg 3609, Level 16, State 1, Line 2 事务在触发器中结束。该批次已中止。
  • 很遗憾,同样的问题。数据是唯一的,并且仍然触发触发器。 :(
  • 你是否每次都删除并创建触发器?
  • 是的,我在脚本开头就这样做了。
  • 我不知道那里有什么问题。你能运行第三个添加位的脚本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
相关资源
最近更新 更多