【问题标题】:How to change datatype whithout dropping dependencies如何在不删除依赖项的情况下更改数据类型
【发布时间】:2016-05-11 08:18:50
【问题描述】:

是否可以更改decimal 列的精度而不删除和重新创建它的依赖关系?

我尝试了以下方法:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

ALTER TABLE dbo.MyTable
    ALTER COLUMN MyColumn DECIMAL(10, 3) NULL

EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL"

当我执行此查询时,我收到错误消息:

消息 5074,第 16 级,状态 1,第 8 行
对象“MyView”依赖于列“MyColumn”。

消息 5074,第 16 级,状态 1,第 8 行
索引“MyIndex”依赖于列“MyColumn”。

消息 4922,第 16 级,状态 9,第 8 行
ALTER TABLE ALTER COLUMN MyColumn 失败,因为一个或多个对象访问此列。

是否可以在不删除和重新创建依赖项的情况下更改它?

提前致谢

【问题讨论】:

标签: sql-server sql-server-2008 tsql


【解决方案1】:

我们找到了一种方法来做到这一点。虽然它可能不是最好的解决方案,但它对我们有用,所以如果有人遇到同样的问题,请尝试以下方法:

在 SQL Server Management Studio 中转到Tools -> Options -> Designer 并取消选中“防止保存需要重新创建表的更改”框

接下来右键单击要修改列数据类型的表并单击“设计”

在设计器中,将列数据类型编辑为您需要的类型。

最后,右键单击并选择“生成更改脚本”


它的作用如下:

  • 删除表上的约束
  • 使用列的新数据类型创建临时表
  • 读取临时表的约束
  • 将临时表上的IDENTITY_INSERT 设置为ON
  • 将旧表中的所有数据复制到新临时表中
  • 将临时表上的IDENTITY_INSERT 设置为OFF
  • 放下旧桌子
  • 将临时表重命名为旧表的名称
  • 读取主键约束
  • 重新创建索引
  • 读取外键约束

此外,您必须刷新所有相关视图。 您可以使用此脚本生成语句:

SELECT DISTINCT 'EXEC sp_refreshview ''' + s.name + '.' + so.name + '''' AS 'dbo.TABLENAME'
FROM sys.objects AS so 
INNER JOIN sys.sql_expression_dependencies AS sed 
    ON so.object_id = sed.referencing_id 
INNER JOIN sys.schemas AS s
    ON so.schema_id = s.schema_id
WHERE so.type = 'V' AND sed.referenced_id = OBJECT_ID('dbo.TABLENAME');
  • 选中Tools -> Options -> Designer 中的“防止保存需要重新创建表的更改”复选框

请注意这一点!看看它是否真的符合您的要求。请记住,这会删除旧表。 在开发环境中测试!

【讨论】:

  • 问题:为什么删除表并使用所有约束重新创建它比删除约束、更改列并重新创建约束更好?
  • 是的好问题,我只描述了 Sql Server Management Studio 生成的脚本。由于我们必须在很多表上执行此操作,因此我们需要一种编写脚本的方法。但你可能是对的,它也可能像这样工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2020-04-03
  • 2023-04-09
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多