2009-10-19 3 views
0

Я хочу добавить ограничение на столбец, который зависит от столбца из другой таблицы. Например, если в таблице T1 у меня есть строковый столбец str1, а в таблице T2 у меня есть строка clumn str2, я хочу, чтобы str1 был нулевым, за исключением случаев, когда srt2 - «ok».Constraint - sql server

ответ

0

вы можете использовать триггер сценарий (перед выполнением) на t1, который проверяет, когда строка должна быть вставлена ​​в str1, str2, если равен «КИ»

1

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

create table t1 (id int, str1 varchar(max)) 
create table t2 (str2 varchar(10)) 
go 
create function dbo.GetStr2() returns varchar(10) 
as 
begin 
    declare @retval varchar(10) 
    select @retval = str2 from t2 
    return @retval 
end 
go 
alter table t1 add constraint CheckStr2Constraint 
    check (str1 is null or dbo.GetStr2() = 'ok'); 

Вы можете проверить это, как:

insert into t2 values ('ok') 
insert into t1 values (1,'test') -- Succeeds 
insert into t1 values (1,null) -- Succeeds 
update t2 set str2 = 'not ok' 
insert into t1 values (1,'test') -- Fails 
insert into t1 values (1,null) -- Succeeds 

Третий ВСТАВИТЬ потерпит неудачу, потому что str2 «не в порядке», и вы вставив непустой строки. Сообщение об ошибке будет выглядеть так:

The INSERT statement conflicted with the CHECK 
constraint "CheckStr2Constraint". 
Смежные вопросы