你是否也忘了刷新视图?

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

起因:

由于工作原因,我隔几天就要执行一批开发人员提供过来的脚本,部分是新需求的开发,部分是修复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‘) ;

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

时间: 2024-10-10 03:52:32

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

IOS如何刷新视图上的显示内容

大家都知道,UItableView 有个 reloadData的方法,可以tableview刷新视图.而普通的View上面.我们如何刷新视图的呢? 下图是我做的一个用户登录之后显示用户昵称和个性签名还有头像的界面.当用户登录之后跳转到这个页面,然后显示用户的简单信息.点击退出登录后信息也随之消失. 我的方法是,在视图将要出现的时候“-(void)viewWillAppear:(BOOL)animated” 再调用  “ [self.view addSubview:headimg];”这个方法.然

5.3刷新视图

在创建视图时,sql server会保存元数据信息,用于描述视图.列.安全.依赖等信息:基础对象中的架构更改不影响视图的元数据:更改架构后使用sp_refreshview存储过程刷新视图是一个好习惯,这样对架构的更改就会反映在视图中. 为了掩饰架构改变后,不刷新视图元数据会发生什么情况,运行下面的代码创建表T1和视图V1 use tempdb; go if OBJECT_ID ('dbo.v1') is not null drop view dbo.v1; if OBJECT_ID('dbo.T

(MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决

在近期工作中遇到一个任务,需要批量更改散布在很多Table中的某字段,同时刷新相关视图,但是在执行脚本时,发现了如下问题 更新字段问题 消息 5074,级别 16,状态 1,第 1 行 对象'View_RosterStudent' 依赖于 列'sName'. 消息 4922,级别 16,状态 9,第 1 行 由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN sName 失败. 刷新视图问题 消息 15165,级别 16,状态 1,过程 sp_refreshsqlmod

iOS:风火轮活动刷新视图控件UIActivityIndicatorView的详细使用

动态风火轮视图控件:UIActivityIndicatorView 介绍:它是一种类似于风火轮旋转的视图控件,可用作刷新数据时显示加载过程所用,继承自UIView. 类型: typedef NS_ENUM(NSInteger, UIActivityIndicatorViewStyle) { UIActivityIndicatorViewStyleWhiteLarge,  //大的白色类型 UIActivityIndicatorViewStyleWhite,         //白色类型 UIAc

Oracle查询库中已有存储过程、创建定时刷新视图、角色权限传递、创建序列触发器

SELECT * FROM V$ACCESS O WHERE O.TYPE LIKE 'PROCEDURE%' 创建物化视图且定时刷新create materialized view mv_name refresh force on demand start with sysdate next sysdate + 1create materialized view mv_name refresh force on demand start with sysdate next to_date( c

Vue,数据更新不能刷新视图

//参一当前要更新的数据对象 //参二要改变的数组元素的下标,//参三:新数据(要更新到视图中的新数据) Vue.set(this.todos, inde, arr[inde]);

定时刷新视图,写的一个小小的程序,一年前

// //  ViewController.m //  手机网易2 // //  Created by BreazeMago on 15/1/7. //  Copyright (c) 2015年 BreazeMago. All rights reserved. // #import "rootViewController.h" @interface rootViewController ()<UITableViewDataSource,UITableViewDelegate,UI

自定义刷新控件

1.上拉刷新 定义一些属性: 1.是否正在刷新,2.进度,3.scrollview,4.刷新操作block,5.子控件 @property(nonatomic,strong)UIImageView *cloudImageView2; @property(nonatomic,strong)UIImageView *cloudImageView3; ..... @property(nonatomic,assign)CGFloat progress;//进度 @property(nonatomic,a

数据库的数据类型、索引、锁、事务和视图

数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 日期/时间类型 字符串(字符) 类型 3)选择正确的数据类型对于获得高性能至关重要,三大原则: 更小的通常更好,尽量使用可正确存储数据的最小数据类型 简单就好,简单数据类型的操作通常需要更少的CPU 周期 尽量避免NULL,包含为NULL的列,对MySQL更难优化 4)整型 tinyint(m) 1节个字节,