2

我有一张帐篷租金表,其中包含以下列:

RentID, DateStarted, DateEnded, CustomerID, etc.  

DateStarted总是在租期开始时输入,最初为DateEndedNULL,只有在租期到期时才会被填充。CustomerID是租用帐篷的客户的 ID。

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

我不知道该怎么做。我正在考虑一个检查约束,但它们不允许我查看其他行。我在考虑唯一约束,但不知道在这种情况下是否可以使用它们。我在考虑 On-Insert 触发器,但我不确定如果不满足条件是否可以取消插入。

谢谢你的帮助。

4

3 回答 3

2

如果您使用的是 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)
于 2011-04-04T13:29:17.487 回答
2

您所描述的内容在您的应用程序逻辑方面听起来更多。我认为,当您考虑数据库以及要强制执行的“规则”时,请考虑什么会使数据记录出错。根据您的描述,具有空 DateEnded 的记录是有效记录。

根据我的经验,如果你真的需要触发器,它们是很棒的,但是非常危险,并且很快就会成倍增加问题的复杂性。

如果可以的话,我个人会避免触发,并在我的应用程序端执行该逻辑。

只是我的 2 美分

于 2011-04-04T12:57:48.087 回答
0

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

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

于 2011-04-04T12:55:53.650 回答