Database VIEW不反映基础TABLE中的数据

时间:2009-06-18 16:26:22

标签: sql sql-server schema

输入:

客户声称,在查询某些数据时,应用程序(.NET)会返回与客户直接查看数据表时不同的数据。

我知道可能有各种各样的原因并且在完全不同的地方。我的目的不是在这里解决它,而是要问有经验的DBA和DB开发人员:

VIEW是否可以显示与基础TABLE不匹配的数据?

  • 可能的原因/原因是什么?
  • 当表格确实没有时,视图上的UPDATE语句是否会导致未来的SELECT返回“已更新”数据?

可能的原因(请对带有问号的人发表评论):

  1. 原因是有两个单独的交易,这可以解释客户的困惑。
  2. 基础表已更改,但视图未刷新(使用sp_refreshview)
  3. 其他用户正在连接,并且由于权限可以看到不同的数据?
  4. 程序员错误:错误的表/列,错误的过滤器(这里一体化)
  5. 发生
  6. 损坏:DBCC CHECKDB应该帮助
  7. 可以SELECT ... FOR UPDATE导致 ???
  8. ? __
  9. 真正发生的事(答案):

    在某些表格中,列位置发生了变化:显然,客户为数据库使用情况分析的顾问提供了完整的数据库访问权限。在使用SELECT * ...子句时,那位伟大的家伙改变了列的顺序,以查看表格开头的几个审计字段。

    使用dbGhost将数据库架构与问题出现前几天的备份架构进行了比较,发现了列位置差异。

    接下来发生的事情与编程无关,但更多的是政治问题。

    因此sp_refreshview是解决方案。我只是更进一步找到导致问题的原因。谢谢大家。

6 个答案:

答案 0 :(得分:21)

是的,有点。

可能的原因:

  1. 需要刷新或重新编译View。当源列定义发生变化并且View(或它依赖的东西)使用“*”时会发生,可能会令人讨厌。调用sp_RefreshView。也可能因为它调用的视图或函数(数据源)而发生。

  2. View正在寻找与他们/您的想法不同的东西。他们正在查看错误的表格或视图。

  3. View正在以意想不到的方式转换数据。它运作正常,就像他们预期的那样。

  4. View返回的数据子集不同于预期。再一次,它运作正常,就像他们想的那样。

  5. 他们正在查看错误的数据库或登录/用户身份,导致View更改其显示的内容。

答案 1 :(得分:10)

如果基础表已更改且未对视图运行sp_refreshview,则可能会出现错误列,如果这些列已添加到表中。

要了解我的意思,请阅读how to make sure that the view will have the underlying table changes by using sp_refreshview

答案 2 :(得分:3)

您可以使用锁定提示创建视图,这意味着您可能会收到脏读。或者当他们直接访问表时,他们可能正在使用锁定提示,这可能会在那时给他们一个脏读。

用户似乎不太了解的另一种可能性是数据不稳定。您在视图中3:00读取的数据可能与您在3:30直接查看表格时看到的数据不同,因为同时发生了变化。

答案 3 :(得分:2)

一些可能性:

  • 您的.NET应用程序可能无法指向您或他们认为指向的位置。例如,它错误地指向了测试服务器

  • 如果视图在浮点数或数值上有索引,由于四舍五入,该值可能与基础查询不同

  • ANSI_NULLS设置特定于视图创建时。如果它与基础表上的选择期间的设置不同,则可能导致某些类型的查询出现差异

  • 基础表结构已更改且视图尚未刷新(如果使用“SELECT *”,则尤其是问题)

如果我想到其他人,我会编辑这篇文章。

编辑:以下是ANSI_NULLS设置如何摒弃结果的示例:

SET ANSI_NULLS ON

DECLARE
     @i     INT,
     @j     INT

SET @i = NULL
SET @j = 1

SELECT
     CASE WHEN @i <> @j THEN 'Not Equal' ELSE 'Equal' END

SET ANSI_NULLS OFF

SELECT
     CASE WHEN @i <> @j THEN 'Not Equal' ELSE 'Equal' END

您应该收到的结果是:

Equal

Not Equal

答案 4 :(得分:1)

假设视图实际上没有转换数据,从技术上讲,如果发生损坏是可能的。 View从一个索引检索数据,'table'从另一个索引检索(即从群集中检索),两者不同步。 DBCC CHECKDB应该揭示问题。

但人为错误的可能性更大,即。他们正在查看与视图不同的表格,或者查看不同的记录。

答案 5 :(得分:0)

当然还有其他事情:

1) Derived attributes are pulling from wrong tables in the view
2) The view is using incorrect tables
3) incorrect or missing joins in the view

列举一些