SQL - 触发器停止插入数据

时间:2017-01-24 21:12:05

标签: sql sql-server triggers insert

我创建了下面的触发器并检查插入数据是否正确。 我生成一些测试数据并想插入它。当第一个“插入”不正确时,它会停止插入其他测试数据。

是否可以这样做,当它找到不正确的数据时会跳过它并转到下一个“插入”?

我使用MS SQL Server。

create trigger ReservedPlacesLimited on ConferenceParticipants
After insert, update as
begin
    if exists(select cp.ConfReservID, cr.places
        from ConferenceParticipants as cp
        inner join ConferenceReservation as cr on cp.ConfReservID=cr.ConfReservID
        group by cp.ConfReservID, cr.places having cr.Places<COUNT(cp.confPartID) )
    begin
        RAISERROR('Error: Too much participants from this reservation', 16,1);
        Rollback Transaction;
    end
end
go

1 个答案:

答案 0 :(得分:0)

在SQL Server中,您需要知道触发器中有两个名为Inserted和Deleted的伪表。对于插入,您将需要引用插入的表,其中包含正在处理的精确记录以进行插入。更新将引用Inserted(新值)和Deleted(旧值),Delete上的触发器将引用Deleted表。

您需要了解的另一件事是触发器对一组记录进行操作,而不是一次一个。即使您的应用程序一次只提交一条记录,您仍然需要在发送多条记录时测试结果,因为迟早有人会从特殊情况的查询窗口中执行此类插入。

因此,如果你想让一些小组失败,但不是全部失败,那么逻辑就会变得复杂得多。在您的情况下,我将使用当前日期时间设置变量,并使用当前用户设置一个变量(或创建批次编号)。然后我会让触发器仅选择将通过检查并将它们插入表中的记录。然后我会选择那些失败的并将它们和日期时间和用户变量插入到异常表中,然后将错误消息传递出去但包含异常表的名称,这样他们就可以找到不良记录。然后我可以在您的应用程序中添加一个屏幕,以便他们可以看到被拒绝的记录这是一个复杂的过程,并且难以纠正,用户可能会误解所发生的事情。

但是,我个人更愿意拒绝整个插入内容,因为用户可能希望选择从列表中删除哪些内容而不是仅仅删除过程中的最后一个或者按姓氏或其他顺序排序的内容。您在触发器中使用的业务规则。

最终,这是业务规则中的一个问题。首先,如果有太多或者您需要拒绝所有记录并让它们重新提交,您需要确切地知道哪些记录应该被拒绝。我个人会让他们知道他们应该在错误消息中有多少。类似的东西:

  

提交了20名参与者,但只有10个可用的名额。   请在调整数据后重新提交。

当然,数字可以通过变量填充为p [触发器的艺术