【问题标题】:SQL, How to change column in SQL table without breaking other dependencies?SQL,如何在不破坏其他依赖关系的情况下更改 SQL 表中的列?
【发布时间】:2011-03-06 06:37:00
【问题描述】:

我确定这可能是很常见的查询,但目前找不到好的答案。

这是我的问题:

我有一个名为 Contacts 的表,其中包含 varchar 列 Title。现在在开发过程中,我想用 TitleID 替换字段 Title ,它是 ContactTitles 表的外键。目前表 Contacts 有超过 60 个依赖项(其他表、视图函数)。

我怎样才能以最安全和最简单的方式做到这一点?

我们使用:MSSQL 2005,数据已经迁移,只是想改变架构。

编辑:

感谢大家快速重播。

就像提到的那样,Contacts 表有 60 多个依赖项,但是在运行以下查询时,其中只有 5 个使用 Title 列。迁移脚本已运行,因此无需更改数据。

/*gets all objects which use specified column */

SELECT Name FROM syscomments sc JOIN sysobjects so ON sc.id = so.id WHERE TEXT LIKE '%Title%' AND TEXT LIKE '%TitleID%'

然后我浏览了这 5 个视图并手动更新了它们。

【问题讨论】:

  • 在 SQL2005 中你需要小心一点。如果任何定义的长度大于 4000 个字符,它们可以分成 2 行,我的帖子中的查询更安全(或者实际上最好使用 sys.sql_modules)。我假设你从不使用*,这也可能把事情搞砸?
  • @Martin Smith 你是对的,但我更关注使用这些列的地方。
  • 我的意思是,定义拆分的可能性很小,即一行结束...Tit,下一个对应行开始le...,因此LIKE 查询将错过它。
  • @Martin Smith,当列被删除并且实体生成器运行时,没有任何投诉(它进行模式验证)。好吧,我可以说这次我很幸运。

标签: sql sql-server-2005 refactoring-databases


【解决方案1】:

使用refactoring 方法。首先创建一个名为TitleID 的新字段,然后将所有标题复制到ContactTitles 表中。然后,一个一个地更新每个依赖项以使用 TitleID 字段。只需确保在每个步骤之后您仍然有一个正常工作的系统。

如果数据要更改,您必须小心并确保对Title 列的任何更改也会更改ContactTitles 表。您只需在进行重构时使它们保持同步。

编辑:甚至有一本书是关于它的! Refactoring Databases.

【讨论】:

    【解决方案2】:

    正如其他人指出的那样,这取决于您的 RDBMS。

    有两种方法:

    • 更改表并修复所有依赖项
    • 创建一个您可以使用的视图,而不是直接访问该表(这可以防止您将来对底层核心表进行更改,但您可能会丢失一些更新功能,具体取决于您的 DBMS)

    【讨论】:

      【解决方案3】:

      对于 Microsoft SQL Server,Redgate 有一个(不是免费的)产品可以帮助进行这种重构http://www.red-gate.com/products/sql_refactor/index.htm

      在过去,我很容易做到这一点(如果是原始的话),只需获取要查看的内容列表即可

      SELECT * FROM sys.objects
      WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%Contacts%' 
      

      (并可能考虑依赖信息并按对象类型过滤)

      在 Management Studio 中编写所有感兴趣的脚本,然后简单地查看列表并查看所有内容并将 CREATE 更改为 ALTER。即使对于 60 个可能的依赖项,它也应该是一个非常简单和重复的更改。此外,如果您指的是不存在的列,则在将脚本运行到 ALTER 时应该会收到一条错误消息。

      如果您在查询中使用 * 或在应用程序中使用 adhoc SQL,显然事情可能会更困难一些。

      【讨论】:

      • 这个答案对我来说是最准确的。
      【解决方案4】:

      使用 SP_Depend 'Table Name' 检查表的依赖关系 然后使用 SP_Rename 重命名列名,这非常有用。 每当重命名 PRIMARY KEY 或 UNIQUE 约束时,sp_rename 都会自动重命名关联索引。如果重命名的索引绑定到 PRIMARY KEY 约束,则 PRIMARY KEY 约束也会由 sp_rename 自动重命名。

      然后开始一一更新过程和函数,没有其他好的选择可以像这样改变,如果你发现了,也告诉我。

      【讨论】:

      • 除非您在所有对象上运行 sp_refreshsqlmodule,否则我不会信任依赖关系信息。如果依赖项是乱序创建的,这可能是错误的。
      • 当你启动 Sql 时会自动刷新。我是对还是错?所以检查依赖关系没有问题。
      • 很确定这不正确,但请随时证明我错了!
      • 好吧,你的方式很好,但我的方式是快速获取有助于开发的依赖项列表。
      猜你喜欢
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-25
      • 2010-12-21
      • 2018-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多