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

时间:2012-12-25 11:59:49

标签: sql-server-2008 view delete-row

我正在使用SQL Server Management studio 2008。

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

我无法知道,从哪个表中我得到这个空记录。

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

任何人都可以帮我从我的视图和所有相关表中删除此空记录吗??

因为我在许多其他页面中使用此视图,并且它在每个页面中创建具有空值的错误。

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

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

4 个答案:

答案 0 :(得分:3)

  

如果您在SQL中创建了一个基于单个表的视图 -   您在视图上执行的DML操作是自动进行的   传播到基表。

     

但是,当您加入多个表来创建视图时   如果你执行一个DML语句将会遇到以下错误   图

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

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

  

连接视图上的任何INSERT,UPDATE或DELETE操作都只能修改   一次一个基础基表。

     

更新规则

     

连接视图的所有可更新列都必须映射到列   一张钥匙保存的桌子。有关讨论,请参阅“密钥保留表”   密钥保留表。如果使用WITH CHECK定义视图   OPTION子句,然后是所有连接列和重复的所有列   表是不可更新的。

     

删除规则

     

只要只有一行,就可以删除连接视图中的行   连接中的密钥保留表。如果使用WITH定义视图   CHECK OPTION子句和密钥保留表重复,然后   无法从视图中删除行。

     

INSERT规则

     

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

参考: -

Inserting to a View – INSTEAD OF TRIGGER – SQL Server

Sql updatable view with joined tables

答案 1 :(得分:0)

难道你不能只从视图的结果中隐藏记录吗? E.g。

where subscriptionID IS NOT NULL

答案 2 :(得分:0)

如果您的视图定义包含外部联接,则dbms可能制造那些空值。如果您的视图需要一个外部联接,那么这些空值实际上没有任何办法。如果你保留它们,那么你会看到空值。如果你隐藏它们,那么你就是在破坏外连接的目的。

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

唯一可以阻止您识别保留表中令人烦恼的行的是该视图不包含该表的任何候选键。从每个表中添加一个候选键,一次一个,直到找到正确的键。您无需更改视图定义即可执行此操作;只需将视图的SELECT语句复制到SQL窗口即可。

答案 3 :(得分:0)

我需要采取的最后一步是使用我的上一次备份重新创建漏洞数据库,并重新创建我在备份后创建的表格。 现在它也解决了我的问题。 谢谢大家的回复和帮助..