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),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...
随机推荐
- PAT1120: Friend Numbers
1120. Friend Numbers (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Two in ...
- 解决Kali用户名密码正确但是无法登陆的问题
本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=684 前言: 用户名和密码都正确,但是登陆Kali的时候总是提示用户名或密码错误,无法登陆,本文介绍一种解决办法. ...
- linux,windows下检测指定的IP地址是否可用或者检测IP地址冲突的3种方式(批处理程序,python程序,linux shell 批量ping)
本文中的脚本适用范围: 1)检测某些IP地址是否被占用: 2)检测网络中某些设备是否存活: 3)在分配新的ip地址之前,批量检测环境中是否存在冲突的机器 以上检测基于ICMP Ping报文,要求所有的 ...
- Day4 《机器学习》第四章学习笔记
决策树 前几天学习了<机器学习>的前三章,前三章介绍机器学习的基础知识,接下来,第四章到第十章介绍一些经典而常用的机器学习方法,这部分算是具体的应用篇,第四章介绍了一类机器学习方法——决策 ...
- 产品 vs 服务,见识,耐心
站在空无一人略有冷意的街头,突然有种恍如隔世的感觉:这就是传说中橘生淮北则为枳的淮北?咦,我为什么会出现在这里? 于是我陷入了深深的思考. 关于对过去的思考 托尔斯泰说过:幸福的家庭是相似的,不幸的家 ...
- 有趣的toggleClass实现交替样式
addClass和removeClass进行样式类型的修改相信比较容易学习和接受 但是用这两个方法去实现交替样式,像一些<li>列表的样式,还有同类型数据的呈现, 当然很多框架都给出了封装 ...
- MySQL如何优化
对于全栈而言,数据库技能不可或缺,关系型数据库或者nosql,内存型数据库或者偏磁盘存储的数据库,对象存储的数据库或者图数据库--林林总总,但是第一必备技能还应该是MySQL.从LAMP的兴起,到Ma ...
- 根据http协议下载文件保存到相应的文件下
本实例通过提供的http网址来下载文件,并保存到本地指定的文件下. 本例提供的网址为:http://112.53.80.131:8888/database/11.mdb,下载的文件名为:11.mdb ...
- 使用istream迭代器来输入输出数据
在C++中,很多人都会选择使用cin来进行数据的输入,使用cout来进行数据的输出,现在在C++11中我们可以使用iostream迭代器来进行这些操作,这会减少代码量,达到的效果和前面两种相同.以下是 ...
- java技术树+必读书籍
引子 本篇文章用技术树的形式来展示java相关技术栈.所有技术点有博客的都自带链接,没有的后续加上. 必读书籍推荐: 1.java基础: <effective java>-->四星推 ...