SQL Server使用sp_rename重命名约束注意事项

栏目: 数据库 · SQL Server · 发布时间: 7年前

SQL Server 中,我们可以使用 sp_name 这个系统存储过程重命名数据库中对象的名称。   此对象可以是表、 索引、 列、 别名,约束等数据类型(具体可以参考官方文档)。上周在使用这个函数重构数据库中约束的时候,遇到了下面错误,如下所示:

USE AdventureWorks2014 ;

GO

sp_rename 'ErrorLog.DF_ErrorLog_ErrorTime' , 'DF_ErrorLog_ErrorTime_old' ;

GO

Msg 15225, Level 11, State 1, Procedure sp_rename, Line 437

No item by the name of 'ErrorLog.DF_ErrorLog_ErrorTime' could be found in the current database 'AdventureWorks2014', given that @itemtype was input as '(null)'.

SQL Server使用sp_rename重命名约束注意事项

注意:重命名约束时,不能在约束前面加上表对象。正确的方式为:前面不要加上表名对象,如下所示

USE AdventureWorks2014 ;

GO

sp_rename 'DF_ErrorLog_ErrorTime' , 'DF_ErrorLog_ErrorTime_old' ;

GO

对于默认约束、外键约束、检查约束的重命名,都是这种规则。 但是对于主键约束,下面两种方式都 OK ,这个是非常纳闷的一件事情

USE AdventureWorks2014 ;

GO

sp_rename 'PK_ErrorLog_ErrorLogID' , 'PK_ErrorLog_ErrorLogID_OLD'

USE AdventureWorks2014 ;

GO

sp_rename   'ErrorLog.PK_ErrorLog_ErrorLogID' , 'PK_ErrorLog_ErrorLogID_OLD'

另外,对于 HumanResources.Employee 这个表,如果要重命名约束 CK_Employee_BirthDate ,如果使用下面这种方式也会遇到这种错误:

sp_rename 'CK_Employee_BirthDate' , 'CK_BirthDate' ;  

GO  

正确的方式为:

-- Rename a check constraint.  

sp_rename 'HumanResources.CK_Employee_BirthDate' , 'CK_BirthDate' ;  

GO  

也就是说必须加上对应约束的 schema ,否则就会提示找不到这个对象(因为约束位于 HumanResources 下面)。至于为什么约束可以不加表对象名称,那是因为在数据库中,约束的命名是全局唯一的。所以不需要加上表名。其实 官方资料已经详细说了:

[ @objname = ] ' object_name '

用户对象或数据类型的当前限定或非限定名称。  

如果要重命名的对象是表中的列 object_name 必须在窗体 table.column schema.table.column 中使用   如果要重命名的对象的索引 object_name 必须在窗体 table.index schema.table.index   如果要重命名的对象是一个约束 object_name 必须在窗体 schema.constraint

    -- item type determined?

    if ( @objtype is null)

    begin

        COMMIT TRANSACTION

        raiserror ( 15225 ,- 1 ,- 1 , @objname , @CurrentDb , @objtypeIN )

        return 1

    end

参考资料:

https://docs.microsoft.com/zh-cn/sql/relational-databases/system-stored-procedures/sp-rename-transact-sql?view=sql-server-2017


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

GWT in Action

GWT in Action

Robert Hanson、Adam Tacy / Manning Publications / 2007-06-05 / USD 49.99

This book will show Java developers how to use the Google Web Toolkit (GWT) to rapidly create rich web-based applications using their existing skills. It will cover the full development cycle, from ......一起来看看 《GWT in Action》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试