SQL Server:如何在事务结束时强制执行完整性?

时间:2014-12-31 23:44:21

标签: sql-server triggers transactions

我很难理解如何在两个表之间强制执行一对多的双向强制关系。我有两张桌子,大概是这样的:

CREATE TABLE Trips 
(
   tripID int IDENTITY(1, 1),
   starts date NOT NULL,
   ends date NOT NULL
);


CREATE TABLE TripDays 
(
   tripDayID int IDENTITY(1, 1),
   tripID int NOT NULL,
   date date NOT NULL,
   expenses money NOT NULL,
   foreign key ( tripDayID ) references Trips (tripID)
);

一般情况下,我希望从startsends的每一天都能在第二个表格中输入一个条目。为此,我准备了两个将数据插入相关表格的程序,让我们称之为createTripcreateTripDay。为了填充它们,我首先使用明显的参数startsends调用第一个参数,之后我使用已返回的tripID调用第二个参数适当的次数从第一个程序。

为了确保始终保持完整性,我在表Trips上创建了一个触发器,以便在表TripDays缺少相关条目时回滚事务。不幸的是,这个触发器显然无法看到第二个过程的调用尚未进行的更改,因为它们尚未在包装插入的事务中提交:

  BEGIN TRANSACTION;

  -creating the trip
   <- the trigger raises error over violation of the integrity constraints 
  -creating entries in TripDays

  COMMIT;

是否有任何方法可以延迟执行触发器直到事务结束?它通常是AFTER INSERT个。

我能提出的问题的唯一其他解决方案是在触发器中创建条目,但是他们将缺少填充expenses字段所需的信息。在推迟触发器不可能的情况下,我也很欣赏一些替代解决方案。谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

看起来你的FK错了(或者有错字)。不应该将FK设为TripDays.tripID到Trips.tripId吗?

您能提供有关存储过程的信息吗?看起来填充TripDays的proc应该可以在Trips中运行,所以不确定它会如何违反FK。

答案 1 :(得分:0)

伯爵对错字很正确

将您的代码从第二个sp移动到Trips的更新/插入触发器中以解决您的问题。