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

Sql 在不中断脚本和存储过程的情况下重命名列,sql,sql-server,triggers,rename,Sql,Sql Server,Triggers,Rename,我想将列名修改为表中的新名称 但在这里,我想手动修改触发器或SP的中存在的列名 有没有更好的办法 使用以下命令重命名列 sp_RENAME 'Tablename.old_Column', 'new_column' , 'COLUMN'; 类似地,如何为触发器或SP执行此操作。?不打开每个脚本 重命名表列 删除表列 更改表键 在VisualStudio中使用数据库项目的最佳方法。 请参阅此链接 你可以照@GorDon的建议去做 除此之外,您还可以使用此查询 从sys.syscomments

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

但在这里,我想手动修改
触发器
SP的
中存在的
列名

有没有更好的办法

使用以下命令重命名列

sp_RENAME 'Tablename.old_Column', 'new_column' , 'COLUMN';
类似地,如何为
触发器
SP
执行此操作。?不打开每个脚本

  • 重命名表列
  • 删除表列
  • 更改表键
  • 在VisualStudio中使用数据库项目的最佳方法。 请参阅此链接

  • 你可以照@GorDon的建议去做

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

  • 从sys.syscomments sc internal join sys.objects中选择o.name,sc.* 在sc.id=o.object\u id上,其中sc.text类似于“%oldcoldcolumnname%”

    这将返回所有进程和触发器的列表。您还可以修改筛选器以获得准确的列表。然后手动修改将非常容易

    但无论你决定什么,不要简单地放弃旧的专栏。
    为了安全起见,甚至可以进行备份。

    好吧,有很多第三方工具承诺使用这种类型的“安全重命名”,有些是免费的,有些不是:

    • 正如他在回答中所说,ApexSQL对此有一个明确的定义
    • RedGate有一个名为的商业工具,它也有一个安全的重命名功能,但它远不是免费的
    • 微软有一个名为(简称SSDT)的VisualStudio插件,正如他在评论中所说
    我不得不说,我从来没有尝试过针对这些特定任务的任何特定工具,但我确实有SSDT和一些RealGATE产品的经验,我认为它们是非常好的工具。我对ApexSQL一无所知

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

    • 可以从sql server外部直接访问表吗?我的意思是,是否有可能某些软件直接在该表上执行sql语句?如果是这样的话,在重命名该列时可能会将其破坏,在这种情况下,任何sql工具都帮不上忙
    • 你的sql脚本编写技能真的那么好吗?我认为自己对SQL Server相当有经验,但我认为编写这样的脚本超出了我的能力。并不是说这对我来说是不可能的,但这可能会花费太多的时间和精力去做一些我可以免费得到的东西
    如果你决定自己写,有几篇文章可以帮助你完成这项任务:

    首先是Microsoft的官方文档。
    第二篇文章是由一位有13年经验的DBA撰写的, 最后但并非最不重要的是,在StackExchange的数据库管理员网站上


    当然,您可以采用Gordon Linoff在其评论中建议的安全方式,或者使用其答案中建议的目标数据之类的同义词,但是您必须手动修改所有列的依赖关系,根据我的理解,这就是您想要避免的。

    您可能希望在定义中替换该文本。但是,在sql server中您将需要一个专用的管理员连接。设置专用管理员连接的版本也各不相同。通过添加来设置启动参数-T7806处于高级状态。并在登录时将Admin:添加到servername之前。到那时,您可能可以修改定义的值。

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

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

      ALTER TABLE <<tablename>> ADD (
       <<new_column_name>> AS (
        CASE
          WHEN 1=1 THEN <<tablename>>.<<old_column_name>>
        END)
      );
    
    altertableadd(
    作为(
    案例
    当1=1时。
    (完)
    );
    
    这种策略基本上是通过计算case语句并将
    的值复制到
    来动态创建一个新列。因为您正在动态插值此列,所以与仅选择原始列相比,会有性能损失

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


    <>你可以考虑的另一个策略是创建一个视图,你可以任意命名列。您甚至可以对视图插入/更新/删除(执行DML),但这将为您提供一个全新的表名,而不仅仅是一个新列。但是,您可以重命名旧表,并将视图命名为与旧表相同的名称。与仅访问基础表相比,这也会带来性能损失。

    您可以更改列名,然后使用以前的列名添加计算列,并随时更改触发器和存储过程。您可以尝试从sys表中获取脚本代码,使用脚本一步替换并重新编译它,但如果没有太多对象,我更喜欢通过打开每个脚本来进行修改。同样,im MS-SQL也可以使用
    alter table dbo.tbBase alter column[OriginalName]UNIQUEIDENTIFIER not null GO
    如果您有一个SSDT项目,请执行重命名重构操作。这将重命名所有触发器、过程、函数以及表中的列。@DanGuzman-很抱歉,我对
    SSDT项目
    一无所知。你能分享一个简单的例子吗