我将列的数据类型从nvarchar更改为datetime,使SQL Server中的列名保持相同。它是否需要删除并重新创建依赖于该列的视图?SQL Server:列的数据类型更改(保持列名相同)是否需要重新创建视图?
0
A
回答
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
结果证明,在视图中的元数据仍然显示以前的数据类型直到刷新。
相关问题
- 1. 如何更改视图中新创建列的数据类型? SQL
- 2. 是保持效率的重要mysql列数据类型?
- 3. 我是否需要为get/post ActionResult创建相同的列表?
- 4. 列表视图数据保持重复
- 5. 在SQL Server中更新数据类型图像列
- 6. SQL Server CE是否支持空间数据类型的同步?
- 7. SQL Server - SQL级联更改列的数据类型
- 8. 如何使用SQL Server创建两个具有相同列名的透视列?
- 9. 是否需要更新mysql列类型的过程?
- 10. SQL Server - 列顺序是否重要?
- 11. 在SQL Server中更改列数据类型的最快方法
- 12. 更改SQL Server 2008中表列的数据类型
- 13. 更改SQL Server中列的数据类型
- 14. 如何更新数据视图中列的数据类型
- 15. 更改css相同的列表视图
- 16. 需要保持列1相同,但动态地将第二列透视
- 17. SQL Server:如果底层表发生更改,则需要重新创建使用SELECT *的视图
- 18. 是否可以在物化视图中更改列类型?
- 19. SQL Server更改主键数据类型
- 20. SQL Server总和更改数据类型
- 21. 不能改变视图列的SQL数据类型
- 22. 重新排列SQL数据到不同的视图
- 23. SQL - 使用CASE语句更新,是否需要多次重复相同的CASE?
- 24. 在更改列数据类型时保留SQL索引
- 25. 设置数据源后更改数据网格视图列的数据类型
- 26. 需要在SQL Server中更新其中一个值是重复记录的列
- 27. 如何更改视图中虚拟列的数据类型?
- 28. SQL Server 2008 - 根据行的相似分组的列更新列
- 29. 使用新数据库名更新SQL Server 2005视图?
- 30. 创建Microsoft SQL Server的统计信息时,列顺序是否重要?
**没有**,它没有。 –
不,你不需要改变视图。一个View是一个编译好的t-sql,它可以从你选择的任何表中提供。它会自动更改数据类型 – JonWay
如果您已经对列进行了更改,是什么阻止了您只是查询视图并自己测试它?......? – iamdave