Комплексное ограничение проверки?
У меня есть таблица клиентов, которая связывается с таблицей адресов через среднюю таблицу 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)
)
)