MS SQL Server跨表约束

Ale*_* Dn 7 sql t-sql sql-server

我有三张桌子:

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

现在我想对相关表应用一些限制:可以将同一个屏幕分配给多个应用程序,但不能有两个同名的屏幕分配给同一个应用程序.

我知道我可以将Screen.Name添加到关系表,然后在AppId和Screen.Name上创建PK,但我不想要这样的解决方案,因为Screen.Name可能会发生变化.

我还有哪些额外的选择来实现这种限制?

Dam*_*ver 10

您可以基于和表创建索引视图,Relation并在其中Screen应用唯一约束.

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)
Run Code Online (Sandbox Code Playgroud)

  • @AlexDn - 是的,这将在基础表中进行更改时强制执行约束.如果你转到我链接的页面,你会发现索引视图有很多限制.大多数这些限制存在*因为*它们允许以有效的方式在基表中的每个事务上发生所需的维护活动. (2认同)
  • @AlexDn - 另外,您可能已经注意到我将视图命名为"DRI_x".这是(我自己的)约定,用于指示此视图存在用于声明性参照完整性的原因,并且(可能)不是任何人都可以从中实际查询它.如果您处于审计发生的环境中,这会有所帮助 - "这个观点的重点是什么?没有任何疑问.也许我们应该删除它?" (2认同)