我正在做一个数据库的重构。在这个过程中,我正在重命名一些现有的表,键和约束。它们将在新的重构表上重新创建。然后在删除旧表之前将数据移动到新表。
当我尝试使用Exec时,我有一个外键sp_rename我得到一个错误,该对象不存在。如果我尝试使用print object_id(' xxx')我什么也得不回来。它是一个有效的对象,我可以在sys.objects表中找到它。如果我尝试使用带有sys.objects表中的对象id的print Object_Name(' 123456789'),它将返回我在sp_rename中使用的名称。
任何人都知道为什么sp_rename找不到对象?
答案 0 :(得分:0)
使用sp_rename
类型:
EXEC dbo.sp_rename
'dbo.FK_FRP_File_DataMatrix',
'FK_FRPFileID_FRPDataMatrixImportETL',
'OBJECT';
演示:
CREATE TABLE tab1 (ID INT PRIMARY KEY,
col1 INT NOT NULL)
CREATE TABLE tab2 (ID INT PRIMARY KEY)
ALTER TABLE tab1
ADD CONSTRAINT FK_FRP_File_DataMatrix FOREIGN KEY (col1)
REFERENCES tab2(ID);
EXEC dbo.sp_rename
'dbo.FK_FRP_File_DataMatrix',
'FK_FRPFileID_FRPDataMatrixImportETL',
'OBJECT';
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS;
的 SqlFiddleDemo
强>
答案 1 :(得分:0)
谢谢,但我收到此错误“参数@objname不明确或声明的@objtype(OBJECT)错误。”我相信这个问题是我在创建外键时如何使用Schema名称'dbo'。实际上是对象名称的一部分。因此,当我执行sp_rename时,它在Schema dbo中查找不存在的FK_FRP_File_DataMatrix。名称确实是对象表中的dbo.FK_FRP_File_DataMatrix。如果我手动删除dbo。从Keys下面的名称然后重命名它。需要在我的生产数据库上修复此问题。
答案 2 :(得分:0)
将约束放在旧表(Table1_Old
)上:
ALTER TABLE dbo.Table1_Old DROP CONSTRAINT FK_Table1_Table2
GO
在旧表格中添加带新名称的约束:
ALTER TABLE dbo.Table1_Old WITH CHECK
ADD CONSTRAINT FK_Table1_Table2_Old FOREIGN KEY(FileId)
REFERENCES dbo.Table2 (FileId)
GO
现在,您可以使用Table1
的旧名称在新表(FK_Table1_Table2
)上添加约束。
答案 3 :(得分:0)
如果遇到错误:
假设@itemtype输入为'(null)',则在当前数据库'Db'中找不到名为'dbo.table_columnId'的项目。
使用时:
sp_rename 'dbo.table_column', 'newvalue'
并且您一定要确保对象名称存在于sys.objects中,在旧名称周围使用方括号,如下所示:
sp_rename '[dbo.table_column]', 'newvalue'
原因可能是对象是在不同的架构上创建的,或者对象名称中有一个点。