Sql server SQL Server:列的数据类型更改(保持列名不变)是否需要重新创建视图?

Sql server SQL Server:列的数据类型更改(保持列名不变)是否需要重新创建视图?,sql-server,Sql Server,我将列的数据类型从nvarchar更改为datetime,在SQLServer中保持列名不变。是否需要删除并重新创建依赖于该列的视图?当您更改基表列类型时,您应始终至少刷新视图: exec sp_refreshview 'yourView' 这就是为什么。 更改表定义时,不会刷新视图元数据。 现在,我要告诉您,您的用户对基表没有权限,但对视图有SELECT权限。如果他们向sp_询问有关此视图的列的帮助,或者如果他们在OE中打开columns文件夹,它仍将显示旧类型。然后用户可以进行非法查询,他

我将列的数据类型从nvarchar更改为datetime,在SQLServer中保持列名不变。是否需要删除并重新创建依赖于该列的视图?

当您更改基表列类型时,您应始终至少刷新视图:

exec sp_refreshview 'yourView'
这就是为什么。 更改表定义时,不会刷新视图元数据。 现在,我要告诉您,您的用户对基表没有权限,但对视图有SELECT权限。如果他们向sp_询问有关此视图的列的帮助,或者如果他们在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_代码类型更改为int,该命令工作正常。 但看看视图的元数据(exec sp_help'dbo.vw_test_types'),它仍然只显示varchar列。 现在有一个用户无法访问基表,他希望显示整个描述,包括art_代码。他打开SSMS->OE->dbo.vw_test_types->Columns,看到所有的列都是varchar,所以他只是连接了art_desc和art_代码。并且得到了错误!他真的可以对此感到抱歉,他只看到了瓦尔查,但错误告诉他一个int类型


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

当您更改基表列类型时,您应该至少刷新视图:

exec sp_refreshview 'yourView'
这就是为什么。 更改表定义时,不会刷新视图元数据。 现在,我要告诉您,您的用户对基表没有权限,但对视图有SELECT权限。如果他们向sp_询问有关此视图的列的帮助,或者如果他们在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_代码类型更改为int,该命令工作正常。 但看看视图的元数据(exec sp_help'dbo.vw_test_types'),它仍然只显示varchar列。 现在有一个用户无法访问基表,他希望显示整个描述,包括art_代码。他打开SSMS->OE->dbo.vw_test_types->Columns,看到所有的列都是varchar,所以他只是连接了art_desc和art_代码。并且得到了错误!他真的可以对此感到抱歉,他只看到了瓦尔查,但错误告诉他一个int类型


甚至更糟。想想用户是否基于该查询构建了一些报告。有一天,所有这些报告都不起作用,它们可以被配置成不向用户显示错误,只是不显示“处理查询时出错”(

< P>),而不是作为答案,但要进一步研究SePopic的答案(谁打我!),请考虑以下内容:

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
其结果将是

col1   numeric

(1 row(s) affected)

col1   numeric

(1 row(s) affected)

col1   int

从而证明视图中的元数据在刷新之前仍然显示先前的数据类型。

< P>不作为答案,但要进一步对SePopic的回答(谁打我),请考虑以下内容:

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
其结果将是

col1   numeric

(1 row(s) affected)

col1   numeric

(1 row(s) affected)

col1   int

从而证明视图中的元数据在刷新之前仍然显示以前的数据类型。

否,不显示。否,您不需要更改视图。视图是一个已编译的t-sql,它从您从中选择的任何表中提供数据。它将自动更改数据类型如果您已经对列进行了更改,是什么阻止了您只是查询视图并自己进行测试…?@iamdave nothing,这就是我在测试中要做的事情,但是,我需要浏览并找到使用这个专栏的人的很多观点,这里社区的一些关于这个在后台如何工作的信息将真正帮助我规划我的测试。感谢安装RedGate对SSM的SQL搜索。然后可以搜索引用已更新的表/列的视图。显然,您最好在进行更改之前完成所有这些检查…不,它没有。不,您不需要更改视图。视图是一个已编译的t-sql,它从您从中选择的任何表中提供数据。它将自动更改数据类型如果您已经对列进行了更改,是什么阻止了您只是查询视图并自己进行测试…?@iamdave nothing,这就是我在测试中要做的事情,但是,我需要浏览并找到使用这个专栏的人的很多观点,这里社区的一些关于这个在后台如何工作的信息将真正帮助我规划我的测试。感谢安装RedGate对SSM的SQL搜索。然后可以搜索引用已更新的表/列的视图。显然,您最好在进行更改之前完成所有这些检查。。。