复杂检查约束?

Ste*_*ood 4 sql sql-server check-constraint sql-server-2012

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

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

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

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

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

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

谢谢你的帮助

Kei*_*ith 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)
  )
)
Run Code Online (Sandbox Code Playgroud)

  • 当然,上面没有任何内容阻止`UPDATE CustomerAddresses set CustomerId = <new value> where CustomerId = <old value>` 并且现在违反了“约束”。 (3认同)