复杂检查约束?

时间:2014-02-24 21:45:58

标签: sql sql-server sql-server-2012 check-constraint

我有一个customers表,它通过中间CustomerAddress表链接到地址表。这意味着客户可以拥有多个地址,而地址可以拥有许多客户。 (这是必要的,因为我们将配偶和子女作为单独的客户处理,每个人都可以有送货,工作,账单和其他地址。)

我希望客户能够指定首选地址。

我的想法是在customers表中创建一个链接到CustomerAddress记录的新列。

我的问题是 - 如何确保所选择的首选地址是该客户地址之一?

我的想法是在customers.preferredAddress字段上放置一个Check约束,该字段检查给定的CustomerAddress以查看该记录的客户ID是否与正在更新的客户匹配。

这可能吗?我只使用了Check约束来检查像(Value> 0)等简单的东西。

感谢您的帮助

1 个答案:

答案 0 :(得分:6)

编写UDF以验证地址所有权,然后从检查约束中引用该UDF。

CREATE FUNCTION dbo.fnIsAddressOwner (
  @CustomerId int,
  @AddressId int
)
RETURNS tinyint
AS
BEGIN
  DECLARE @Result tinyint
  IF EXISTS(SELECT * FROM CustomerAddresses WHERE CustomerId=@CustomerId and AddressId=@AddressId)
    SET @Result= 1
  ELSE 
    SET @Result= 0
  RETURN @Result
END


CREATE TABLE Customers (
  CustomerId int,
  PreferredAddressId int,
  CONSTRAINT ckPreferredAddressId CHECK (
    dbo.fnIsAddressOwner(CustomerId, PreferredAddressId) = 1)
  )
)