主/细节防止细节组合

问题描述 投票:0回答:1

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

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 功能来定义一些无效组合?想象一下,您不希望允许同一个 Master 中的详细类型 A 和 C 的详细组合。我想防止这些在 SQL 级别发生。

我可以使用触发器,但我不想这样做。

sql sql-server database-design
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.