你是否也忘了刷新视图?

186 篇文章 6 订阅
130 篇文章 237 订阅

起因:

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

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




  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
视图(View)是一种虚拟的表,在数据库中并不实际存储数据,而只是对数据库中一个或多个表的引用。可以将视图看作是一个预定义的查询结果集,它是从一个或多个表中选择、计算和聚合数据得到的。 视图可以定义在一个或多个表上,可以包含查询、计算和聚合操作,也可以包含多个视图的引用。用户可以通过查询视图来获取数据,而不需要直接访问底层的表。 视图的优点如下: 1. 简化查询:视图可以将复杂的查询操作封装起来,为用户提供简单易用的接口。用户只需要查询视图,而不需要了解底层表的结构和关系。 2. 数据安全:视图可以限制用户对数据的访问权限,只允许用户访问视图中指定的数据。通过视图,可以隐藏敏感数据,保护数据安全。 3. 数据独立性:视图可以将应用程序与底层数据解耦,提高数据独立性。当底层数据结构发生变化时,只需要修改视图定义,而不需要修改应用程序。 4. 性能优化:视图可以降低系统的负载,提高查询性能。当视图中包含复杂的计算和聚合操作时,可以将这些操作放到数据库服务器上进行计算,减少数据传输和处理的开销。 5. 逻辑清晰:视图可以将多个表的关系和查询操作封装起来,提高数据模型的逻辑清晰度和可维护性。 因此,视图是数据库中一个重要的概念,它提供了许多优点,可以帮助用户简化查询、提高数据安全、降低系统负载等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值