在不破坏脚本和存储过程的情况下重命名列

Renaming a column without breaking the scripts and stored procedures

我想将列名修改为 table

中的新名称

但这里的问题是我想手动修改 TriggersSP's 中的 column name

有没有更好的方法呢

rename 一个专栏正在使用这个

sp_RENAME 'Tablename.old_Column', 'new_column' , 'COLUMN';

同样,我如何为 triggersSP's 做这件事?不打开每个脚本?

  1. 重命名 Table 列
  2. 正在删除 Table 列
  3. 改变Table键

在 Visual Studio 中使用数据库项目的最佳方式。 参考这个链接

link 1

link 2

  1. 你可以按照@GorDon 的建议去做。

  2. 除此之外,您还可以玩这个查询,

select o.name, sc.* from sys.syscomments sc inner join sys.objects o on sc.id=o.object_id where sc.text like '%oldcolumnname%'

这将 return 所有过程的列表,并且 trigger.Also 您可以修改过滤器以获得准确的结果 list.then 您可以很容易地手动修改。

但无论您做出什么决定,都不要简单地删除旧专栏。 为了安全起见,还要保持后退。

好吧,有很多第 3 方工具有望实现这种 "safe rename",有些是免费的,有些则不是:

  • ApexSQL 在他的回答中写了 free tool for that, as MWillemse
  • RedGate 有一个名为 SQLPrompt 的商业工具,它也有安全的重命名功能,但它远非免费。
  • Microsoft 在他的评论中写了一个名为 SQL Server Data Tools (or SSDT in the short version), as Dan Guzman 的 visual studio 加载项。

我不得不说我从未尝试过这些特定工​​具中的任何一个来完成该特定任务,但我确实对 SSDT 和 RedGate 的一些产品有一些经验,我认为它们是非常好的工具。我对ApexSQL一无所知。

另一种选择是尝试自己编写 sql 脚本,但是在开始之前需要考虑以下几点:

  • 可以从 sql 服务器外部直接访问您的 table 吗?我的意思是,是否有可能某些软件直接在 table 上执行 sql 语句?如果是这样,您可能会在重命名该列时破坏它,并且在这种情况下没有任何 sql 工具可以提供帮助。
  • 您的 sql 脚本编写能力真的那么好吗?我认为自己对 sql 服务器相当有经验,但我认为编写这样的脚本超出了我的技能范围。并不是说这对我来说不可能,但对于我可以免费获得的东西,它可能会花费太多时间和精力。

如果您决定自己编写,有几篇文章可能会帮助您完成该任务:

首先,sys.sql_expression_dependencies.
的微软官方文档 第二,一篇叫Different Ways to Find SQL Server Object Dependencies的文章,是一个有13年经验的DBA写的, 最后但同样重要的是,a related question 在 StackExchange 的数据库管理员网站上。

当然,您可以采用 Gordon Linoff 在他的评论中建议的安全方式,或者使用他的回答中建议的同义词,例如 destination-data,但是您将不得不手动修改所有列依赖项,据我了解,这就是你想要避免的。

您可能想要替换定义中的该文本。但是,您将需要 sql 服务器中的专用管理员连接。版本在设置专用管理员连接方面也有所不同。通过在高级下添加;-T7806 来设置启动参数。并在登录时在服务器名前加上admin:。届时,您或许可以修改定义的值。

此建议与 Oracle DB 有关,但在其他 DBMS 中可能有等效的解决方案。

您的问题的一个临时解决方案是创建一个伪列。这个解决方案看起来有点老套,因为伪列的语法需要一个表达式。我能想到的最简单的表达式是下面的 case 语句。让我知道你是否可以让它更简单。

  ALTER TABLE <<tablename>> ADD (
   <<new_column_name>> AS (
    CASE
      WHEN 1=1 THEN <<tablename>>.<<old_column_name>>
    END)
  );

该策略基本上通过评估 case 语句并将 <<old_column_value>> 的值复制到 <<new_column_value>> 来动态创建一个新列。因为您正在动态插入此列,所以与仅选择原始列相比,性能会有所下降。

一个问题是,这仅在您复制一列一次时才有效。 Oracle 中多个伪列不能包含重复的表达式。

您可以考虑的另一个策略是创建一个视图,您可以随意命名列。您甚至可以针对视图 INSERT/UPDATE/DELETE(执行 DML),但这会给您一个全新的 table_name,而不仅仅是一个新列。但是,您可以重命名旧 table,并将您的视图命名为与旧 table 相同的名称。与仅访问底层 table.

相比,这也有性能损失