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

时间:2015-03-02 12:43:04

标签: sql sql-server triggers rename

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

但此处有问题我想手动修改column nameTriggers中的SP's

有没有更好的方法呢。

使用此

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

同样如何才能为triggersSP's执行此操作。没有打开每个脚本?

5 个答案:

答案 0 :(得分:3)

嗯,有很多第三方工具承诺这类"安全重命名"有些是免费的,有些则不是:

  • ApexSQL有free toolMWillemse在他的回答中写道,
  • RedGate有一个名为SQLPrompt的商业工具,它也有一个安全的重命名物品,但它远非免费。
  • 微软有一个名为SQL Server Data Tools的视觉工作室加载项(或短版本中的SSDT),Dan Guzman在他的评论中写道。

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

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

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

如果您决定自己编写,有一些文章可以帮助您完成该任务:

首先,Microsoft官方文档sys.sql_expression_dependencies 第二,一篇名为Different Ways to Find SQL Server Object Dependencies的文章,由13年经验DBA撰写, 最后但并非最不重要的是,在StackExchange的数据库管理员网站上a related question

当然,你可以采用Gordon Linoff在评论中提出的安全方式,或者在他的回答中使用像destination-data这样的同义词,但是你必须手动修改所有列的依赖关系,并从我明白,这就是你想要避免的。

答案 1 :(得分:1)

  1. 重命名表格列
  2. 删除表格列
  3. 更改表键
  4. 最好的方法是在Visual Studio中使用数据库项目。 请参阅此链接

    link 1

    link 2

答案 2 :(得分:1)

  1. 你可以做@GorDon建议的事情。

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

  3.   

    从sys.syscomments sc inner join sys.objects o中选择o.name,sc。*   在sc.id = o.object_id中sc.text喜欢'%oldcolumnname%'

    这将返回所有proc和trigger的列表。此外,您可以修改过滤器以获取精确列表。然后,您可以非常轻松地手动修改。

    但无论你决定什么,不要简单地删掉旧栏目。 为了安全起见,请保持备份。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

此建议与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,而不仅仅是一个新的列。但是,您可以重命名旧表,并将视图命名为与旧表相同。与仅访问基础表相比,这也会带来性能损失。