在不破坏脚本和存储过程的情况下重命名列
Renaming a column without breaking the scripts and stored procedures
我想将列名修改为 table
中的新名称
但这里的问题是我想手动修改 Triggers
或 SP's
中的 column name
。
有没有更好的方法呢
rename
一个专栏正在使用这个
sp_RENAME 'Tablename.old_Column', 'new_column' , 'COLUMN';
同样,我如何为 triggers
或 SP's
做这件事?不打开每个脚本?
- 重命名 Table 列
- 正在删除 Table 列
- 改变Table键
在 Visual Studio 中使用数据库项目的最佳方式。
参考这个链接
你可以按照@GorDon 的建议去做。
除此之外,您还可以玩这个查询,
select o.name, sc.* from sys.syscomments sc inner join sys.objects o
on sc.id=o.object_id where sc.text like '%oldcolumnname%'
这将 return 所有过程的列表,并且 trigger.Also 您可以修改过滤器以获得准确的结果 list.then 您可以很容易地手动修改。
但无论您做出什么决定,都不要简单地删除旧专栏。
为了安全起见,还要保持后退。
好吧,有很多第 3 方工具有望实现这种 "safe rename",有些是免费的,有些则不是:
- ApexSQL 在他的回答中写了 free tool for that, as MWillemse,
- RedGate 有一个名为 SQLPrompt 的商业工具,它也有安全的重命名功能,但它远非免费。
- Microsoft 在他的评论中写了一个名为 SQL Server Data Tools (or SSDT in the short version), as Dan Guzman 的 visual studio 加载项。
我不得不说我从未尝试过这些特定工具中的任何一个来完成该特定任务,但我确实对 SSDT 和 RedGate 的一些产品有一些经验,我认为它们是非常好的工具。我对ApexSQL一无所知。
另一种选择是尝试自己编写 sql 脚本,但是在开始之前需要考虑以下几点:
- 可以从 sql 服务器外部直接访问您的 table 吗?我的意思是,是否有可能某些软件直接在 table 上执行 sql 语句?如果是这样,您可能会在重命名该列时破坏它,并且在这种情况下没有任何 sql 工具可以提供帮助。
- 您的 sql 脚本编写能力真的那么好吗?我认为自己对 sql 服务器相当有经验,但我认为编写这样的脚本超出了我的技能范围。并不是说这对我来说不可能,但对于我可以免费获得的东西,它可能会花费太多时间和精力。
如果您决定自己编写,有几篇文章可能会帮助您完成该任务:
首先,sys.sql_expression_dependencies.
的微软官方文档
第二,一篇叫Different Ways to Find SQL Server Object Dependencies的文章,是一个有13年经验的DBA写的,
最后但同样重要的是,a related question 在 StackExchange 的数据库管理员网站上。
当然,您可以采用 Gordon Linoff 在他的评论中建议的安全方式,或者使用他的回答中建议的同义词,例如 destination-data,但是您将不得不手动修改所有列依赖项,据我了解,这就是你想要避免的。
您可能想要替换定义中的该文本。但是,您将需要 sql 服务器中的专用管理员连接。版本在设置专用管理员连接方面也有所不同。通过在高级下添加;-T7806 来设置启动参数。并在登录时在服务器名前加上admin:。届时,您或许可以修改定义的值。
此建议与 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,而不仅仅是一个新列。但是,您可以重命名旧 table,并将您的视图命名为与旧 table 相同的名称。与仅访问底层 table.
相比,这也有性能损失
我想将列名修改为 table
中的新名称但这里的问题是我想手动修改 Triggers
或 SP's
中的 column name
。
有没有更好的方法呢
rename
一个专栏正在使用这个
sp_RENAME 'Tablename.old_Column', 'new_column' , 'COLUMN';
同样,我如何为 triggers
或 SP's
做这件事?不打开每个脚本?
- 重命名 Table 列
- 正在删除 Table 列
- 改变Table键
在 Visual Studio 中使用数据库项目的最佳方式。 参考这个链接
你可以按照@GorDon 的建议去做。
除此之外,您还可以玩这个查询,
select o.name, sc.* from sys.syscomments sc inner join sys.objects o on sc.id=o.object_id where sc.text like '%oldcolumnname%'
这将 return 所有过程的列表,并且 trigger.Also 您可以修改过滤器以获得准确的结果 list.then 您可以很容易地手动修改。
但无论您做出什么决定,都不要简单地删除旧专栏。 为了安全起见,还要保持后退。
好吧,有很多第 3 方工具有望实现这种 "safe rename",有些是免费的,有些则不是:
- ApexSQL 在他的回答中写了 free tool for that, as MWillemse,
- RedGate 有一个名为 SQLPrompt 的商业工具,它也有安全的重命名功能,但它远非免费。
- Microsoft 在他的评论中写了一个名为 SQL Server Data Tools (or SSDT in the short version), as Dan Guzman 的 visual studio 加载项。
我不得不说我从未尝试过这些特定工具中的任何一个来完成该特定任务,但我确实对 SSDT 和 RedGate 的一些产品有一些经验,我认为它们是非常好的工具。我对ApexSQL一无所知。
另一种选择是尝试自己编写 sql 脚本,但是在开始之前需要考虑以下几点:
- 可以从 sql 服务器外部直接访问您的 table 吗?我的意思是,是否有可能某些软件直接在 table 上执行 sql 语句?如果是这样,您可能会在重命名该列时破坏它,并且在这种情况下没有任何 sql 工具可以提供帮助。
- 您的 sql 脚本编写能力真的那么好吗?我认为自己对 sql 服务器相当有经验,但我认为编写这样的脚本超出了我的技能范围。并不是说这对我来说不可能,但对于我可以免费获得的东西,它可能会花费太多时间和精力。
如果您决定自己编写,有几篇文章可能会帮助您完成该任务:
首先,sys.sql_expression_dependencies.
的微软官方文档
第二,一篇叫Different Ways to Find SQL Server Object Dependencies的文章,是一个有13年经验的DBA写的,
最后但同样重要的是,a related question 在 StackExchange 的数据库管理员网站上。
当然,您可以采用 Gordon Linoff 在他的评论中建议的安全方式,或者使用他的回答中建议的同义词,例如 destination-data,但是您将不得不手动修改所有列依赖项,据我了解,这就是你想要避免的。
您可能想要替换定义中的该文本。但是,您将需要 sql 服务器中的专用管理员连接。版本在设置专用管理员连接方面也有所不同。通过在高级下添加;-T7806 来设置启动参数。并在登录时在服务器名前加上admin:。届时,您或许可以修改定义的值。
此建议与 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,而不仅仅是一个新列。但是,您可以重命名旧 table,并将您的视图命名为与旧 table 相同的名称。与仅访问底层 table.
相比,这也有性能损失