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.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

原文地址:https://www.cnblogs.com/kerrycode/p/10730283.html

时间: 2024-08-27 06:46:24

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

SQL Server 连接问题-命名管道

原文:SQL Server 连接问题-命名管道 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/01/12/sql-server-1.aspx 一.前言 在使用SQL Server 的过程中,用户遇到的最多的莫过于连接问题了.本文将深度讨论SQL Server 连接问题的方方面面,希望能帮你彻底解决SQL server 的连接问题. SQL Server 支持的通讯协议很多,如命名管道(Named Pipes).TCP/IP 套接字.共享内存(Sh

Sql Server 主键 外键约束

主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为表指定了主键约束, 数据库引擎 将通过为主键列自动创建唯一索引来强制数据的唯一性. 当在查询中使用主键时,此索引还允许对数据进行快速访问. 如果对多列定义了主键约束,则一列中的值可能会重复,但来自主键约束定义中所有列的值的任何组合必须唯一. 如下图所示, Purchasing.ProductVend

Sql Server系列:键和约束

1. 约束的类型 约束可以分为3大类:实体约束.域约束和参照完整性约束. 1.1> 实体约束 实体约束都是关于比较行的,实体约束并不关心整体列中的数据,它只对特定行感兴趣. 1.2> 域约束 域约束处理一个或多个列,确保一个特定列或一组特定列满足特地的标准.在插入或更新一行时,域约束不考虑其他行.如限定UnitPrice列的值大于或等于0,这就是域约束. 1.3> 参照完整性约束 如果某列的值必须与其他列(该列可能在同一个表中,或者更通常的是在不同的表中)的值匹配,这就意味着创建了参照完

SQL Server 执行计划重编译的两大情况

1.与正确性相关的重编译 1.为表或视图添加列,删除列. 2.为表添加约束.默认值.规则,删除约束.默认值.规则. 3.为表或视图添加索引. 4.如果计划用不用索引而这个索引被删除. 5.删除表中的统计信息. 6.增加触发器,删除触发器. 2.与优化相关的重编译 1.手动更新了统计信息. 2.统计信息过于陈旧.

sql server 查找字段上的约束

1. 当字段没有默认值或者约束的时候可以使用: alter table [table_name] drop column [column_name] 来删除. 当有默认值的时候应该先删除默认值,然后再删除此列,不然会报错.具体方法如下 select b.name from sysobjects b join syscolumns a on b.id = a.cdefault where a.id = object_id('表名') and a.name = '列名'”; ALTER TABLE

关于SQL Server数据表的五中约束

1.主键约束(PRIMARY KEY) 主键约束可以在表中定义一个主键值,它可以唯一确定表中每一条记录,每个表中只能有一个主键约束(只能有一个主键约束的意思并不是说受主键约束的列只能有一个),并且受主键约束的列不能为空值.如果主键约束定义在不止一列上,则某一列中的值可以存在重复,但是受主键约束的所有列的组合值必须唯一. 2.唯一性约束(UNIQE) 唯一性约束确保在非主键列中不输入重复的值.用于指定一个或多个列的组合具有唯一性,以防止在列中输入重复的值.可以在一个表中定义多个唯一性约束,但是只能

SQL Server 定义数据完整性 6大约束

1.创建一客户张表 1 IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL 2 DROP TABLE dbo.Employees; 3 4 CREATE TABLE dbo.Employees 5 ( 6 empid INT NOT NULL, 7 firstname VARCHAR(30) NOT NULL, 8 lastname VARCHAR(30) NOT NULL, 9 hiredate DATE NOT NULL, 10 mgrid INT

SQL Server SA 最佳实践

老实说,本文主要部分是翻译的,并且由于英语水平的问题,我没有完全翻译,有些我觉得不重要的就跳过了,目前看来应该八九不离十,或者说不会影响最终效果,对于英语水平好的读者,可以自行查看原文.但这一年里面我遇到了很多事情,也想了很多,我看的资料不少,但是记得的却少得可怜,要用的时候更加难以回忆.能知道从哪里找到就已经很幸运了. 有人说,知道在哪里能找到解决方案,已经很不错了,没有人能记住所有东西.也许吧,但是只要力所能及的事情,何不尽力呢?一直苦恼着自己的学习能力为何如此低下,最后发现是否缺少了那么一

SQL Server缺省约束、列约束和表约束

SQL Server缺省约束是SQL Server数据库中的一种约束,下面就为您介绍SQL Server缺省约束.列约束和表约束的定义方法啊,供您参考. SQL Server缺省约束 SQL Server缺省约束通过定义列的缺省值或使用数据库的缺省值对象绑定表的列,来指定列的缺省值.SQL Server 推荐使用缺省约束,而不使用定义缺省值的方式来指定列的缺省值. 定义SQL Server缺省约束的语法如下:CONSTRAINT constraint_nameDEFAULT constant_e