你是否也忘了刷新视图?

原文:你是否也忘了刷新视图?

起因:

         由于工作原因,我隔几天就要执行一批开发人员提供过来的脚本,部分是新需求的开发,部分是修复bug。往往包含有几百个。我用工具批量执行之后,系统继续运行,后来反反复复会有这样那样的错误,其中一个,经过开发人员的检查,是因为视图没刷新。

         对此我纳闷了很久,视图不就是一堆select语句吗?怎么还要刷新?难道表改了不会跟着改?为此,我首先自己做一个实验,发现的确不会马上改过来,至于啥时候才更改,也不清楚,听说从2000的时候,这个问题已经存在,看来我孤陋寡闻了。

测试:

 步骤一:首先执行下面语句

USE tempdb
GO
--创建表
IF OBJECT_ID('testTB') IS NOT NULL
    DROP TABLE testTB
GO
CREATE TABLE testTB ( id INT, NAME VARCHAR(10) )
--插入测试数据
INSERT INTO testTB
SELECT 1,'a'
UNION ALL
SELECT 2,'b'
UNION ALL
SELECT 3,'c'

IF OBJECT_ID('V_testTB') IS NOT NULL
DROP VIEW V_testTB
GO
CREATE   VIEW V_testTB
AS
    SELECT  *
    FROM    testTB
go 

SELECT * FROM V_testTB

得到结果:

步骤二:更改表结构

--添加一列
ALTER TABLE testTB ADD  age INT

然后再来执行一下视图:

SELECT * FROM V_testTB

得到结果:

反复执行了10次,结果还是没变。

步骤三:使用存储过程刷新视图

sp_refreshview V_testTB

然后再执行查询视图的语句:

SELECT * FROM V_testTB

眼前一亮,得到结果:

可以看出,结构已经刷新,证明有效果了。

分析:

        细心的人应该发现,其实视图里面我用了*号。可以通过实验来证明,如果不用星号,是没问题的。而如果指定了列名,那么在新加一列的时候,管它有没有刷新,都不会有问题,因为你压根就不会用到这列,那么如果是删除呢?现在来试试,建表的代码依旧,把原有的添加列的代码改成删除列,另外*号依旧保留:

--删除一列
ALTER TABLE testTB DROP   COLUMN  id

再执行:

SELECT * FROM V_testTB

会得到以下的错误:

证明删除是会报错的,不需要刷新,那么估计大家也猜到,就算指定列,也会报错,现在来证实一下:

这次报错是这个,部分代码我就不写了。

总结:

根据上面的实验,可以得出:

 1、视图里面尽可能不要出现*号。*号不仅对性能有影响,也不便于结构的更新。

       

 2、无论视图所涉及的表结构有无修改,每次执行脚本后,刷新一下,总是好的。并且我遇到过这样的情景,一个名字是存储过程的名字,但是在使用:

SELECT DISTINCT
        'EXEC sp_refreshview ''' + name + ''''
FROM    sys.objects AS so
        INNER JOIN sys.sql_expression_dependencies AS sed ON so.object_id = sed.referencing_id
WHERE   so.type = 'V'
        AND sed.referenced_id = OBJECT_ID('testTB') ;

下面语句中时竟然能查出来,证明定义的时候有问题,所以这一步也同时可以检查一下会不会存在问题对象。顺带说一句,上面的脚本是把需要刷新的视图拼接出来,然后一次性执行。

时间: 2025-01-19 19:41:40

你是否也忘了刷新视图?的相关文章

jqueryMobile 动态添加元素,展示刷新视图的实现方法_jquery

jQuery Mobile的是一个很好的移动开发框架,你可能已经知道,虽然它有很多难以解决的问题,但是我相信后续版本jquery会修复--我是很喜欢jquery的.这并不是说它很完美无暇,很多开发人员遇到的情况也都难解决,比如:尝试使用代码来添加,更新或删除元素,使用JavaScript的页面跳转.在这篇博客文章中,我列出了一些动态添加组建重新刷新的方法. 1.Textarea field $('body').prepend('<textarea id="myTextArea"&

sql 刷新视图_MsSql

比如我们创建了一个表T1和一个T1的视图V1,然后更改T1,再看V1的结果: 首先创建表T1: 复制代码 代码如下: IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 CREATE TABLE T1(col1 INT,col2 INT) INSERT INTO T1(col1,col2) VALUES(1,2) GO 然后创建T1的视图V1: 复制代码 代码如下: CREATE VIEW V1 AS SELECT * FROM T1 在现实实践中,要避免在

sql 刷新视图

比如我们创建了一个表T1和一个T1的视图V1,然后更改T1,再看V1的结果: 首先创建表T1: 复制代码 代码如下: IF OBJECT_ID('T1') IS NOT NULL DROP TABLE T1 CREATE TABLE T1(col1 INT,col2 INT) INSERT INTO T1(col1,col2) VALUES(1,2) GO 然后创建T1的视图V1: 复制代码 代码如下: CREATE VIEW V1 AS SELECT * FROM T1 在现实实践中,要避免在

刷新视图-android GridView(九宫格)刷新问题

问题描述 android GridView(九宫格)刷新问题 安卓新手一枚,近期写了一个小游戏练手,仿照了微信上的那个在一堆颜色方块中找出不同颜色方块的网页游戏.个人思路是采用GridView实现,通过替换adpter来刷新颜色方块,自定义了一个view来绘制item.在方块刷新的一瞬间发现问题:gridview区域会自上而下出现一闪而过的条纹.已经排除设备问题,不知是不是思路有误,或者说这种瞬间替换全部item的情况不适合用gridview呢?在此先感谢大家的看法与建议,初来乍到也没积分啥的非

在Eclipse中构建备忘单

Eclipse提供了一种用于显示迷你型指南的内置机制,称为备忘单(cheat sheet).备忘单可以快速而有效地指导您如何在Eclipse中执行包含多个步骤的过程,它显示在工作台的边角处,您可以容易且快速地查看它们. 本教程演示了如何为Eclipse构造备忘单.构造完毕之后,它们还可以运行在BEA Workshop Studio.BEA Workshop for WebLogic和其他任何Eclipse系统之上,或许能对您现有的工具和插件进行补充.示例下载中提供了3个准备好的备忘单,其中一个备

listView下拉刷新(仿sina微博Android客户端效果)

  这个下拉效果在网上最早的例子恐怕就是Johan Nilsson的实现,http://johannilsson.com/2011/03/13/android-pull-to-refresh-update.html.       后面的很多例子应该都是仿照这个写的,下面的这个例子就是对这个例子的修改,先看下一个点击的效果,我看到其他的分析博客里面没有谈到这一点,在这个代码中,我们一直看到是listview的第二项,而listview的第一项被遮挡了起来,滑动至第一项:        点击头条,头

MySQL笔记之视图的使用详解_Mysql

什么是视图 视图是从一个或多个表中导出来的表,是一种虚拟存在的表. 视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据. 这样,用户可以不用看到整个数据库中的数据,而之关心对自己有用的数据. 数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中. 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据. 视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变.   视图的作用 1.使操作简单化,可以对经常使用的查询定义一个视图,使

Android UI自定义ListView实现下拉刷新和加载更多效果_Android

关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的.因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中去,这里只是一个demo,可以根据项目的需要进行修改. 就不要太在乎界面了哈: 知道你们想要源码了,去下吧:http://download.csdn.net/detail/wwj_748/6373183 自定义ListView: package com.mar

Android框架AndBase实现PullToRefrech下拉刷新

PullToRefrech下拉刷新..这个效果在绝大多数使用app貌似都使用的到..一个页面的.如果数据太多必然进行下拉..那么下拉之后就需要显示新的数据信息..这就是下拉刷新的完整体现.也可以说这种效果能够给用户一个更加良好的体验..那么我们看看下拉刷新到底是如何实现的.. 1.普通View的PullReferch   无论是普通View的下拉刷新还是ListView,还是GridView..下拉刷新实现的原理基本都是相同的..只不过实现上有一些简单的细节不太一样而已...首先先看看普通Vie