zoukankan      html  css  js  c++  java
  • 视图的架构刷新和绑定

    在数据库设计过程中,我们经常会有这样的情况下

    1. 某个基础表会被多个视图或者存储过程引用

    2. 修改基础表的时候,我们必须小心翼翼地,因为不会有任何提示告诉我们,如果继续修改,会不会造成视图或者存储过程有问题

    3. 即便我们知道有问题,我们也没有办法去让视图和存储过程刷新得到表最新的信息

    要解决这个问题,我这篇文章来详细讲解一下有关的技术

    --第一步:切换当前数据库上下文为master
    USE MASTER
    GO
    --第二步:创建一个范例数据库
    CREATE DATABASE demo
    GO
    --第三步:切换当前数据库上下文为demo
    USE demo
    GO
    
    --第四步:创建一个范例表格,包含了三个字段
    CREATE TABLE TestTable(ID INT,Name VARCHAR(50),Address VARCHAR(50))
    GO
    
    --第五步:创建一个视图
    CREATE VIEW TestView
    AS
    SELECT ID,Name,Address FROM TestTable
    
    --第六步:查看表和视图的架构信息
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestView'
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestTable'
    --此时会发现视图三个字段与表的三个字段是一致的
    
    image 
    --第七步:假设我们需要对表的字段进行修改,例如修改Address字段的长度为256
    ALTER TABLE TestTable ALTER COLUMN Address VARCHAR(256)
    
    --第八步:我们再来查看表和视图的架构信息
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestView'
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestTable'
    --此时会发现,表中的Address已经修改为了256长度,而视图仍然是50.
    --这种情况将导致针对视图的查询出现一些意外情况
    --那么,怎么样让视图的架构信息得到刷新呢?
    image  


     

    --第九步:通过系统存储过程刷新视图
    EXEC SP_REFRESHVIEW 'TestView'
    
    
    --第十步:我们再来查看表和视图的架构信息
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestView'
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestTable'
    --此时会发现,视图和表的架构信息是一致的
    
    image 
    --第十一步:假设我们为了避免视图因为没有刷新而出现问题,希望限制TestTable的架构修改。该怎么办呢
    --我们可以通过绑定架构的选项,将视图绑定到表的架构
    ALTER VIEW TestView
    WITH SCHEMABINDING
    AS
    SELECT ID,Name,Address FROM dbo.TestTable  --这里的表名字必须写两个部分,就是包含了架构名(dbo)
    
    
    
    --第十二步:此时如果再次尝试修改TestTable就会得到错误提示.因为它已经被一个视图绑定了
    ALTER TABLE TestTable ALTER COLUMN Address VARCHAR(2000)
    image 

    题外话:

    • 如果想要刷新存储过程或者函数等其他编程呢?请参考sp_refreshsqlmodule这个存储过程
    • 如果要自动刷新所有的视图或者存储过程呢?
    --第十三步:生成刷新所有视图的脚本
    SELECT DISTINCT 'EXEC SP_REFRESHVIEW  ''' + name + '''' FROM sys.objects WHERE type='V'
    本文由作者:陈希章 于 2009/6/19 11:24:06 发布在:http://www.cnblogs.com/chenxizhang/
    本文版权归作者所有,可以转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    更多博客文章,以及作者对于博客引用方面的完整声明以及合作方面的政策,请参考以下站点:陈希章的博客中心
  • 相关阅读:
    操作系统路径.islink在使用python的windows上
    Python shutil模块zz
    CMake 两种变量原理 ZZ
    cmake语法-函数和宏的定义
    cmake函数、宏和模块
    cmake函数、宏和模块
    CMake 常用宏分享
    设定cmake输出目录
    android layerlist 里面的rotate标签得到三角形原理详解
    abp(net core)+easyui+efcore实现仓储管理系统——出库管理之三(五十一)
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1506627.html
Copyright © 2011-2022 走看看