2017-06-01 59 views
0

我将列的数据类型从nvarchar更改为datetime,使SQL Server中的列名保持相同。它是否需要删除并重新创建依赖于该列的视图?SQL Server:列的数据类型更改(保持列名相同)是否需要重新创建视图?

+0

**没有**,它没有。 –

+0

不,你不需要改变视图。一个View是一个编译好的t-sql,它可以从你选择的任何表中提供。它会自动更改数据类型 – JonWay

+0

如果您已经对列进行了更改,是什么阻止了您只是查询视图并自己测试它?......? – iamdave

回答

2

更改基本表列类型,你应该总是做至少刷新视图:

exec sp_refreshview 'yourView' 

这就是为什么。 当您更改表格定义时,不会刷新视图元数据。 现在,我们已经认识到,您拥有对基表没有权限的用户,但在视图上具有SELECT权限。如果他们询问sp_help这个视图的列,或者他们在OE中打开了Columns文件夹,它仍然会显示旧的类型。然后用户可以进行非法查询,他们会疯狂地弄清楚会发生什么。 我给你这个例子来展示会发生什么。

create view dbo.vw_test_types as 
select art_code, art_desc 
from dbo.test_types; 
go 

insert into dbo.test_types (art_code, art_desc) 
values ('123', 'trekking shoes'); 
go 

alter table dbo.test_types alter column art_code int; 
go 

exec sp_help 'dbo.vw_test_types' 

select art_desc + ' ' + art_code as full_art_desc 
from dbo.vw_test_types; 

--Msg 245, Level 16, State 1, Line 33 
--Conversion failed when converting the varchar value 'trekking shoes ' to data type int. 


exec sp_refreshview 'dbo.vw_test_types' 
go 

exec sp_help 'dbo.vw_test_types' 
go 

这里创建一个只包含varchar列的表。然后,基于此表创建视图并输入一行。此时您决定将art_code类型更改为int,该命令正常工作。 但是看看你的视图的元数据(exec sp_help'dbo.vw_test_types'),它仍然只显示你的varchar列。 现在有一个用户无法访问基表,他想要显示包括art_code在内的整个描述。他打开SSMS - > OE - > dbo.vw_test_types - >列,看到所有列都是varchar,所以他只是连接art_desc和art_code。并得到错误!他真的可以关注它,他只有varchar,但错误告诉他abot int类型

甚至更​​糟。请考虑用户是否基于该查询构建了一些报告。有一天,所有这些报告都不起作用,他们可以配置为不向用户显示错误,只是不显示“处理查询时发生错误”

0

不是一个答案,而是进一步sepupic的回答上述(谁打我冲!),考虑以下因素:这将是

col1 numeric 

(1 row(s) affected) 

col1 numeric 

(1 row(s) affected) 

col1 int 

因此

Begin Transaction 
Create Table dbo.SOTest(col1 Numeric(12,2)); 
Go 
Create View dbo.SOTestV As Select col1 From dbo.SOTest 
Go 
Select c.name, t.name 
From sys.columns As c 
Join sys.types As t 
On c.user_type_id = t.user_type_id 
Where c.object_id = Object_Id('dbo.SoTestV') 
Go 
Alter Table dbo.SOTest Alter Column col1 Int 
Go 
Select c.name, t.name 
From sys.columns As c 
Join sys.types As t 
On c.user_type_id = t.user_type_id 
Where c.object_id = Object_Id('dbo.SoTestV') 
Go 
Exec sys.sp_refreshview N'dbo.SOTestV' 
Go 
Select c.name, t.name 
From sys.columns As c 
Join sys.types As t 
On c.user_type_id = t.user_type_id 
Where c.object_id = Object_Id('dbo.SoTestV') 
Go 
Rollback Transaction 

结果证明,在视图中的元数据仍然显示以前的数据类型直到刷新。

相关问题