【问题标题】:adding a field somehow effects a views results添加字段以某种方式影响视图结果
【发布时间】:2015-02-17 00:30:05
【问题描述】:

有一个非常奇怪的情况。出于各种原因,我们有一堆表格是这样做的:

TableA 重命名为 TableASource 并创建了一个名为 TableA 的视图 TableB 被重命名为 TableBSource 并创建了一个名为 TableB 的视图

这一切都很好,并且已经完成了一段时间。昨天我向 TableASource、TableBSource(和其他)添加了一个新字段。这是一个名为“createDate”的字段,一个 smallDateTime,没有空值,默认值为 getDate()。你会认为这对任何事情都应该是零影响。今天,用户说的第一件事就是他们可以看到这些日期而不是预期的数据。 E.G Lest 说我们有一个页面从名为 TableA 的视图中提取 10 个字段,而不是显示这 10 个字段,它现在正确显示 9 个并随机显示添加到 TableASource 的新 createDate 字段中的值(如果重要的话,放置它在页面的第二个字段中)

我很快删除了所有这些新的 createDate 字段,问题就消失了。这怎么可能发生?向 TableASource 添加字段如何影响 TableA 视图的结果?

使用 SQLServer2008 r2

回答下面的额外问题。这是名为“bayTrainCourses”的视图,上面已将其描述为 TableA:

SELECT  btc.course_id, btc.course_name, btc.course_status, btc.course_expiry, btc.course_startdate, btc.course_enddate, btc.course_type, btc.site_id, btc.channelid, btc.exam_type, btc.enroll_type, btc.last_updated, btc.compid, btc.TOC, btc.rdone, btc.autoqualify, btc.courseIntroId, btc.coursePurposeId, btc.courseBackgroundId,btc.courseObjectivesId, intro.    [content] AS course_intro, purpose.[content] AS course_purpose, background.[content] AS course_background, 
objectives.[content] AS course_objectives
FROM dbo.bayTrainCoursesSource AS btc 
LEFT OUTER JOIN dbo.RTE AS intro ON btc.courseIntroId = intro.pk 
LEFT OUTER JOIN dbo.RTE AS purpose ON btc.coursePurposeId = purpose.pk 
LEFT OUTER JOIN dbo.RTE AS background ON btc.courseBackgroundId = background.pk 
LEFT OUTER JOIN dbo.RTE AS objectives ON btc.courseObjectivesId = objectives.pk

选择是:

select * from baytraincourses....

EDITING - 由于一些试验错误。事实证明,试验实际上是下面 JohnS 的建议。重新创建视图....我将视图重命名为baytraincourses_broken。然后右键单击 > 脚本视图为 > 创建为 > 然后我将“baytraincourses_broken”更改为“baytraincourses”以使用原始名称重新创建另一个版本。现在页面可以工作了。

我不是观点的忠实拥护者。老实说,我创建它们非常罕见,我正在使用我最初没有编写的代码。每次添加新列时,我真的必须重新创建视图吗?当然不是,我该如何处理呢?

【问题讨论】:

  • 当您将 10 列从数据库加载到您的页面中时,您正在运行什么查询?类似于:^Select * from TableA^?您在什么位置添加了该列?在其他人之间还是在“结束”?
  • 你能给我们看一下视图的脚本吗?
  • 是从 TableA 中选择 *。该列被添加到末尾

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

将新字段添加到 TableASource 后,您需要重新创建视图。 (即 DROP VIEW TableA ... 然后 CREATE VIEW TableA ...)。

【讨论】:

  • 绝对不行,这无济于事。
  • 现在我很困惑。这确实奏效了。真的,在向表中添加列后,我是否必须重新创建视图?肯定不是!我已经用不同的观点更新了我原来的帖子
  • 尽管有 DavidG 的评论,但我自己也遇到了同样的症状。重新创建视图总是修复它。 @DavidG,您可能会考虑撤消您的反对票!
  • @Mat41,如果这个答案有效,你可以考虑接受这个答案。我经常为依赖于重组表的任何视图生成一个 DROP/CREATE 脚本。
  • 我的反对意见仍然是放弃任何对象并重新创建它不仅仅是重新创建对象。至少您会失去分配给视图的任何显式权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2019-01-19
  • 1970-01-01
  • 2017-05-23
  • 2013-07-01
  • 2011-07-13
相关资源
最近更新 更多