在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)'.

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

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.columnschema.table.column 中使用 如果要重命名的对象的索引object_name必须在窗体table.indexschema.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

SQL Server使用sp_rename重命名约束注意事项的更多相关文章

  1. SQL Server ->> 存储过程sp_rename重命名数据对象

    1) 表转移Schema和重命名表 ALTER SCHEMA Stage TRANSFER dbo.Stage_AAA; EXEC sp_rename 'Stage.Stage_AAA', 'AAA' ...

  2. SQL Server 2008数据库重命名方法

    假设SQL Server 2008中有个数据库test,现在要将其改名为zhy步骤:(1) 分离数据库:打开management studio,找到test数据库-->右键-->任务--& ...

  3. 【转】SQL SERVER 中 sp_rename 用法

    因需求变更要改表的列名,平常都是跑到Enterprise manager中选取服务器->数据库->表,然后修改表,这样太麻烦了,查了一下,可以用script搞定,代码如下: EXEC sp ...

  4. SQL SERVER 中 sp_rename 用法

    转自:http://www.cnblogs.com/no7dw/archive/2010/03/04/1678287.html 因需求变更要改表的列名,平常都是跑到Enterprise manager ...

  5. SQL Server 连接问题-命名管道

    原文:SQL Server 连接问题-命名管道 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx 一.前言 ...

  6. MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异

    MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQ ...

  7. SQL Server 数据库设计、命名、编码规范

    https://blog.csdn.net/songguozhi/article/details/5858159 SQL Server 数据库设计.命名.编码规范

  8. Microsoft SQL Server学习(四)--约束

    SQLServer - 约束 主要是为了保证数据库中的数据一致性.有效性.准确性, 从而提高了数据库中数据的正确性 一.约束的分类 在SQLserver中,约束分三种不同类型 1.实体约束 实提约束是 ...

  9. Sql Server 主键 外键约束

    主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...

随机推荐

  1. 【转】Java线程面试题 Top 50

    不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程 ...

  2. mybatis的使用

    1.like 的使用范例 name like CONCAT(CONCAT('%', #{name}), '%') 2.时间的比较的范例 <![CDATA[ and bill_date >= ...

  3. windows10系统终极净化方法

    去年购入一台华硕FL8000U,性能很是不错,但是硬件只能兼容win10,不支持win7(linux倒是可以,但是始终用不顺手),win10里面杂七杂八的确实很多,本人重度强迫症+洁癖+极简主义,所以 ...

  4. Tair总述

    Tair 是淘宝自己开发的一个分布式 key/value 存储引擎.tair 分为持久化和非持久化两种使用方式.非持久化的 tair 可以看成是一个分布式缓存.持久化的 tair 将数据存放于磁盘中. ...

  5. requests发送post请求的一些疑点

    前言 在Python爬虫中,使用requests发送请求,访问指定网站,是常见的做法.一般是发送GET请求或者POST请求,对于GET请求没有什么好说的,而发送POST请求,有很多朋友不是很清楚,主要 ...

  6. Clloection接口 与List接口

    collection接口: collection是单列集合接口的根接口,该接口中又包含了多个集合接口,collection接口提供了很多操作集合的方法,比如添加元素的方法,删除元素的方法,修改元素的方 ...

  7. python selenium-webdriver 元素操作之键盘操作

    selenium 提供了比较完整的键盘操作,在使用的模拟键盘操作之前需要我们导入from selenium.webdriver.common.keys import Keys即可,然后就可以来模拟键盘 ...

  8. 【深度学习系列】PaddlePaddle垃圾邮件处理实战(一)

    PaddlePaddle垃圾邮件处理实战(一) 背景介绍   在我们日常生活中,经常会受到各种垃圾邮件,譬如来自商家的广告.打折促销信息.澳门博彩邮件.理财推广信息等,一般来说邮件客户端都会设置一定的 ...

  9. (二)Web应用体系结构

    容器 Servlet没有main()方法,它们受控于另一个Java应用,这个Java应用称为容器(Container).我们最常见的tomcat就是这样一个容器. Web服务器应用(如Apache)得 ...

  10. Elasticsearch笔记九之优化

    Elasticsearch笔记九之优化 ).get(); } curl命令可以在linux中建立一个定时任务每天执行一次,同样java代码也可以建立一个定时器来执行. 2:内存设置之前介绍过es集群有 ...