谨慎使用sp_rename修改任何对象名

原文链接:http://www.lmwlove.com/ac/id820

我们在修改sqlserver数据库中对象名称的时候,可能会比较喜欢使用sp_rename系统存储过程来操作,因为使用它比起到可视化列表中去找对象,速度要快的多。但为什么我们不提倡使用它呢,因为使用它可能会带来一些麻烦。而且,在使用它更改对象名时,数据库本身也会给出如下警告:
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。

我们现在来做一个简单的测试,先创建一个简单的存储过程:

create procedure usp_test
as
begin
select 1
end


我们不去研究这个存储过程的功能与语法, 因为这个不是本章的重点。

然后使用sp_rename来修改usp_test的名称

sp_rename 'usp_test','usp_test_1'


系统提示警告:
警告: 更改对象名的任一部分都可能会破坏脚本和存储过程。但名称是已经被修改掉了。

这时候,我们从企业管理器的存储过程列表中看到存储过程'usp_test'的名称已经修改成'usp_test_1'了。而且,我们在右键中选择->修改,查看到的脚本中的名称也已经存为'usp_test_1',定义如下:
ALTER procedure [dbo].[usp_test_1]
as
begin
select 1
end
但我们在使用sp_helptext系统存储过程来查看定义,会发现通过这个方法查到的定义,名称并没有更改过来

sp_helptext usp_test_1


返回结果如下:
create procedure usp_test  
as  
begin  
select 1  
end
在sys.sql_modules表中definition列的定义也没有修改过来

select definition from  sys.sql_modules  where object_id=object_id('usp_test_1')


返回结果如下:
create procedure usp_test  as  begin  select 1  end

从这个测试中可以看出,们在修改数据库中对象的名称的时候,可能会造中数据库中该对象的定义不同步。这可能会导致一些错误的发生,如下面的链接所造成的问题,也就是由于该原因产生的。

纠错:
经再次测试后发现,不光是使用sp_name来修改对象名会造成该问题,通过任何方式修改对象名都会存在该问题。看来,我们在修改对象的名称时要谨慎了。

原文地址:https://www.cnblogs.com/donelyorjune/p/11105078.html