Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 从视图及其所有相关表中删除记录_Sql Server 2008_View_Delete Row - Fatal编程技术网

Sql server 2008 从视图及其所有相关表中删除记录

Sql server 2008 从视图及其所有相关表中删除记录,sql-server-2008,view,delete-row,Sql Server 2008,View,Delete Row,我正在使用SQLServerManagementStudio 2008 我想从一个视图中删除一条记录,该视图显示该记录中所有列的空值 我不知道,从哪个表我得到这个空记录 我检查了所有为视图连接的表,但没有一个表包含空记录 是否有人可以帮助我从视图和所有相关表中删除此空记录 因为我在许多其他页面中使用此视图,它会在每个页面中创建空值错误 当我试图从视图中删除此记录时,它会显示如下错误 "Msg 4405, Level 16, State 1, Line 1 View or function 'vi

我正在使用SQLServerManagementStudio 2008

我想从一个视图中删除一条记录,该视图显示该记录中所有列的空值

我不知道,从哪个表我得到这个空记录

我检查了所有为视图连接的表,但没有一个表包含空记录

是否有人可以帮助我从视图和所有相关表中删除此空记录

因为我在许多其他页面中使用此视图,它会在每个页面中创建空值错误

当我试图从视图中删除此记录时,它会显示如下错误

"Msg 4405, Level 16, State 1, Line 1
View or function 'viewGetProgressOverview' is not updatable because the modification affects multiple base tables."

您不能直接从视图的结果中隐藏记录吗?例如

where subscriptionID IS NOT NULL

如果视图定义包含外部联接,则dbms可能正在生成这些空值。如果您的视图需要外部联接,那么实际上没有办法绕过这些空值。如果你保留它们,你会看到空值。如果你隐藏它们,那么你就破坏了外部连接的目的

删除与所需外部联接一致的表的唯一方法是从保留的表中删除一行。(其键导致dbms生成空值的行。)

唯一能阻止您识别保留表中麻烦行的是视图不包含该表的任何候选键。从每个表中添加一个候选键,每次添加一个,直到找到正确的一个。这样做不需要更改视图定义;只需将视图的SELECT语句复制到SQL窗口

如果您在SQL中创建了基于单个表的视图—— 您在视图上执行的DML操作将自动 已传播到基表

但是,当您加入多个表以创建一个视图时 如果对 查看

更新联接视图的规则如下:

联接视图上的任何插入、更新或删除操作只能修改 一次一个基础基表

更新规则

联接视图的所有可更新列都必须映射到列 一个键保留的表。有关讨论,请参阅“密钥保留表” 保留的关键表。如果视图是使用with复选框定义的 OPTION子句,然后重复所有联接列和 表是不可更新的

删除规则

可以删除联接视图中的行,只要只有一行 联接中保留的表的键。如果视图是使用with定义的 CHECK OPTION子句和键保留表被重复,然后 无法从视图中删除行

插入规则

INSERT语句不能显式或隐式 请参阅非键保留表的列。如果连接视图是 使用with CHECK OPTION子句定义的INSERT语句 允许

参考资料:-


我需要采取的最后一步是使用上次备份重新创建hole数据库,并重新创建备份后创建的表。。 现在它也解决了我的问题。
感谢所有人的回复和帮助。

Hmm,sql server是正确的,视图“通常”为只读(如果您的更新只更改一个表中的数据,则它可以工作)。很抱歉,但是您必须展示您的视图定义(可能还有基础表的定义)从viewGetProgressOverview中删除subscriptionID为null的内容…我正在尝试运行此查询..@HiralBavisi not DML,您的DDL语句用于查看可能存在的相关问题,@pbhd和var\uuuuu我无法粘贴查询,因为它太长了。。这不是解决方案,但OP会对此感到满意,然后确定。@ADNow我不知道这对我是否有帮助,但你能告诉我如何隐藏一行。.我应该尝试一次。.如果可能,与我们共享视图查询,必要时对其进行模糊处理。就我个人而言,我认为updateble视图违背了视图的目的(这里也有很好的讨论:),视图有助于对数据进行更安全的只读访问。我知道,如果我从表中删除它,我可以解决它。但我甚至找不到它。有11个表加入了其中。但没有任何问题(您的视图缺少一个候选键。编辑了我的答案。@在这种情况下,HiralBavisi可以使用存储过程或触发器。有关更多信息,您可以参考第一个链接。如果您仍然有任何问题,请告诉我。@HiralBavisi告诉我一件事,您在视图中使用了什么类型的联接查询(我指外部或内部)?
Msg 4405, Level 16, State 1, Line 1
View or function 'ViewName' is not updatable because the modification affects
multiple base tables.