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



我想将列名修改为表中存在的新名称

但是在这里,我想手动修改TriggersSP's中存在的column name

有没有更好的方法。

rename列,请使用此列

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

同样,如何在不打开每个脚本的情况下为triggersSP's执行此操作?

好吧,有一堆第三方工具承诺这种类型的"安全重命名",有些是免费的,有些不是:

  • ApexSQL有一个免费的工具,正如MWillemse在他的回答中所写的那样,
  • RedGate有一个名为SQLPrompt的商业工具,它也有一个安全的重命名功能,但它远非免费。
  • Microsoft有一个名为SQL Server Data Tools(简称SSDT(的Visual Studio加载项,正如Dan Guzman在他的评论中所写的那样。

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

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

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

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

首先,Microsoft sys.sql_expression_dependencies 的官方文档。
其次,一篇名为"查找SQL Server对象依赖关系的不同方法"的文章,由具有13年经验的DBA撰写,最后但并非最不重要的一点是,StackExchange 数据库管理员网站上的一个相关问题。

当然,你可以使用戈登·利诺夫(Gordon Linoff(在他的评论中建议的安全方式,或者使用同义词,如他的答案中建议的目标数据,但随后你将不得不手动手动修改所有列依赖项,据我所知,这就是你想要避免的。

  1. 重命名"表"列
  2. 删除"表"列
  3. 更改表键

在Visual Studio中使用数据库项目的最佳方式。请参阅此链接

链接 1

链接 2

  1. 您可以按照@GorDon建议进行操作。

  2. 除此之外,您还可以使用此查询,

从 sys.syscomments sc 内部联接 sys.objects o 中选择 o.name, sc.* 在 sc.id=o.object_id 其中 sc.text 像 '%oldcolumnname%'

这将返回所有进程和触发器的列表。您也可以修改过滤器以获得确切的列表,然后您可以非常轻松地手动修改。

但无论你决定什么,都不要简单地删除旧列。为了安全起见,甚至保持备份。

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

问题的临时解决方案是创建伪列。 此解决方案看起来有点笨拙,因为伪列的语法需要一个表达式。 我能想到的最简单的表达是下面的案例陈述。 让我知道您是否可以使其更简单。

  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 中的重复表达式。

您可以

考虑的另一种策略是创建一个视图,您可以根据需要命名列。 您甚至可以针对视图插入/更新/删除(执行 DML(,但这将为您提供一个全新的table_name,而不仅仅是一个新列。 但是,您可以重命名旧表,并将视图命名为与旧表相同的名称。 与仅访问基础表相比,这也会产生性能损失。

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

最新更新