2009-10-19 4 views
0

Je souhaite ajouter une contrainte sur une colonne dépendant d'une colonne d'une table différente. Par exemple, si dans la table T1 j'ai une colonne string str1, et sur la table T2 j'ai une chaîne str2 str2, je veux que str1 soit nul à l'exception de quand srt2 - "ok".Constraint - SQL Server

Répondre

0

vous pouvez utiliser un script de déclenchement (avant l'exécution) sur t1 qui vérifie lorsqu'une chaîne est inséré dans str1, si str2 est égal à « ok »

1

Vous ne pouvez pas utiliser SELECT dans une contrainte, mais un utilisateur fonction définie est autorisée. Vous pouvez donc créer une fonction pour récupérer str2 à partir de T2. Voici un exemple de configuration:

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'); 

Vous pouvez tester cela comme:

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 

Le troisième INSERT échouera, car str2 est « pas correct », et vous insérez une chaîne non nulle. Le message d'erreur ressemblera à:

The INSERT statement conflicted with the CHECK 
constraint "CheckStr2Constraint".