代码之家  ›  专栏  ›  技术社区  ›  Milan

SQL Server 2012:由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN MyColumn1失败

  •  0
  • Milan  · 技术社区  · 8 年前

    我有一张桌子 MyColumn1 用户定义的数据类型为 CustomDatatype INT NOT NULL . 我需要把这个专栏改成 VARCHAR(5) ,但我得到以下错误:

    消息5074,级别16,状态1,行12
    对象“CustomDatatype”依赖于列“MyColumn1”。

    消息4922,级别16,状态9,行12
    由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN MyColumn1失败。

    这似乎与索引或外键引用无关,在更改列数据类型之前,我将省略掉该引用,这似乎与最初使用的自定义定义数据类型直接相关 CustomDatatype 在这个专栏里。

    我怎样才能改变 支原体1 的数据类型,而不删除 自定义数据类型 因为这可能会在我的系统中造成世界末日的场景,或者丢掉桌子?

    谢谢

    更新(2018-07-31):我在不同的论坛上找到了对同一问题的答复,其中指出: “…这就是UDT列的问题。您需要先删除所有表(可能在函数/SPs、视图中)中此类型的所有列,然后删除该类型并创建正确的类型,然后重新创建所有列…(Naomi 2011) 来自微软(2011年8月2日)网站: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b7bf0f04-dee8-4751-803b-4c3e1f7f7c70/how-to-change-column-nametype-of-user-defined-table-type?forum=transactsql

    到目前为止,我提出的唯一可行的解决方案是:

    1. 创建表的副本(用所有 依赖项,即触发器、索引、键等)删除原始的 表(即使指定了自定义数据类型,也可以这样做),然后使用新的数据类型列重新创建表。

    2. 如果由于某种原因不能删除表,请重命名旧表 数据类型列,使用原始列名创建新列 使用正确的数据类型。从旧(重命名)列中移动数据 换成新的(一定要注意触发器等)。然后用力 重新编译所有存储过程并刷新所有 依赖性。

    2 回复  |  直到 8 年前
        1
  •  0
  •   CR241    8 年前

    您能检查一下这些列是否添加了索引吗?

    如果是,

    你需要 删除并重新创建索引 .

    一旦删除约束和索引,就可以更改列。

    alter table Table1 
    alter column MyColumn1 varchar(5);
    

    那么 重新创建约束和索引。

        2
  •  0
  •   Milan    8 年前

    到目前为止,我提出的唯一可行的解决方案是:

    1)创建表的副本(使用所有依赖项编写脚本,例如触发器、索引、键等),删除原始表(即使指定了自定义数据类型,也可以这样做),然后使用新的数据类型列重新创建表。

    2)如果由于某种原因无法删除表,请重命名旧的数据类型列,使用正确的数据类型创建具有原始列名的新列。将数据从旧的(重命名的)列移到新的列中(确保注意触发器等)。然后强制重新编译所有存储过程并刷新所有依赖的视图。