2012-08-08 69 views
0

我有3个相关的表,如下图所示。在sql表上约束表条目

Db Diagram

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

我想约束Subscribers表,以便它只能包含角色为IsSusbcriber但保留UserRole在用户级别的用户。可能吗?

请原谅目前表格之间的关系,它们代表目前的情况,而不是必要的。

+2

哪些DBMS您使用的?甲骨文? PostgreSQL的? DB2? – 2012-08-08 17:51:37

+0

miscrosoft sql server 2008 – dotnetnoob 2012-08-09 06:22:30

回答

1

我想你可以放下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) 
+0

正是我在想什么。 :) – Diego 2012-08-08 18:18:51

+0

谢谢ypercube,这是我会一起去的 – dotnetnoob 2012-08-09 06:36:56

0

这可能吗?

理论上,是的;你可以使用SQL断言。例如,请参阅this StackOverflow answer

然而,在实践中,没有主要的DBMS支持SQL断言,并且您描述的内容不能作为外键约束实现,所以我认为您唯一的选择是编写一个trigger来评估此约束,并引发异常如果不满意。

0

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

使用RoleID在Subscribers中,可以添加一个检查约束,将其限制为特定值。

这会更好地执行不同的设计和/或在应用程序代码。