我有 3 个相关表,如下图所示。
每个人在 User 表中都有一个条目和一个 UserRole。一些用户是订阅者。
我想限制 Subscribers 表,使其只能包含角色 IsSusbcriber 但在用户级别保留 UserRole 的用户。可能吗?
对不起,表之间的当前关系,它们代表了此刻那里的东西,而不是必然需要的东西。
我有 3 个相关表,如下图所示。
每个人在 User 表中都有一个条目和一个 UserRole。一些用户是订阅者。
我想限制 Subscribers 表,使其只能包含角色 IsSusbcriber 但在用户级别保留 UserRole 的用户。可能吗?
对不起,表之间的当前关系,它们代表了此刻那里的东西,而不是必然需要的东西。
我认为您可以删除这些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)
在表中没有 RoleId 的情况下,限制这一点的唯一方法是通过触发器(触发器通常是一个糟糕的设计选择),或者通过 SQL 代理作业定期从不符合条件的订阅者中删除人员。
使用订阅服务器中的 RoleID,您可以添加将其限制为特定值的检查约束。
使用不同的设计和/或在应用程序代码中确实可以更好地执行此操作。
可能吗?
理论上,是的;您可以使用 SQL 断言。有关示例,请参阅此 StackOverflow 答案。
但是,在实践中,没有主要的 DBMS 支持 SQL 断言,并且您所描述的内容不能实现为外键约束,因此我认为您唯一的选择是编写一个评估此约束的触发器,如果不满足则引发异常.