【问题标题】:Changing the size of a column referenced by a schema-bound view in SQL Server更改 SQL Server 中架构绑定视图引用的列的大小
【发布时间】:2009-08-24 01:55:46
【问题描述】:

我正在尝试使用以下方法更改 sql server 中列的大小:

ALTER TABLE [dbo].[Address]
ALTER COLUMN [Addr1] [nvarchar](80) NULL

Addr1 的长度原来是40

失败,引发此错误:

The object 'Address_e' is dependent on column 'Addr1'.
ALTER TABLE ALTER COLUMN Addr1 failed because one or more objects access 
this column.

我已尝试阅读它,似乎是因为某些视图正在引用此列,而 SQL Server 似乎实际上是在尝试删除引发错误的列。

Address_e 是前任 DB 管理员创建的视图。

还有其他方法可以更改列的大小吗?

【问题讨论】:

  • Address_e 是前任 DB 管理员创建的视图。就像 Remus 提到的那样,它定义了 SCHEMABINDING。

标签: sql sql-server


【解决方案1】:
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)

【讨论】:

  • 不,问题就像 Remus 提到的那样。代码本身没有问题
  • @NilRad 嗯,也许您正在考虑 PL-SQL? ALTER COLUMN 是 SQL 2008 R2 上的正确语法
  • 我错过了什么吗?为什么这么多赞?它没有回答问题。
  • 赞成票的数量可能是因为这个问题目前是最高的Google hit for 'tsql alter nvarchar length',因此只想提醒如何改变列长度的人(比如我)看到这个答案并投票赞成说“谢谢”而没有发现(因为我直到阅读您的评论才发现)这个问题比问题的标题所暗示的更微妙。
【解决方案2】:

视图可能是使用 WITH SCHEMABINDING 选项创建的,这意味着它们已明确连接以防止此类更改。看起来模式绑定有效并阻止了你打破这些观点,幸运的一天,嘿?在断言对数据库有影响后,请联系您的数据库管理员并要求他进行更改。

来自MSDN

架构绑定

将视图绑定到基础表的架构。什么时候 SCHEMABINDING 是指定的,基 一个或多个表不能在 一种会影响视图的方式 定义。 视图定义本身 必须先修改或删除 删除对表的依赖项 有待修改。

【讨论】:

  • 感谢 Remus,视图确实定义了 SCHEMABINDING。有什么简单的方法可以绕过约束,还是我真的需要删除视图才能让它工作?
  • 你不能绕过它,这就是它的全部目的。有人花了额外的时间来添加 schemabindig 以防止表更改。这不是什么意外,看起来这个人知道自己在做什么。您确定要换桌吗?
  • 是的,我确定 =) 并且从逻辑上讲(即使我知道它不会那样工作)我正在增加列的长度,只有当列没有删除和重新创建,但不幸的是它不是这样......但感谢您的帮助! =D
  • 我看到了同样的问题,不幸的是我们正在使用 SCHEMABINDING 视图来索引视图。因此,在我的情况下,我没有使用 SCHEMABINDING 显式阻止对基础表的更改,而只是为了符合 SQL Server 对使用索引视图的要求。我也想绕过这个而不放弃和重新创建我的观点。
【解决方案3】:

如果有人想在 SQL Server 2008 中“增加复制表的列宽”,则无需更改“replicate_ddl=1”的属性。只需按照以下步骤操作--

  1. 打开 SSMS
  2. 连接到发布者数据库
  3. 运行命令--ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. 它会将列宽从varchar(x) 增加到varchar(22),并且您可以在订阅者上看到相同的更改(事务已复制)。所以不需要重新初始化复制

希望这对所有正在寻找它的人有所帮助。

【讨论】:

    【解决方案4】:

    查看此链接

    Resize or Modify a MS SQL Server Table Column with Default Constraint using T-SQL Commands

    此类 SQL Server 问题的解决方案将是

    删除或禁用表列上的默认约束。

    修改表列数据类型和/或数据大小。

    在 sql 表列上重新创建或启用默认约束。

    再见

    【讨论】:

    • 和模式绑定视图需要被删除并重新创建。
    【解决方案5】:

    以下是适用于我正在使用的程序版本的内容:可能也适用于您。

    我将只放置执行它的指令和命令。 class 是表的名称。你用这个方法在表中改变它。不仅仅是搜索过程的回报。


    查看表类

    select * from class
    

    更改 FacID(显示为“faci”)和 classnumber(显示为“classnu”)列的长度以适应整个标签。

    alter table class modify facid varchar (5);
    
    alter table class modify classnumber varchar(11);
    

    再次查看表格以查看差异

    select * from class;
    

    (再次运行命令查看区别)


    这改变了实际的表格,但更好。

    附:我将这些说明作为命令的注释。这不是一个测试,但可以帮助一个:)

    【讨论】:

      【解决方案6】:

      检查列排序规则。此脚本可能会将排序规则更改为表默认值。将当前排序规则添加到脚本中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        • 2011-12-02
        • 2015-07-16
        • 2015-12-30
        • 2015-06-13
        • 2016-08-04
        相关资源
        最近更新 更多