重命名 SQL Server 中的存储过程
Posted
技术标签:
【中文标题】重命名 SQL Server 中的存储过程【英文标题】:Rename a stored procedure in SQL Server 【发布时间】:2009-09-03 20:22:23 【问题描述】:我正在尝试使用 sp_rename system sproc 重命名 SQL Server 2008 中的存储过程。第三个参数给我带来了困难,我不断收到以下错误:
Msg 15249, Level 11, State 1, Procedure sp_rename, Line 75
Error: Explicit @objtype 'P' is unrecognized.
正如消息所示,我正在为参数值传递一个 P。我这样称呼存储过程:
EXEC sp_rename @objName = @procName, @newname = @WrappedName, @objtype = 'P';
我仔细检查了说明这是来自 sys.objects 的值的文档。我跑了以下来仔细检查我没有发疯
select * from sys.objects where name = 'MySprocName'
确实返回的类型是 P。
有人知道我应该在这里传递什么吗?我不想把这个留空,因为我正在创建一个通用存储过程来重命名任意存储过程,如果存储过程和其他东西之间存在名称冲突,我不想担心这一点。
【问题讨论】:
【参考方案1】:只需省略@objtype 参数(默认为null)即可。
EXEC sp_rename 'sp_MyProc', 'sp_MyProcName'
您将收到以下警告,但程序将被重命名
注意:更改文件的任何部分 对象名称可能会破坏脚本和 存储过程。
正如其他人所说,您应该删除并重新创建该过程。
【讨论】:
【参考方案2】:根据docs,'P' 不是正确的选项。您应该尝试“OBJECT”,因为这似乎是您尝试做的最接近的事情。但是,你应该注意这个警告......
更改对象名称的任何部分 可以破坏脚本并存储 程序。我们建议您不要 使用此语句重命名存储 程序、触发器、用户定义 功能或视图;相反,放弃 对象并用新对象重新创建它 名字。
另外(来自同一 MSDN 页面):
重命名存储过程、函数、视图或触发器不会 更改定义中对应对象名称的名称 sys.sql_modules 目录视图的列。因此,我们推荐 即 sp_rename 不能用于重命名这些对象类型。相反,放下 并使用新名称重新创建对象。
【讨论】:
谢谢,我读到了,但不知何故错过了我需要输入的正确值。 请注意,删除过程将删除所有相关权限。重命名的最佳方法是使用 sp_rename,然后更改 proc 以更正 sys_modules。【参考方案3】:sp_rename
不支持程序:
更改用户创建的名称 当前数据库中的对象。这 对象可以是表、索引、列、 别名数据类型,或 Microsoft .NET 框架公共语言运行时 (CLR) 用户定义类型。
只需创建具有相同主体和新名称的新过程,然后删除旧的。
【讨论】:
这是不正确的。 sp_rename 通过将 'OBJECT' 指定为 @objtype 来工作。 @Peter:它可能不是 100% 准确,但肯定不推荐使用 sp_rename。 "重命名存储过程、函数、视图或触发器不会改变sys.sql_modules目录视图的定义列中对应对象名称的名称。因此,我们建议不要使用sp_rename来重命名这些对象类型。而是使用新名称删除并重新创建对象。”(来自MSDN)【参考方案4】:我不确定@objtype 变量,但是我知道通过 sp_rename 重命名是不好的。
创建存储过程时,它的记录存在于 sys.objects 中,存储过程的定义将存储在 sys.sql_modules 中。
使用 sp_rename 只会更改 sys.objects 中的名称,而不是 sys.sql_modules 中的名称,因此您的定义将不正确。
最好的解决方案是删除并重新创建
【讨论】:
对于我正在做的事情实际上并不重要。我正在做一些注入,在其中我根据原始定义动态创建一个 proc,将原始名称重命名为新名称,然后从我注入的版本中调用原始版本。当我使用完仪器后,我会撤消该过程。【参考方案5】:第三个参数(@objtype
)是需要重命名的
存储过程以外的数据库对象。否则就是
需要传递第三个参数。例如重命名列
使用 sp_rename 将看起来像这样。
USE AdventureWorks2012;
GO
EXEC sp_rename 'Sales.SalesTerritory.TerritoryID', 'TerrID', 'COLUMN';
GO
要使用sp_rename
重命名用户定义的存储过程,您可以执行以下操作,它确实有效
Microsoft, DB experts (and others here as well)
不推荐使用这个存储过程,因为它会在内部破坏东西,并且以后可能会产生不寻常的结果。因此它很糟糕。以下是微软的说法:
重命名存储过程、函数、视图或触发器不会更改
sys.sql_modules
目录视图的定义列中或使用OBJECT_DEFINITION
内置函数获得的相应对象的名称。因此,我们建议不要使用sp_rename
来重命名这些对象类型。而是使用新名称删除并重新创建对象。重命名表或列等对象不会自动重命名对该对象的引用。您必须手动修改任何引用重命名对象的对象。例如,如果重命名表列并且触发器中引用了该列,则必须修改触发器以反映新列名称。在重命名对象之前,使用
sys.sql_expression_dependencies
列出对象的依赖关系。
你可以在这里阅读:sp_rename (Transact-SQL)
【讨论】:
【参考方案6】:重命名存储过程有两种方法。
-
删除和重新创建过程:问题是它会导致权限丢失。
sp_rename of Procedure : 权限将保持不变。存储过程将被重命名。但是,
sys.sql_modules
仍将使用旧定义。
我更喜欢第二种方法。我按照以下步骤操作:
-
拥有存储过程内容的副本
重命名存储过程
EXEC sp_rename 'dbo.OldStoredProcedureName','NewStoredProcedureName'
GO
ALTER PROCEDURE
在sys.sql_modules
中有修改后的程序代码
ALTER PROCEDURE dbo.NewStoredProcedureName
...
现在,存储过程名称也更新了,sys.sql_modules
中的代码也刷新了,权限也完好无损。
【讨论】:
【参考方案7】:在 SQL 2000 年代,DROP/CREATE 更安全——当您使用 sp_rename 时,SQL 曾经让 proc 的元数据不同步。
了解如何执行类似 DDL 的最佳方法是使用 SSMS 在附加分析器跟踪时重命名对象。
【讨论】:
【参考方案8】:Valentino Vranken 所说的都是真的。但是请记住,当您删除并创建存储过程时,您会丢失所有元数据。 (创建日期、修改日期等)
重命名存储过程、函数、视图或触发器不会更改 sys.sql_modules 目录视图的定义列中相应对象名称的名称。因此,我们建议不要使用 sp_rename 来重命名这些对象类型。而是使用新名称删除并重新创建对象。
这也是事实。但是我发现,当您在重命名后运行 alter 脚本时,它会更正模块定义中的名称。
我想知道 SSMS 接口如何在不使用 T-SQL 的情况下自动完成所有这些工作。 (也许每次您使用界面重命名 SP 时它都会运行一个更改脚本?我不知道。)有趣的是,当您进行 SSMS 重命名时,MS 会发布幕后发生的事情。
【讨论】:
SSMS(Sequel Server Management Studio)将完成工作,但也有其自身的问题。重命名后,要查看重命名的 SP,必须右键单击“存储过程”并选择“刷新”。即使在刷新之后,某些内部缓存也处于不正确的状态;例如,编辑器不知道更改(当新名称在查询中时出现红色下划线),而且我认为我看到了一条错误消息,其中没有任何保证。要解决此问题,需要关闭并重新启动 SSMS。【参考方案9】:sp_rename 仅更改数据库中用户创建的对象的名称。重命名存储过程不会更改 sys.sql_modules 目录视图的定义列中相应对象名称的名称。
因此,我们建议您不要重命名此对象类型。相反,删除并使用新名称重新创建存储过程。 即使您不应该使用它来重命名来更改视图、函数或触发器的名称。 如果您尝试使用,它会重命名它,但您也会收到一些警告消息,如下所示:
更改对象名称的任何部分都可能破坏脚本和存储过程。
更多信息您可以访问。
http://onlyforcoder.blogspot.in/2017/11/sprename-where-to-use-where-not-to-use.html http://blog.sqlauthority.com/2008/08/26/sql-server-how-to-rename-a-column-name-or-table-name/
【讨论】:
这应该被否决。这是对其他人先前提供的信息的无用重复。 “blogspot”链接也是如此。 “sqlauthority”链接完全偏离主题。以上是关于重命名 SQL Server 中的存储过程的主要内容,如果未能解决你的问题,请参考以下文章
oracle存储过程怎样重命名,除了用or replace 还有什么