我有一个帐篷租金表,其中包含以下列:
RentID, DateStarted, DateEnded, CustomerID, etc.
DateStarted
始终在租借期开始时输入,DateEnded
初始为NULL,只有在租期到期时才会填写。 CustomerID
是租用帐篷的客户的ID。
我需要做的是阻止用户为任何给定客户插入新行(由CustomerID
表示),如果该客户的任何租金为DateEnded=NULL
。
我不知道该怎么做。我在想一个Check约束,但它们不允许我看到其他行。我在考虑唯一约束,但不知道它们是否可以在这种情况下使用。我在考虑On-Insert触发器,但是我不确定如果不满足条件我是否可以取消插入。
感谢您的帮助。
答案 0 :(得分:2)
您所描述的内容在应用程序逻辑方面听起来更多一些。我认为,当您考虑数据库以及要执行的“规则”时,请考虑会导致数据记录错误的原因。根据您的描述,具有null DateEnded的记录是有效记录。
根据我的经验,如果你确实需要触发器,那么触发器会非常棒,但是非常危险,并且很快就会以指数方式增加问题的复杂性。
如果可以的话,我个人会避免触发,并在我的应用程序端执行该逻辑。
只需2美分
答案 1 :(得分: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)
答案 2 :(得分:0)
我建议你看看MS的instead of
触发器。这里的文件......
http://msdn.microsoft.com/en-us/library/ms175521.aspx
您还可以在传统的插入触发器中使用rollback transaction
。