主/细节防止细节组合

时间:2014-09-10 07:23:58

标签: sql sql-server database-design

假设你有一个主表,有一些数据

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

和引用主

的详细信息表
DetailId    DetailMasterId     DetailKind    DetailData
--------    --------------     ----------    ----------
1           1                  A             detailData1
2           1                  B             detailData2
3           2                  C             detailData3
4           1                  C             detailData4

有没有办法根据SQL-Server capatilities定义一些无效组合?想象一下,你不希望允许将detailKind A和C的细节组合到同一个Master

1 个答案:

答案 0 :(得分:1)

如果您不想使用触发器,可以尝试克服CHECK约束的限制:

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)