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
执行此操作。?不打开每个脚本
为了安全起见,甚至可以进行备份。好吧,有很多第三方工具承诺使用这种类型的“安全重命名”,有些是免费的,有些不是:
- 正如他在回答中所说,ApexSQL对此有一个明确的定义
- RedGate有一个名为的商业工具,它也有一个安全的重命名功能,但它远不是免费的李>
- 微软有一个名为(简称SSDT)的VisualStudio插件,正如他在评论中所说李>
- 可以从sql server外部直接访问表吗?我的意思是,是否有可能某些软件直接在该表上执行sql语句?如果是这样的话,在重命名该列时可能会将其破坏,在这种情况下,任何sql工具都帮不上忙
- 你的sql脚本编写技能真的那么好吗?我认为自己对SQL Server相当有经验,但我认为编写这样的脚本超出了我的能力。并不是说这对我来说是不可能的,但这可能会花费太多的时间和精力去做一些我可以免费得到的东西
第二篇文章是由一位有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项目
一无所知。你能分享一个简单的例子吗