我想将列名修改为表中的新名称
但此处有问题我想手动修改column name
或Triggers
中的SP's
。
有没有更好的方法呢。
使用此
到rename
列
sp_RENAME 'Tablename.old_Column', 'new_column' , 'COLUMN';
同样如何才能为triggers
或SP's
执行此操作。没有打开每个脚本?
答案 0 :(得分:3)
嗯,有很多第三方工具承诺这类"安全重命名"有些是免费的,有些则不是:
我不得不说我从未尝试过任何这些特定工具用于该特定任务,但我确实对SSDT和RedGate的一些产品有一些经验,我认为它们是非常好的工具。我对ApexSQL一无所知。
另一个选择是尝试自己编写sql脚本,但在开始之前需要考虑以下几点:
如果您决定自己编写,有一些文章可以帮助您完成该任务:
首先,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)
答案 2 :(得分:1)
你可以做@GorDon建议的事情。
除此之外,您还可以使用此查询
从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,而不仅仅是一个新的列。但是,您可以重命名旧表,并将视图命名为与旧表相同。与仅访问基础表相比,这也会带来性能损失。