• 谨慎使用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来修改对象名会造成该问题,通过任何方式修改对象名都会存在该问题。看来,我们在修改对象的名称时要谨慎了。

  • 相关阅读:
    公安的方案特点。
    12345
    js发送邮件 不会调用客户端。
    jsonp 跨域 jsonp 发音
    RESTful restful api Representational State Transfer
    Autofac 组件、服务、自动装配 《第二篇》
    Fiddler关闭自动更新
    武大樱花抢票软件使用说明
    Visual Studio实用小技巧
    C#6.0语法特性
  • 原文地址:https://www.cnblogs.com/donelyorjune/p/11105078.html
Copyright © 2020-2023  润新知