从具有多个基本表的视图中删除记录的最有效方法?

问题描述 投票:0回答:1

我需要编写一个VB函数,以从视图中删除所有已使用默认值/默认约束键值初始化的记录。

我的理解是,唯一的方法是从每个基表中删除记录,但是我不确定是否有比我尝试的方法更简单,更有效的方法。如果可能,我需要一些指导/建议。

这是我想到的唯一方法:

  1. 运行一个从视图返回基表名称的查询(对此是什么查询?)

  2. run sp_helpconstraint N'<table_name>',这将为我提供所有默认值/默认约束类型的列表,以及列名,我需要将默认值与每个表中的值进行比较,并确定是否有记录应该从它们中删除(有关此查询返回的内容,请参见下面的图片):

enter image description here

问题:

  1. 我可以运行哪个查询,该查询将返回视图的基表列表?
  2. 是否有更简便/更有效的方法试图从视图中删除记录?

注意:一旦我确定了如何从视图中返回基本表的列表并开始使用,我将用代码更新此帖子

sql sql-server vb.net view
1个回答
0
投票

您需要了解视图不是数据库中的数据;这是一个存储的SQL查询,每次您从视图中选择时都会运行。

甚至可能是SQL Server接受您的查询并将其与提供视图的查询混合并对其进行优化并运行它们的原因,因此,它甚至不一定运行视图查询,获取所有视图代表,然后在他们中进行步枪寻找一个名为Constantinople Ernhardt的人-SQL Server可能认为静默和透明地重写您提供的查询更好,因此它的计划和运行与您所想的完全不同-它针对每个对象执行此操作查询,该过程称为优化。

您的视图是:

CREATE VIEW MyView AS
SELECT * FROM Person p JOIN Address a on p.AddressId = a.Id

您写:

SELECT * FROM MyView WHERE Name = 'Abc' and HouseName = 'def'

您可能会认为它可以做到这一点(从概念上来说,您是对的:

SELECT * FROM 
(
  SELECT * FROM Person p JOIN Address a on p.AddressId = a.Id
) x WHERE Name = 'Abc' and HouseName = 'def'

但是它可能会改写为:

SELECT * FROM Person p JOIN Address a on p.AddressId = a.Id WHERE Name = 'Abc' and HouseName = 'def'

所以现在已经不复存在了,您可以看到视图只是表顶部的查询,每次您从表中选择时都会运行该视图-如何从查询中删除数据?

您不能,因为查询没有数据;他们从表中检索数据

“从视图中删除数据”的唯一方法是从视图从中选择数据的表中删除数据

您只能通过有关表上的DELETE条语句来执行此操作

[有一种设施,您可以在视图上编写INSTEAD OF触发器,然后从视图中删除,SQL Server将运行该触发器(从基础表中删除)。看起来您似乎正在从视图中删除数据,但是实际上,您只是在以一种机制从底层表中删除数据,就像视图是一种将数据从这些表中拖出的机制一样。

您可以编写一个删除数据的存储过程,但是,这只是从基础表中删除数据的一种机制

根据您的业务目标和以某种方式封装软件的意愿,选择您喜欢的任何方法。例如,过去我有一个我无法更改的软件(丢失了源代码或其他任何东西),并且已经硬连线至SELECT FROM usersDELETE FROM users-我们希望该软件能够继续工作,即使用户表已重命名为成员。我们对表进行了重命名,然后创建了一个名为users的视图,该视图刚刚执行了SELECT * FROM members-允许应用程序继续工作,读取数据。然后,当应用程序尝试对INSTEAD OF视图(该应用程序仍认为是表)执行该操作时,我们创建了users触发器以更新和删除成员表中的数据。

© www.soinside.com 2019 - 2024. All rights reserved.