确保SQL Server中的数据完整性

时间:2009-09-29 12:46:43

标签: sql-server sql-server-2005 database-design

我必须在一个小型系统中进行一些更改,该系统将数据存储在一个表中,如下所示:

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

规则是:

  • StartDate必须是之前的 术语EndDate + 1天(术语不能重叠
  • 每笔交易有很多条款
  • 术语长度为1到n天(I 在这个例子中做了1年使其更简单)

注意: IsActiveTerm是一个依赖于CurentDate的计算列,因此不是确定性的

我需要确保条款不重叠。换句话说,即使插入/更新多行,我也希望强制执行此条件。

我在想的是添加一个“INSTEAD OF”触发器(对于Insert和Update),但这需要使用游标,因为我需要处理多行。

有没有人有更好的主意?

2 个答案:

答案 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!