SQL Server使用sp_rename重命名约束注意事项
在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.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
SQL Server使用sp_rename重命名约束注意事项的更多相关文章
- SQL Server ->> 存储过程sp_rename重命名数据对象
1) 表转移Schema和重命名表 ALTER SCHEMA Stage TRANSFER dbo.Stage_AAA; EXEC sp_rename 'Stage.Stage_AAA', 'AAA' ...
- SQL Server 2008数据库重命名方法
假设SQL Server 2008中有个数据库test,现在要将其改名为zhy步骤:(1) 分离数据库:打开management studio,找到test数据库-->右键-->任务--& ...
- 【转】SQL SERVER 中 sp_rename 用法
因需求变更要改表的列名,平常都是跑到Enterprise manager中选取服务器->数据库->表,然后修改表,这样太麻烦了,查了一下,可以用script搞定,代码如下: EXEC sp ...
- SQL SERVER 中 sp_rename 用法
转自:http://www.cnblogs.com/no7dw/archive/2010/03/04/1678287.html 因需求变更要改表的列名,平常都是跑到Enterprise manager ...
- SQL Server 连接问题-命名管道
原文:SQL Server 连接问题-命名管道 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx 一.前言 ...
- MySQL Transaction--MySQL与SQL Server在可重复读事务隔离级别上的差异
MySQL和SQL Server两种数据库在REPEATABLE-READ事务隔离级别实现方式不同,导致使用上也存在差异. 在MySQL中,默认使用REPEATABLE-READ事务隔离级别,MySQ ...
- SQL Server 数据库设计、命名、编码规范
https://blog.csdn.net/songguozhi/article/details/5858159 SQL Server 数据库设计.命名.编码规范
- Microsoft SQL Server学习(四)--约束
SQLServer - 约束 主要是为了保证数据库中的数据一致性.有效性.准确性, 从而提高了数据库中数据的正确性 一.约束的分类 在SQLserver中,约束分三种不同类型 1.实体约束 实提约束是 ...
- Sql Server 主键 外键约束
主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...
随机推荐
- 使用libpcap获取http报文
在上一篇博客中简单对libpcap库基本函数及基本工作流程做了些简单说明, 今天我们先了解一下pcap_loop()及pcap_dispatch()函数的功能及作用: (1)pcap_loop()循环 ...
- JavaScript 中常见设计模式整理
开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式.本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知. JavaScript 中常见设计模 ...
- 利用post请求发送内容进行爬虫
利用post请求发送内容进行爬虫 import requests url = 'http://www.iqianyue.com/mypost' header = {} header['Accept-L ...
- java,maven工程打tar.gz包执行main方法
一,需要在pom.xml文件添加plugin, 项目目录结构 <build> <plugins> <plugin> <artifactId>maven- ...
- VS2012中出现“无法启动程序...debug\abc.exe,系统找不到指定文件”的问题!
VS 2005在生成可执行文件时使用了一种新的技术,该技术生成的可执行文件会伴随生成一个清单文件(manifest file)(.manifest后缀文件)(其本质上是XML文档,你可以用文本编辑器打 ...
- GitHub 系列之「Git速成」
1.什么是Git? Git 是 Linux 发明者 Linus 开发的一款新时代的版本控制系统,那什么是版本控制系统呢?怎么理解?网上一大堆详细的介绍,但是大多枯燥乏味,对于新手也很难理解,这里我只举 ...
- top_channel_args.go
, fmt.Sprintf("%s: closing %s", proto, listener.Addr())) }
- vector作为函数返回值
在实际的操作中,我们经常会碰到需要返回一序列字符串或者一列数字的时候,以前会用到数组来保存这列的字符串或者数字,现在我们可以用vector来保存这些数据.但是当数据量很大的时候使用vector效率就比 ...
- 【Never Stop】联赛集训记录
始于10/01/2017. Day I: T2图论,没想到.T3谜一样DP(是从来没意识到还可以这样). rank10. 下午刷了点题,CDQ也只打出一个板子,感觉自己不在状态? ========== ...
- 【NOIP模拟赛】随
题目链接: 172.18.111.252:800/problem.php?cid=1001&pid=0 题解: 膜达神……(NOIP考这个就等爆零吧……) 显然我们得到一个结论:$ans=\s ...