如何在视图上强制执行约束,以确保在MSSQL中返回0行

埃里斯

让我来布置场景;

我必须谈谈一种将有两种类型的用户的系统。在不赘述的情况下,我们将其称为“超级用户”和“普通用户”。

超级用户可能存在或可能不存在,但如果存在,则始终引用普通用户。普通用户始终存在,但可以被“软”删除。

系统上正在执行升级步骤。所有属于超级用户的普通用户都将获得一个新的超级用户帐户。被软删除的任何普通用户都不能拥有超级用户帐户,即使以前拥有一个也是如此。

我有两个表,Message和ReceivedMessage。

消息包含OnBehalfOfNormalUserId和消息内容。ReceivedMessage包含发送消息的人的SuperUserId。

create table Message(MessageId int identity(1, 1) not null, OnBehalfOfNormalUserId int not null, Subject varchar(50) null, Content varchar(max) not null, constraint PK_MESSAGEID primary key (MessageId), contraint FK_ONBEHALFOFNORMALUSERID (OnBehalfOfNormalUserId) references User (UserId));
create table ReceivedMessage(QueueId int not null, MessageId int not null, SentBySuperUserId int null, constraint PK_QUEUEID primary key (QueueId), constraint FK_QUEUEID (QueueId) references MessageQueue (QueueId), constraint FK_SENTBYSUPERUSERID (SentBySuperUserId) references SuperUser (UserId));

这些表包含的内容不止于此,但对于我的示例而言,就足够了

现在,以前超级用户的人可能已经由旧系统发送了一条消息,但现在该用户已被软删除,并且不能成为超级用户。这是通过在“ SentBySuperUserId”列中放置“ null”来实现的。但是,除非NormalUser被软删除,否则此列必须包含SuperUserId。迁移后被软删除的所有NormalUser帐户将保留其SuperUser帐户,但将无法访问。(我无法控制此过程,也无法控制/不迁移什么数据)

用户表具有标志“ IsDeleted”。如果已标记,则SentBySuperUserId可以为null,否则为null。(超级用户通过桥表映射到普通用户)

我创建了一个简单的视图,该视图返回SuperUserId为null AND User.IsDeleted = 0的所有NormalUserId。但是,对于索引视图而言,这是不够的,因为就唯一约束而言,一条消息就可以了。鉴于我无法进行子查询,因此无法使用CTE,也无法使用外部联接,因此我不确定如何强制执行确保视图返回恰好0行的约束。

马丁·史密斯

如何在视图上强制执行约束,以确保在MSSQL中返回0行?

您不能,唯一可以应用于视图的约束类型是唯一约束,并且不可能单行违反该约束。

但是,您始终可以将结果加倍,以使其确实违反约束,并且可以声明性地强制执行。

您将需要创建一个表并插入两行。

添加CROSS JOIN dbo.TwoRows到您的视图定义并在其上创建唯一索引。

现在,原始查询返回的每一行都会加倍。因此,如果原始查询完全返回任何行,它将违反其上的唯一索引。

能够交叉连接到包含两行的虚拟表会更好,但是在索引视图中不允许派生表等。


注意:在我看来,确实有可能定义视图,以便在尝试实现甚至单行(例如除以零)的尝试时都可能导致运行时错误,但这是一个更可怕的解决方案,并且也不能保证该表达式可以正常工作,因为可以在计划中将表达式过滤掉之前对其进行评估。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在两点之间强制执行约束

来自分类Dev

如何在Sublime中强制执行50个字符的提交摘要行?

来自分类Dev

如何在.Net中强制执行OutOfMemoryException

来自分类Dev

如何在Perl中强制执行long double

来自分类Dev

如何在Chrome中强制执行504错误

来自分类Dev

如何在vb.net中调试强制执行?

来自分类Dev

如何在Perl中强制执行long double

来自分类Dev

如何在Java中强制执行构造函数

来自分类Dev

如何在GNOME Web中强制执行大文本?

来自分类Dev

如何在Jenkins DSL中强制执行参数排序?

来自分类Dev

如何在matplotlib中的网格内强制执行图?

来自分类Dev

如何在 Antlr 中强制执行某些规则

来自分类Dev

如何在 Java <= 8 中强制执行模块边界

来自分类Dev

如何指定在Swift中强制执行下标的一般约束?

来自分类Dev

SQL:如何使用约束强制执行功能依赖关系?

来自分类Dev

MongoDB 在集合中的文档之间强制执行复杂的约束

来自分类Dev

在 Spring JPA 中强制执行主键约束

来自分类Dev

强制执行SQL Server查询以不返回任何行

来自分类Dev

如何在python中从python中强制执行或呈现浏览器中的脚本?

来自分类Dev

如何强制执行函数,然后在haskell中返回简单的其他内容

来自分类Dev

Python中的枚举:如何在方法参数中强制执行

来自分类Dev

如何在Spark SQL中强制执行内存中的分块排序?

来自分类Dev

如何在git中强制执行“文件名中没有空格”策略?

来自分类Dev

如何在Spark SQL中强制执行内存中的分块排序?

来自分类Dev

跨视图层次结构强制执行自动布局约束

来自分类Dev

跨视图层次结构强制执行自动布局约束

来自分类Dev

如何在phpstorm中对数组声明强制执行长语法?

来自分类Dev

GHC如何在多线程应用程序中强制执行评估?

来自分类Dev

如何在Play 2.x中强制执行JSON的严格序列化

Related 相关文章

  1. 1

    如何在两点之间强制执行约束

  2. 2

    如何在Sublime中强制执行50个字符的提交摘要行?

  3. 3

    如何在.Net中强制执行OutOfMemoryException

  4. 4

    如何在Perl中强制执行long double

  5. 5

    如何在Chrome中强制执行504错误

  6. 6

    如何在vb.net中调试强制执行?

  7. 7

    如何在Perl中强制执行long double

  8. 8

    如何在Java中强制执行构造函数

  9. 9

    如何在GNOME Web中强制执行大文本?

  10. 10

    如何在Jenkins DSL中强制执行参数排序?

  11. 11

    如何在matplotlib中的网格内强制执行图?

  12. 12

    如何在 Antlr 中强制执行某些规则

  13. 13

    如何在 Java <= 8 中强制执行模块边界

  14. 14

    如何指定在Swift中强制执行下标的一般约束?

  15. 15

    SQL:如何使用约束强制执行功能依赖关系?

  16. 16

    MongoDB 在集合中的文档之间强制执行复杂的约束

  17. 17

    在 Spring JPA 中强制执行主键约束

  18. 18

    强制执行SQL Server查询以不返回任何行

  19. 19

    如何在python中从python中强制执行或呈现浏览器中的脚本?

  20. 20

    如何强制执行函数,然后在haskell中返回简单的其他内容

  21. 21

    Python中的枚举:如何在方法参数中强制执行

  22. 22

    如何在Spark SQL中强制执行内存中的分块排序?

  23. 23

    如何在git中强制执行“文件名中没有空格”策略?

  24. 24

    如何在Spark SQL中强制执行内存中的分块排序?

  25. 25

    跨视图层次结构强制执行自动布局约束

  26. 26

    跨视图层次结构强制执行自动布局约束

  27. 27

    如何在phpstorm中对数组声明强制执行长语法?

  28. 28

    GHC如何在多线程应用程序中强制执行评估?

  29. 29

    如何在Play 2.x中强制执行JSON的严格序列化

热门标签

归档