我和我的团队正在使用 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 可以帮助避免这类问题
答案 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 ,这样当您在视图下更改表时,您也不得不查看视图。