更改列长会以任何方式影响视图吗?

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“异步”函数的主体中没有“等待”,它会以任何不同的方式执行吗? [复制]

如果我在 iTC 中添加 IAP,当前没有 IAP 的实时应用会受到影响吗?

以编程方式更改软键盘中候选视图的颜色

以编程方式更改约束只会影响视图的可见部分

打开浏览器开发者工具会影响应用程序性能吗?

以编程方式更改纵横比约束值