我很难理解如何在两个表之间强制执行一对多的双向强制关系。我有两张桌子,大概是这样的:
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
字段所需的信息。在推迟触发器不可能的情况下,我也很欣赏一些替代解决方案。谢谢你的帮助。
答案 0 :(得分:0)
看起来你的FK错了(或者有错字)。不应该将FK设为TripDays.tripID到Trips.tripId吗?
您能提供有关存储过程的信息吗?看起来填充TripDays的proc应该可以在Trips中运行,所以不确定它会如何违反FK。
答案 1 :(得分:0)
伯爵对错字很正确
将您的代码从第二个sp移动到Trips的更新/插入触发器中以解决您的问题。