6

中央の CustomerAddress テーブルを介して住所テーブルにリンクする顧客テーブルがあります。これは、顧客が多くの住所を持つことができ、住所が多くの顧客を持つことができることを意味します。(これは、配偶者と子供を別々の顧客として扱っており、それぞれが配達先、職場、請求先、その他の住所を持っている可能性があるため必要です)。

顧客が好みの住所を指定できるようにしてほしい。

私の考えは、CustomerAddress レコードにリンクする顧客テーブルに新しい列を作成することでした。

私の問題は、選択した優先住所が顧客の住所の 1 つであることを確認するにはどうすればよいかということです。

私が考えたのは、特定の CustomerAddress をチェックして、そのレコードの顧客 ID が更新中の顧客と一致するかどうかを確認する、customers.preferredAddress フィールドに Check 制約を設定することでした。

これは可能ですか?(Value > 0) などの単純なものをチェックするためにチェック制約のみを使用したことがあります。

ご協力いただきありがとうございます

4

1 に答える 1

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)
  )
)
于 2014-02-25T14:29:32.147 に答える