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

时间:2018-07-30 16:02:34

标签: sql-server tsql

我有一个表,其中包含用户定义的数据类型为MyColumn1的{​​{1}}。我需要将此列更改为CustomDatatype INT NOT NULL,但出现以下错误:

  

MSG 5074,第16级,状态1,第12行
  对象'CustomDatatype'依赖于列'MyColumn1'。

     

第4级第9州第12行的4922号消息
  ALTER TABLE ALTER COLUMN MyColumn1失败,因为一个或多个对象访问此列。

这似乎与我在更改列数据类型之前将要删除的索引或外键引用无关,这似乎与本列上最初使用的自定义定义的数据类型VARCHAR(5)直接相关。

如何在不删除CustomDatatype的情况下更改MyColumn1的数据类型,因为这可能会在系统中创建世界末日场景或删除表?

谢谢

更新(2018-07-31):我在不同的论坛中找到了对同一问题的回答,其中指出:“ ...这是UDT列的问题。您需要首先在所有表中删除该类型的所有列(并且可能在函数/ SP,视图中),然后删除该类型并创建正确的类型,然后重新创建所有列...”(Naomi 2011)来自Microsoft(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. 如果由于某些原因无法删除表,请重命名旧表 数据类型列,使用原始列名创建一个新列 具有正确的数据类型。从旧的(重命名)列中移动数据 放入新的(请务必注意触发器等)。然后用力 重新编译所有Sproc并刷新所有视图

2 个答案:

答案 0 :(得分:0)

您可以检查是否为这些列添加了索引吗?

如果是,

  

您将需要拖放并重新创建索引

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

alter table Table1 
alter column MyColumn1 varchar(5);

然后重新创建约束和索引。

答案 1 :(得分:0)

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

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

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