重命名列而不破坏脚本和存储过程

9

我想要将一个表格中的列名修改为新名称,与IT技术有关。但问题在于,我想要手动修改“触发器”或“存储过程”中的“列名”。

是否有更好的方法来完成这个任务?

使用以下命令来重命名列。

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

同样地,如何在不打开每个脚本的情况下为触发器或存储过程执行此操作?

5
您可以修改列名,然后添加一个以前的列名为计算列,并随意更改触发器和存储过程。 - Gordon Linoff
你可以尝试从sys表中获取脚本代码,使用脚本替换并重新编译它,但如果对象不多,我更喜欢为了正确性而逐个打开每个脚本。 - jean
在MS-SQL中,您可以使用alter table dbo.tbBase alter column [OriginalName] UNIQUEIDENTIFIER not null GO - jean
3
如果您有一个SSDT项目,请执行重命名重构操作。这将重命名所有触发器、存储过程、函数以及表中的列。 - Dan Guzman
@DanGuzman - 抱歉,我不了解SSDT项目。您可以分享一个简单的示例吗? - Pரதீப்
5个回答

2

嗯,有许多第三方工具承诺提供这种“安全重命名”功能,一些免费,一些则不是:

  • 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在评论中建议的安全方式,或者像destination-data在回答中建议的使用同义词,但那样的话你将需要手动修改所有的列依赖关系,从我所了解的情况来看,这正是你想避免的。

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

在Visual Studio中使用数据库项目的最佳方法。 请参考以下链接

链接1

链接2


0
  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%'

这将返回所有存储过程和触发器的列表。你也可以修改筛选条件以获取精确的列表,然后手动进行修改非常容易。

但无论你决定如何操作,都不要轻易删除旧列。为了安全起见,一定要备份。


0

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

解决您问题的临时方法是创建一个伪列。 这个方案看起来有点像 hacky,因为伪列的语法需要一个表达式。 我能想到的最简单的表达式是下面的 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,而不仅仅是一个新列。但是,这也会导致性能下降,与访问底层表相比。


-1
您可能需要更改定义中的文本。但是,在 SQL Server 中,您将需要一个专用的管理员连接。版本在设置专用管理员连接方面也有所不同。通过在高级选项下添加;-T7806来设置启动参数。并在登录时在服务器名称之前添加Admin:。然后,您可以修改定义的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接