1

У меня есть база данных с таблицами Customer and WatchHistory. Клиент может смотреть фильм только после его подписки и до его подписки. Я попытался следующие:добавить ограничение, используя другую таблицу

ALTER TABLE WatchHistory 
ADD CONSTRAINT ck_watch_date 
    CHECK (watch_date > Customer.subscription_start AND watch_date < Customer.subscription_end) 

Но я получаю следующее сообщение об ошибке:

Msg 4104, Level 16, State 1, Line 3 
The multi-part identifier "Customer.subscription_start" could not be bound. 
Msg 4104, Level 16, State 1, Line 3 
The multi-part identifier "Customer.subscription_end" could not be bound. 

Я предполагаю, что я должен использовать присоединиться, но где я ставлю что? Ниже не работает:

ALTER TABLE WatchHistory INNER JOIN Customer 
    ON WatchHistory.customer_mail_address = Customer.customer_mail_address 
ADD CONSTRAINT ck_watch_date 
    CHECK (watch_date > Customer.subscription_start AND watch_date < Customer.subscription_end) 
+1

Я думаю, что вам нужен определенный пользователем функцию, чтобы осуществить это. –

ответ

1

Один из способов сделать это было бы создать UDF, а затем создать ограничение на этой UDF.

Пример кода для вас (не проверял поэтому, пожалуйста, проверить его) -

CREATE FUNCTION ufn_check_customerwatchhistory (
    @watch_date DATE 
) 
RETURNS VARCHAR(10) 
AS 
BEGIN 
    IF EXISTS (SELECT 1 FROM Customer WHERE @watch_date > Customer.subscription_start AND @watch_date < Customer.subscription_end) 
     return 'True' 
    return 'False' 
END 

ALTER TABLE WatchHistory 
ADD CONSTRAINT ck_watch_date 
    CHECK (ufn_check_customerwatchhistory(watch_date) = 'True') 
+0

Общая идея работает для меня, но она должна быть немного скорректирована. Спасибо за ответ. – Jonathan