Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库视图不反映下表中的数据 输入:_Sql_Sql Server_Schema - Fatal编程技术网

Sql 数据库视图不反映下表中的数据 输入:

Sql 数据库视图不反映下表中的数据 输入:,sql,sql-server,schema,Sql,Sql Server,Schema,客户声称,应用程序(.NET)在查询某些数据时返回的数据与客户直接查看数据表时返回的数据不同 我知道可能有各种原因,在完全不同的地方。我的目的不是在这里解决它,而是询问有经验的DBA和DB开发人员是否: 视图是否可能显示与基础表不匹配的数据? 可能的原因是什么? 视图上的UPDATE语句是否会导致future Select返回“已更新”的数据,而表实际上不返回 可能的原因(请对带问号的进行评论): 原因是有两个独立的交易,这将解释客户的困惑 基础表已更改,但视图未刷新(使用sp_refres

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

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

视图是否可能显示与基础表不匹配的数据?
  • 可能的原因是什么?
  • 视图上的UPDATE语句是否会导致future Select返回“已更新”的数据,而表实际上不返回
可能的原因(请对带问号的进行评论):
  • 原因是有两个独立的交易,这将解释客户的困惑
  • 基础表已更改,但视图未刷新(使用sp_refreshview)
  • 不同的用户正在连接,并且由于权限的原因可以看到不同的数据
  • 程序员错误:错误的表/列、错误的筛选器(此处为一体式)
  • 发生损坏:DBCC CHECKDB应该有帮助
  • 可以
    选择。。。对于更新
    导致此
  • ?__ 到底发生了什么(答案): 某些表中的列位置发生了更改:显然,客户向顾问提供了完全的数据库访问权限,以便进行数据库使用情况分析。当使用
    SELECT*…
    子句时,那个伟大的家伙改变了列的顺序,以查看表开头的几个审计字段

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

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


    因此,
    sp_refreshview
    就是解决方案。我只是又多走了一步,想找出是谁造成了这个问题。谢谢大家。

    如果基础表已更改,并且sp_refreshview未针对该视图运行,则该视图可能会丢失添加到表中的列


    要了解我的意思,请阅读

    确定还有其他内容:

    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
    
    举几个例子是的,有点

    可能的原因:

  • 视图需要刷新或重新编译。当源列定义更改并且视图(或它所依赖的对象)正在使用“*”时,可能会发生这种情况。调用sp_刷新视图。也可能因为它调用的视图或函数(数据源)而发生

  • 这种观点与他们/你的想法不同。他们看错了表或视图

  • 视图正在以意外的方式转换数据。它工作正常,只是不像他们预期的那样

  • 视图返回的数据子集与预期的不同。再说一次,它是正确的,只是不像他们想的那样

  • 他们正在查看错误的数据库/服务器,或者使用导致视图更改显示内容的登录/用户标识。特别邪恶,因为与ManagementStudio不同,大多数客户端程序不会告诉您它们指向的是哪个数据库/服务器

  • 有几种可能性:

    • 您的.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
    

    假设视图没有实际转换数据,从技术上讲,如果发生损坏,则是可能的。视图从一个索引检索数据,“表”从另一个索引检索数据(即从集群),而这两个索引不同步。DBCC CHECKDB应该会发现问题


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

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


    用户似乎不理解的另一种可能性是数据是流动的。3:00在视图中读取的数据可能与3:30直接查看表时看到的数据不同,因为在此期间发生了更改。

    +1对此,更改表结构时必须刷新视图,否则会发生奇怪的事情。@birdlips。对不起,伙计。不寻找程序员的错误。寻找由于其他因素(当然也包括人为因素)可能导致这种不一致的情况@Tom。你可以评论更多或添加链接到ANSI_NULLS相关的原因。谢谢。我在上面的帖子中加入了一个例子(注释中的代码不太好用)哈哈,我不能告诉你我们有多少bug,有人在那里寻找的QA信息只在prod.Heh上。是的,我花了很多时间(虽然有利可图)陪客户处理类似的案例。有一半的时间,直截了当的提问是不起作用的:“你确定你在生产吗?是的。”+2小时:“你确定吗?是的。”+3小时:“那么你确定吗?”(愤怒随之而来)。所以现在我用一些问题来掩饰它,比如“它在查询窗口状态栏左侧的第三个单元格中说了什么?.QA?那是你的QA数据库吗?”
    Equal
    
    Not Equal