0
我想为我的表创建检查约束,如果新预订范围(start_date,end_date)与已提交的行相交,则无法添加新行。 但我不能将查询放在检查约束中。你有一个想法如何做到这一点?select in check constraint
的表格:
APARTMAN
id INT
price INT
BOOKINGS
id INT
start_date DATE
end_date DATE
apartman_id INT
[apartman_id] IN (SELECT [id] FROM [dbo].[APARTMAN]
WHERE [id] NOT IN (
SELECT [apartman_id] FROM
[dbo].[BOOKINGS]
WHERE
([start_date] <= "requested end_date" AND
[end_date] >= "requested start_date")
OR
([start_date] <= "requested start_date" AND
[end_date] >= "requested end_date")
OR
(([start_date] <= "requested end_date" AND [end_date] >= "requested start_date")
OR
([end_date] <= "requested start_date" AND [end_date] >= "requested end_date"))
)
)
从另一个角度来看待它,是否可以通过存储过程完成插入操作? – Hotchips 2013-03-26 23:24:12
我会推荐一个触发器而不是表级约束。你还必须保护更新吗? – 2013-03-26 23:35:10
@Hotchips您无法真正使用存储过程来保护数据,因为人们可以在不通过存储过程的情况下访问表。当然,人们也可以禁用触发器,但这是故意的恶意行为(如果这是那些有这么多特权的人最坏的事情会伤害你的数据库,那么认为自己很幸运)。你也可以使用存储过程*,但它们不应该是唯一的防线。 – 2013-03-26 23:37:53