欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » Sql随手笔记 » 正文

热门阅读

请慎用sp_rename修改sql server数据库中对象名称

创建时间:2012年05月08日 09:31  阅读次数:(12769)
分享到:
我们在修改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

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

纠错:
经再次测试后发现,不光是使用sp_name来修改对象名会造成该问题,通过任何方式修改对象名都会存在该问题,看来,我们在修改对象的名称时要警慎了。
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 62+85=? 的结果(结果是:147)
结  果: