【问题标题】:Constraint with Sql statement用 Sql 语句约束
【发布时间】:2013-11-26 05:41:13
【问题描述】:
我有两张桌子
1.Sales_Items
2.Stock_Items
我想确保在sale_items 表中插入任何项目时,qty 必须小于 (Stock_Items.qty-Sales_Items.Qty),如果此条件不成立,则插入应该失败并引发异常。
我应该怎么做?我需要使用带有表达式或 Sql 触发器的 sql 约束吗?
【问题讨论】:
标签:
.net
sql
sql-server
linq-to-sql
【解决方案1】:
可以同时使用触发器和约束来完成。 我会为特定场景选择一个约束。
这是因为当您想要在插入/更新/删除时主动主动执行某些操作(例如添加或更新另一行)时,实际上会使用触发器。在您的场景中,您实际上并不需要触发器。您的场景是约束需求的定义。使用触发器的唯一原因是如果您想抛出自定义错误消息。
请参阅this 作为约束参考。
希望我能帮上忙!
【解决方案2】:
即使可以使用触发器强制执行业务规则,您也可以将 CHECK CONSTRAINT 与用户定义的函数一起使用:
ALTER TABLE sales_items
ADD CONSTRAINT CHECK (qty < dbo.udfCheckAvailableStock(YourProductIdColumn, qty))
如果您需要在 Sales_Items 中添加新行时更新 Stock_Items,我会使用触发器。
触发器可以强制执行比那些更复杂的限制
用 CHECK 约束定义。与 CHECK 约束不同,触发器可以
引用其他表中的列。例如,触发器可以使用
从另一个表中选择以与插入或更新的数据进行比较
并执行其他操作,例如修改数据或显示
用户定义的错误消息。
See source