Sql Server 只允许每个用户使用一个活动图像

Posted

技术标签:

【中文标题】Sql Server 只允许每个用户使用一个活动图像【英文标题】:Sql Server only allow one active image per user 【发布时间】:2013-07-13 01:33:51 【问题描述】:

我正在尝试添加到我们有 tblUsers 表的现有数据库中。截至目前,我们将用户图像存储在文件系统中,现在我们通过将用户图像存储在新的 tblUserImages 表中的数据库中来摆脱这种情况。

这是两张表的样子。

我想添加一个约束,每个用户只允许一张活动图片,但我不知道该怎么做。我试过查找它无济于事。任何帮助是极大的赞赏!关于 SQL Server,我还有很多东西要学习。

【问题讨论】:

【参考方案1】:

如果您使用的是 SQL Server 2008,您可以创建过滤的唯一索引,如下所示:

create unique index uniqueUserActiveImages 
    ON tblUserImage(UserID, Active) 
WHERE Active = 1;

这允许用户拥有多个非活动图像但只有一个活动图像。

【讨论】:

太棒了!奇迹般有效。非常感谢! 我喜欢这个比我最初建议的触发器更好。【参考方案2】:

我建议您考虑为非活动图像使用单独的实体(单独的表)。这样您就不需要 tblUserImages 中的“活动”属性,此表中的所有图像都将处于活动状态。如果您想查询图像历史记录,您只会引用非活动图像表。活动图像表要么对 UserId 有唯一约束,要么只使用 UserId 作为主键。

这可能听起来像是一个深奥的解决方案,但它是基于在其他系统中看到同样的数据建模问题的经验。核心问题是:系统的活动状态与系统的历史状态不一样。表示活动状态的一部分的实体与记录历史状态的实体不同,即使两个实体中的信息重叠。如果您使用这个想法来发展您的数据模型,您应该会看到事实上历史实体的属性确实倾向于与其活跃的“操作”对应物有所不同。换句话说,您可能会发现活动图像表的字段布局可能与历史图像表的理想字段布局并不完全相同。

我可以看到以这种方式构建数据的唯一缺点是必须在替换活动图像时将其复制到历史表中。在几个重要方面,这个解决方案是优越的 - 查询会更快,特别是如果您使用集群键作为用户 ID。最重要的是,其他编码人员更容易理解该解决方案。创建过滤索引是一个完整的解决方案,也是对 SQL Server 功能的良好利用,但对于未来的维护程序员来说可能并不那么清楚。

【讨论】:

【参考方案3】:

我从来都不喜欢触发器,但在这种情况下,我认为它可以帮助您完成任务。

建议在插入或更新时编写一个触发器来检查是否有任何其他活动图像与用户相关联。如果有,您可以抛出自定义错误,或者将所有其他图像设置为非活动状态。

【讨论】:

我提出了触发建议,因为这将允许一到 n 个图像,但仅限于 active 图像。唯一索引应将每个用户的条目限制为一个 active 和一个 inactive

以上是关于Sql Server 只允许每个用户使用一个活动图像的主要内容,如果未能解决你的问题,请参考以下文章

WindowsWindows server2008远程桌面只允许同时存在一个会话

为啥sql server身份验证失败

无法限制用户使用内置 SQL Server 函数

使用 SQL-Server 如何从 TFS 查询所有活动/活动项目

每个用户只保留一个活动连接

SQL Server 2000:如何只返回电话号码列中的号码