2014-09-10 3 views
0

On suppose que vous avez une table principale, avec quelques donnéesMaître/Détail éviter combinaison Détail

MasterId MasterData 
-------- ---------- 
1   data1 
2   data2 
3   data3 

et une table de détail qui fait référence au maître

DetailId DetailMasterId  DetailKind DetailData 
-------- --------------  ---------- ---------- 
1   1     A    detailData1 
2   1     B    detailData2 
3   2     C    detailData3 
4   1     C    detailData4 

est-il un moyen de définir certains invalides combinaisons, basées sur les capacités SQL-Server? Imaginez que vous ne voulez pas laisser un detailcombination de detailKind A et C au même maître

+1

On ne sait pas ce que vous voulez: requête qui renvoie des combinaisons id invalides ou une construction qui empêche les combinaisons invalides dans db? – Rimas

+0

Il sera utile si vous avez fourni l'entrée et la solution souhaitée. Par exemple, (A, C) est l'entrée, ce qui devrait ou ne devrait pas arriver pour des données données? – Bulat

+0

@Rimes Je n'ai pas besoin d'une requête pour obtenir des combinaisons invalides, je veux empêcher ces combinaisons. (À côté d'un déclencheur) – deterministicFail

Répondre

1

Vous pouvez essayer de surpasser les limites de la contrainte CHECK si vous ne voulez pas utiliser la gâchette:

CREATE FUNCTION ExistsDetailKind(
    @MasterID INT, @DetailKind VARCHAR(10) 
) 
RETURNS bit 
AS 
BEGIN 

    IF EXISTS (-- <Put your logic here>) 
     return 1 
    return 0 
END 

ALTER TABLE detail 
WITH CHECK ADD CONSTRAINT CK_DetailTypes 
CHECK (ExistsDetailKind(DetailMasterId, DetailKind) = 0)