SQL Server:视图的架构刷新和绑定

 在数据库设计过程中,我们经常会有这样的情况下
  1. 某个基础表会被多个视图或者存储过程引用

  2. 修改基础表的时候,我们必须小心翼翼地,因为不会有任何提示告诉我们,如果继续修改,会不

会造成视图或者存储过程有问题

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

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

  --第一步:切换当前数据库上下文为
  USE MASTER
  GO

  --第二步:创建一个范例数据库
  CREATE DATABASE demo
  GO

  --第三步:切换当前数据库上下文为
  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'

--此时会发现视图三个字段与表的三个字段是一致的

  --第七步:假设我们需要对表的字段进行修改,例如修改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.

  --这种情况将导致针对视图的查询出现一些意外情况

  --那么,怎么样让视图的架构信息得到刷新呢?

--第九步:通过系统存储过程刷新视图
  EXEC SP_REFRESHVIEW 'TestView'

  --第十步:我们再来查看表和视图的架构信息
  SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestView'
  SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='TestTable'

  --此时会发现,视图和表的架构信息是一致的

  
  --第十一步:假设我们为了避免视图因为没有刷新而出现问题,希望限制TestTable的架构修改。该

怎么办呢

  --我们可以通过绑定架构的选项,将视图绑定到表的架构
  ALTER VIEW TestView
  WITH SCHEMABINDING
  AS
  SELECT ID,Name,Address FROM dbo.TestTable --这里的表名字必须写两个部分,就是包含了架

构名(dbo)


  --第十二步:此时如果再次尝试修改TestTable就会得到错误提示.因为它已经被一个视图绑定了
  ALTER TABLE TestTable ALTER COLUMN Address VARCHAR(2000)

  题外话:

  如果想要刷新存储过程或者函数等其他编程呢?请参考sp_refreshsqlmodule这个存储过程

  如果要自动刷新所有的视图或者存储过程呢?

  --第十三步:生成刷新所有视图的脚本

  SELECT DISTINCT 'EXEC SP_REFRESHVIEW ''' + name + '''' FROM sys.objects WHERE

 type='V'

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值