0

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

数据库图

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

我想限制 Subscribers 表,使其只能包含角色 IsSusbcriber 但在用户级别保留 UserRole 的用户。可能吗?

对不起,表之间的当前关系,它们代表了此刻那里的东西,而不是必然需要的东西。

4

3 回答 3

1

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

CREATE UserSubscriberRoles
  ( UserRoleId PRIMARY KEY
  , FOREIGN KEY (UserRoleId)
      REFERENCES UserRoles (UserRoleId) 
  ) ;

然后将Subscribers表中的 FK 更改为:

   FOREIGN KEY (UserId, UserRoleId)
     REFERENCES User (UserId, UserRoleId) 
   FOREIGN KEY (UserRoleId)
     REFERENCES UserSubscriberRoles (UserRoleId) 
于 2012-08-08T18:07:27.733 回答
0

在表中没有 RoleId 的情况下,限制这一点的唯一方法是通过触发器(触发器通常是一个糟糕的设计选择),或者通过 SQL 代理作业定期从不符合条件的订阅者中删除人员。

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

使用不同的设计和/或在应用程序代码中确实可以更好地执行此操作。

于 2012-08-08T17:49:42.957 回答
0

可能吗?

理论上,是的;您可以使用 SQL 断言。有关示例,请参阅此 StackOverflow 答案。

但是,在实践中,没有主要的 DBMS 支持 SQL 断言,并且您所描述的内容不能实现为外键约束,因此我认为您唯一的选择是编写一个评估此约束的触发器,如果​​不满足则引发异常.

于 2012-08-08T17:47:55.897 回答