SQL Server,VIEW混淆了数据

时间:2017-09-12 16:21:10

标签: sql sql-server

我和我的团队正在使用 Microsoft SQL Server 2014 - 标准版(64位)

我们像往常一样创建了一些视图,它们在编码和测试时正常工作(编辑)。

然后突然之间,我们的一个QA发现应用程序中的数据混合,例如, description 数据位于名称字段,名称 sex 应该是的地方等。

我们在表格中获取数据并且它是正确的,然后我们检查了视图,查询了这个 SELECT * FROM VIEW 这样的视图,并意识到视图混淆了数据。 即可。下一个逻辑步骤是检查视图查询,我们惊讶地发现所有查询都是正确的。发生了什么事?

嗯,这就是问题,如果视图中的查询是正确的并且它们长时间运行良好,为什么视图中的数据已损坏或混淆?

我们只是 ALTER ED视图,而不是修改任何内容并修复了问题。

但是,我们需要知道数据损坏的原因,因为我们不想一直监视和更改视图。

按要求查看代码

ALTER VIEW [dbo].[pvvClient] AS 
SELECT *
FROM Table
INNER JOIN Table 2 ON.....

我想到的第一件事就是表格已经发生了变化并引发了这种行为,您认为 SCHEMABINDING 可以帮助避免这类问题

3 个答案:

答案 0 :(得分:2)

在没有更改任何代码的情况下简单地更改视图就没有意义,但是重要的一点是视图的这一部分......

SELECT TOP 1000 [Count] ,[RecordCountSnapshotId] ,entityview.ObjectTypeCode, Name FROM [YOURCRM_MSCRM].[dbo].[RecordCountSnapshot] , EntityView where entityview.ObjectTypeCode = RecordCountSnapshot.ObjectTypeCode and count > 0 order by count desc

如果此表定义发生更改...即,如果添加了更多列或删除了一些列,则此视图中的列也会更改。这就是为什么在视图中永远不选择*是一种好习惯,尤其是在查询另一个视图时。

此外,此表可以具有与其他表相同的列名。

您的申请中可能发生的事情是select pvtConsumidorFinanciero.*。同样,如果DBA更改了视图,这可能会弄乱您的应用程序,因此我会避免明确列出您希望它们返回的顺序返回的列。

答案 1 :(得分:2)

当您将*放在视图的列列表中并且基础表发生更改时,您的视图将不会自动更新以包含更改的列。实际上,如果删除列,则可以跨列混合数据。这已经多次讨论和记录。 Aaron Bertrand有一篇很棒的文章涉及这个主题。

故事的道德,避免使用select *,除非select在EXISTS内。

答案 2 :(得分:0)

我认为这也是答案的一部分:

创建视图时,最好使用 SCHEMABINDING ,这样当您在视图下更改表时,您也不得不查看视图。