2015-01-02 4 views
1

У меня проблема с установкой проверки ограничения. У меня есть таблица Policy, где первичный ключ установлен на (Policy_id, History_id) + дополнительные столбцы и таблицу Report, которые имеют Policy_id и некоторые дополнительные столбцы.Ограничение проверки SQL-запросов

Как установить оператор ограничения проверки в таблице отчетов, чтобы проверить, существует ли policy_id в таблице политик?

Я не могу использовать внешний ключ Ограничить, потому что отчет не имеют history_id столбец

отчет не может содержать записи с Policy_id, если она не существует в таблице политики и, следовательно, не может выполнить вставку в отчет

+0

Вы можете написать функцию, которая принимает Policy_id и проверяет, существует ли она в таблице Policy. –

ответ

0

, если Policy_id и History_id представляют собой составной первичный ключ, тогда внешний ключ в таблице ссылок также должен содержать оба столбца.

Если вам действительно нужно проверить только один из них (policy_id), я думаю, вам придется делать это вручную, что не очень хорошая идея.

Было бы лучше, если бы таблица Report имела бы 2 внешних ключа, а policy_id и history_id - это один первичный ключ.

0

Вы можете создать отдельную таблицу только для целей данного ограничения внешнего ключа, а затем использовать триггеры для поддержания этой информации:

CREATE TABLE ExistingPolicies (
    PolicyID int not null, 
    PolicyCount int not null, 
    constraint PK_ExistingPolicies PRIMARY KEY (PolicyID) 

)

И тогда Триггеры

CREATE TRIGGER T_Policy_I 
on Policy 
instead of insert 
as 
    ;With totals as (
     select PolicyID,COUNT(*) as cnt from inserted 
     group by PolicyID 
    ) 
    merge into ExistingPolicies t 
    using totals s 
    on 
     t.PolicyID = s.PolicyID 
    when matched then update set PolicyCount = PolicyCount + s.cnt 
    when not matched then insert (PolicyID,PolicyCount) values (s.PolicyID,s.cnt); 
go 
CREATE TRIGGER T_Policy_D 
on Policy 
instead of delete 
as 
    ;With totals as (
     select PolicyID,COUNT(*) as cnt from deleted 
     group by PolicyID 
    ) 
    merge into ExistingPolicies t 
    using totals s 
    on 
     t.PolicyID = s.PolicyID 
    when matched and t.PolicyCount = s.cnt then delete 
    when matched then update set PolicyCount = PolicyCount - s.cnt; 
go 
CREATE TRIGGER T_Policy_U 
on Policy 
instead of update 
as 
    ;With totals as (
     select PolicyID,SUM(cnt) as cnt 
     from 
      (select PolicyID,1 as cnt from inserted 
      union all 
      select PolicyID,-1 as cnt from deleted 
      ) t 
     group by PolicyID 
    ) 
    merge into ExistingPolicies t 
    using totals s 
    on 
     t.PolicyID = s.PolicyID 
    when matched and t.PolicyCount = -s.cnt then delete 
    when matched then update set PolicyCount = PolicyCount + s.cnt 
    when not matched then insert (PolicyID,PolicyCount) values (s.PolicyID,s.cnt); 
go 

(Код не проверен, но должен быть близок к правилу)

0

I думаю, использование контрольного ограничения - прекрасная идея здесь.

Напишите функцию, которая принимает Policy_id как параметр, и выполняет запрос, чтобы проверить, существует ли политика в таблице Policy, и возвращает простой 1 (существует) или 0 (не существует).

Затем установите проверочное ограничение в отчете Таблица для dbo.MyFunction(Policy_Id)=1

Вот и все.

Смежные вопросы