约束sql表上的表项

约束sql表上的表项,sql,sql-server-2008,database-design,constraints,Sql,Sql Server 2008,Database Design,Constraints,我有3个相关的表格,如下图所示 每个人在用户表中都有一个条目和一个UserRole。 有些用户是订户 我希望约束Subscribers表,以便它只能包含其角色IssusScriber的用户,但在用户级别保留UserRole。可能吗 请原谅当前表与表之间的关系,它们代表了当前的内容,而不是必要的内容 可能吗 理论上,是的;您可以使用SQL断言。有关示例,请参见 然而,在实践中,没有主要的DBMS支持SQL断言,并且您所描述的不能实现为外键约束,因此我认为您唯一的选择是编写一个计算该约束的函数,如

我有3个相关的表格,如下图所示

每个人在用户表中都有一个条目和一个UserRole。 有些用户是订户

我希望约束Subscribers表,以便它只能包含其角色IssusScriber的用户,但在用户级别保留UserRole。可能吗

请原谅当前表与表之间的关系,它们代表了当前的内容,而不是必要的内容

可能吗

理论上,是的;您可以使用SQL断言。有关示例,请参见


然而,在实践中,没有主要的DBMS支持SQL断言,并且您所描述的不能实现为外键约束,因此我认为您唯一的选择是编写一个计算该约束的函数,如果它不满足,则引发一个异常。

在表中没有RoleId的情况下,唯一的方法是通过触发器或(和触发器通常是一个糟糕的设计选择),或者是一个SQL代理作业,它周期性地从不符合条件的订阅服务器中删除人员

使用订阅服务器中的RoleID,可以添加一个检查约束,将其限制为特定值


如果采用不同的设计和/或在应用程序代码中执行,这将更好。

我认为您可以删除
IsSubscriber
列,并添加一个
UserSubscriberRoles
表,该表将完全包含先前设置
IsSubscriber
列的角色

CREATE UserSubscriberRoles
  ( UserRoleId PRIMARY KEY
  , FOREIGN KEY (UserRoleId)
      REFERENCES UserRoles (UserRoleId) 
  ) ;
然后将
Subscribers
表中的FKs更改为:

   FOREIGN KEY (UserId, UserRoleId)
     REFERENCES User (UserId, UserRoleId) 
   FOREIGN KEY (UserRoleId)
     REFERENCES UserSubscriberRoles (UserRoleId) 

您使用的是哪种数据库管理系统?Oracle?PostgreSQL?DB2?正是我所想的。:)谢谢ypercube,这就是我将使用的