我很难理解如何执行两个表之间的一对多双向强制关系。我有两个表,大致类似的东西:SQL Server:如何在事务结束时执行完整性?
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)
);
一般来说,我想为旅行中的每一天,从starts
到ends
,有第二个表中的条目。为此,我准备了两个将数据插入相关表格的程序,我们称它们为createTrip
和createTripDay
。为了填补它们,我首先调用第一个参数starts
和ends
,然后我使用从第一个过程返回的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
字段所需的信息。如果延迟触发是不可能的,我还会欣赏一些替代解决方案。感谢您的帮助。
为了将来的参考 - 当使用Postgres或Oracle时,您可以推迟检查约束,直到事务提交之前。不幸的是,尽管SQL Server至少从SQL99开始被定义,但它并没有提供这个功能。这可以让循环引用(如强制一对多关系)没有问题。 – lared