更改列长会以任何方式影响视图吗?
Posted
技术标签:
【中文标题】更改列长会以任何方式影响视图吗?【英文标题】:Changing column length will effect view in any way? 【发布时间】:2014-05-21 11:03:22 【问题描述】:如果我更改了在视图中使用的表的列长度,这会以任何方式影响视图吗?
注意:我使用的是 Sql Server 2008
【问题讨论】:
这可能取决于您如何创建视图以及它是否是索引视图。您能否添加创建视图及其索引的语句? 我创建了一个简单的视图,并在其中使用了 select 语句来授予某人只读权限 如果您创建了带有模式绑定的视图(索引所需),那么您将无法在不先删除视图的情况下进行更改,如果您没有,那么更改将被级联到视图,所以是的,它会影响视图。虽然您可能需要运行 sp_refreshview 来刷新元数据。 修改后不刷新视图还能用吗? 是的,see this simple example 【参考方案1】:如果您使用模式绑定创建了视图(索引所需),那么您将无法在不首先删除视图的情况下进行更改,如果您没有,那么更改将简单地级联到视图,所以是的,它会影响视图。尽管您可能需要运行sp_refreshview 来刷新元数据。 online documentation states:
如果视图不是使用 SCHEMABINDING 子句创建的,则当对影响视图定义的视图下的对象进行更改时,应运行 sp_refreshview。否则,视图在查询时可能会产生意想不到的结果。
我目前正在努力寻找更改长度而不运行“sp_refreshview”会产生意外结果的场景。用这个简单的例子:
CREATE TABLE dbo.T (Col VARCHAR(10));
INSERT dbo.T (Col) VALUES (REPLICATE('X', 10));
GO
CREATE VIEW dbo.V
AS
SELECT *
FROM dbo.T;
GO
SELECT *
FROM dbo.V;
ALTER TABLE dbo.T ALTER COLUMN Col VARCHAR(30);
INSERT dbo.T (Col) VALUES (REPLICATE('X', 30));
SELECT *
FROM dbo.V;
即使sp_refreshview
尚未运行as demonstrated here - 在进行更改后它仍然可用,dbo.V
的第二次选择仍将提供第二行的完整 30 个字符。 但是我仍然建议执行它,它不会伤害!如果您在更改后检查元数据:
SELECT max_length
FROM sys.columns
WHERE name = 'Col'
AND [object_id] = OBJECT_ID(N'dbo.V', 'V');
更改后长度仍为 10。就像一个例子来展示在不调用 sp_refreshview
时要表达的东西,当运行这个时:
CREATE TABLE dbo.T (Col VARCHAR(10));
INSERT dbo.T (Col) VALUES (REPLICATE('X', 10));
GO
CREATE VIEW dbo.V
AS
SELECT *
FROM dbo.T;
GO
SELECT *
FROM dbo.V;
ALTER TABLE dbo.T ADD Col2 VARCHAR(30);
INSERT dbo.T (Col2) VALUES (REPLICATE('X', 30));
SELECT *
FROM dbo.V;
在第二个选择you will not see the column Col2
。但是,在这种情况下,我会责怪视图的作者使用SELECT *
!!!
【讨论】:
以上是关于更改列长会以任何方式影响视图吗?的主要内容,如果未能解决你的问题,请参考以下文章
如果javascript“异步”函数的主体中没有“等待”,它会以任何不同的方式执行吗? [复制]