防止将不适当的行插入SQL Server数据库

时间:2011-04-04 12:47:41

标签: sql-server data-integrity

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

RentID, DateStarted, DateEnded, CustomerID, etc.  

DateStarted始终在租借期开始时输入,DateEnded初始为NULL,只有在租期到期时才会填写。 CustomerID是租用帐篷的客户的ID。

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

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

感谢您的帮助。

3 个答案:

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