客户声称,在查询某些数据时,应用程序(.NET)会返回与客户直接查看数据表时不同的数据。
我知道可能有各种各样的原因并且在完全不同的地方。我的目的不是在这里解决它,而是要问有经验的DBA和DB开发人员:
SELECT ... FOR UPDATE
导致 ??? 在某些表格中,列位置发生了变化:显然,客户为数据库使用情况分析的顾问提供了完整的数据库访问权限。在使用SELECT * ...
子句时,那位伟大的家伙改变了列的顺序,以查看表格开头的几个审计字段。
使用dbGhost将数据库架构与问题出现前几天的备份架构进行了比较,发现了列位置差异。
接下来发生的事情与编程无关,但更多的是政治问题。
因此sp_refreshview
是解决方案。我只是更进一步找到导致问题的原因。谢谢大家。
答案 0 :(得分:21)
是的,有点。
可能的原因:
需要刷新或重新编译View。当源列定义发生变化并且View(或它依赖的东西)使用“*”时会发生,可能会令人讨厌。调用sp_RefreshView。也可能因为它调用的视图或函数(数据源)而发生。
View正在寻找与他们/您的想法不同的东西。他们正在查看错误的表格或视图。
View正在以意想不到的方式转换数据。它运作正常,就像他们预期的那样。
View返回的数据子集不同于预期。再一次,它运作正常,就像他们想的那样。
他们正在查看错误的数据库或登录/用户身份,导致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
列举一些