我必须在一个小型系统中进行一些更改,该系统将数据存储在一个表中,如下所示:
TransId TermId StartDate EndDate IsActiveTerm
------- ------ ---------- ---------- ------------
1 1 2007-01-01 2007-12-31 0
1 2 2008-01-01 2008-12-31 0
1 3 2009-01-01 2009-12-31 1
1 4 2010-01-01 2010-12-31 0
2 1 2008-08-05 2009-08-04 0
2 2 2009-08-05 2010-08-04 1
3 1 2009-07-31 2010-07-30 1
3 2 2010-07-31 2011-07-30 0
规则是:
注意: IsActiveTerm是一个依赖于CurentDate的计算列,因此不是确定性的
我需要确保条款不重叠。换句话说,即使插入/更新多行,我也希望强制执行此条件。
我在想的是添加一个“INSTEAD OF”触发器(对于Insert和Update),但这需要使用游标,因为我需要处理多行。
有没有人有更好的主意?
答案 0 :(得分:3)
你可以找到关于时态数据库的几乎所有内容:Richard T. Snodgrass,“在SQL中开发面向时间的数据库应用程序”,Morgan-Kaufman(2000),我认为已经绝版但可以通过链接到他的publication list
答案 1 :(得分:2)
我有工作解决方案:
CREATE TRIGGER TransTerms_EnsureCon ON TransTerms
FOR INSERT, UPDATE, DELETE AS
BEGIN
IF (EXISTS (SELECT *
FROM TransTerms pT
INNER JOIN TransTerms nT
ON pT.TransId= nT.OfferLettingId
AND nT.TransTermId = pT.TransTermId + 1
WHERE nT.StartDate != DATEADD(d, 1, pT.EndDate)
AND pT.EndDate > pT.StartDate
AND nT.EndDate > nT.StartDate
)
)
RAISERROR('Transaction violates sequenced CONSTRAINT', 1, 2)
ROLLBACK TRANSACTION
END
P.S。非常感谢wallenborn!