Комплексное ограничение проверки?

У меня есть таблица клиентов, которая связывается с таблицей адресов через среднюю таблицу CustomerAddress. Это означает, что у клиента может быть много адресов, а у адреса может быть много клиентов. (Это необходимо из-за того, что мы имеем дело с супругами и детьми как с отдельными клиентами, и у каждого из них могут быть адреса доставки, работы, выставления счетов и другие адреса).

Я хочу, чтобы клиент мог указать предпочтительный адрес.

Я думал о том, чтобы создать новый столбец в таблице клиентов, который ссылается на запись CustomerAddress.

Моя проблема в том, как я могу убедиться, что выбранный вами предпочтительный адрес является одним из адресов клиентов?

Моя мысль заключалась в том, чтобы установить ограничение Check на поле customer.preferredAddress, которое проверяет данный CustomerAddress, чтобы узнать, соответствует ли эта запись идентификатору клиента обновляемому клиенту.

Это возможно? Я только когда-либо использовал Проверочные ограничения для проверки таких простых вещей, как (Значение> 0) и т. Д.

Спасибо за вашу помощь

1 ответ

Решение

Написать 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)
  )
)
Другие вопросы по тегам