数据完整性—防止不适当的行插入到SQL Server数据库中



我有一个帐篷租金表,包含以下列:

RentID, DateStarted, DateEnded, CustomerID, etc.  

DateStarted总是在租期开始时输入,DateEnded初始值为NULL,仅在租期结束时才填充。CustomerID为租用帐篷的客户ID。

我需要做的是防止用户为任何给定的客户(用CustomerID表示)插入新行,如果该客户与DateEnded=NULL有任何租金。

我不知道该怎么做。我想用Check约束,但他们不允许我查看其他行。我在考虑独特的约束,但不知道它们是否可以在这种情况下使用。我在想插入触发器,但我不确定如果条件不满足,我是否可以取消插入。

谢谢你的帮助。

如果您使用的是SQL Server 2008。

CREATE UNIQUE INDEX ix ON Rents(CustomerID) WHERE DateEnded IS NULL

早期版本可以使用索引视图(对于此选项,需要为更新基表的连接正确配置各种SET选项,但在SQL Server 2005中可能已经配置了)

CREATE VIEW dbo.ConstrainRents
WITH SCHEMABINDING
AS
SELECT CustomerID
FROM dbo.Rents 
WHERE DateEnded IS NULL
GO
CREATE UNIQUE CLUSTERED INDEX ix ON dbo.ConstrainRents(CustomerID)

您所描述的听起来更像是您的应用程序逻辑。我认为,当您考虑您的数据库以及您想要执行的"规则"时,请考虑什么会使数据记录出错。从你的描述来看,带有null DateEnded的记录是一条有效的记录。

从我的经验来看,如果你真的需要的话,触发器是很好的,但是非常危险,并且会很快成倍地增加问题的复杂性。

我个人会尽量避免触发,并在我的应用程序端执行该逻辑。

Just my two cents

我建议你看看MS的instead of触发器。文档在这里……http://msdn.microsoft.com/en-us/library/ms175521.aspx

您也可以在传统的插入触发器中使用rollback transaction

最新更新