MS SQL Server的交叉表约束(MS SQL Server cross table cons

2019-09-01 14:35发布

我有三个表:

1)应用(的AppId,名称)
2)屏幕(ScreenId,名称)
3)关系式(的AppId,ScreenId)

现在,我想申请对相关表中的一些限制:同一个屏幕可以被分配到多个应用程序,但不能有两个屏幕具有相同名称分配给同一个应用程序。

我知道我可以添加到Screen.Name关系表,然后在的AppId和Screen.Name创建PK,但我不希望这样的解决方案,因为Screen.Name是随时可能更改。

我有什么额外的选项来实现这样的限制?

Answer 1:

您可以创建一个索引视图基础上的RelationScreen表和申请的唯一约束存在。

create view DRI_UniqueScreens
with SCHEMABINDING
as
    select r.AppId,s.Name
    from
       [Schema].Relation r
         inner join
       [Schema].Screen s
         on
            r.ScreenId = s.ScreenId
GO
CREATE UNIQUE CLUSTERED INDEX IX_DRI_UniqueScreens
    on DRI_UniqueScreens (AppId,Name)


Answer 2:

这不是一个很好的解决方案,但你可以添加触发器筛选和关系表刚刚检查你修改了哪些符合你的标准,如果没有回滚。

CREATE TRIGGER trgScreen ON Screen FOR INSERT, UPDATE
AS
BEGIN
    IF EXISTS (SELECT r.AppID, s.Name FROM Screen s
               INNER JOIN Relation r ON s.ScreenID = r.ScreenID
               GROUP BY r.AppID, s.Name
               HAVING count(*) > 1)
        ROLLBACK TRANSACTION
END

CREATE TRIGGER trgRelation ON Relation FOR INSERT, UPDATE
AS
BEGIN
    IF EXISTS (SELECT r.AppID, s.Name FROM Screen s
               INNER JOIN Relation r ON s.ScreenID = r.ScreenID
               GROUP BY r.AppID, s.Name
               HAVING count(*) > 1)
        ROLLBACK TRANSACTION
END


文章来源: MS SQL Server cross table constraint