2014-02-24 67 views
1

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

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

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

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

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

这可能吗?我只用过CHECK约束检查一样简单的东西(值> 0)等

感谢您的帮助

+0

为什么在顾客桌上?客户地址记录上的新列是“首选地址”,并且是一个简单的y/n(或位)来定义yes或no(或null为否)?如果它位于customeraddress表上,则强制执行它是客户地址之一的关系。 – Twelfth

+0

但是,我怎么能阻止一个客户有多个首选地址? –

回答

5

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

CREATE FUNCTION dbo.fnIsAddressOwner (
    @CustomerId int, 
    @AddressId int 
) 
RETURNS tinyint 
AS 
BEGIN 
    DECLARE @Result tinyint 
    IF EXISTS(SELECT * FROM CustomerAddresses WHERE [email protected] and [email protected]) 
    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) 
) 
) 
+0

如果检查约束不适用于您,那么您也可以在触发器中执行检查。如果验证失败,请回滚事务。 – Keith

+1

当然,上述内容中的任何内容都不允许“UPDATE CustomerAddresses set CustomerId = ”,其中CustomerId =​​“现在违反了”约束“。 –