14

我需要在 Oracle 中重命名一个表,但我想确保引用该表的任何外键、约束、触发器和序列都更新为使用新名称。

我怎么能确定我没有破坏任何东西?

请注意,我想保留表中包含的任何现有数据。

4

3 回答 3

23

如果你

ALTER TABLE old_table_name
 RENAME TO new_table_name;

所有现有的约束(外键和其他约束)和触发器都将引用新重命名的对象。序列与表没有关系,因此不会对序列产生影响(尽管如果您的意思是在表上的触发器中引用序列,则触发器将在重命名后继续引用相同的序列)。但是,您编写的任何引用旧表名的存储过程都需要更新以引用新表名。

现在,虽然约束和触发器将继续正常工作,但它们将保留其原始名称。如果您想在表名之后维护这些对象的命名约定,则需要做更多工作。例如,如果您希望在表FOO上插入触发器之前命名行级并将表TRG_BI_FOO重命名为,则BAR需要显式更改触发器以更改其名称

ALTER TRIGGER trg_bi_foo
  RENAME TO trg_bi_bar;

同样,您需要重命名约束和索引

ALTER TABLE bar
  RENAME CONSTRAINT pk_foo TO pk_bar;
于 2012-02-14T15:38:26.983 回答
13

这取决于您所说的“引用该表的任何外键、约束、触发器和序列都将更新以使用新名称”。

针对被重命名的表的任何现有索引、约束和触发器都将自动引用新名称。

但是,用于这些对象的任何命名约定都不会自动使用更新后的名称。例如,如果 的主键TABLE_NAME通常命名为TABLE_NAME_PK,则重命名TABLE_NAMENEW_TABLE_NAME不会自动将主键约束重命名为NEW_TABLE_NAME_PK

需要检查的是引用旧表名的代码——包、过程和函数,以及引用旧表名的任何触发器。同样,针对旧表名的视图也会中断。该视图ALL_DEPENDENCIES可以帮助确定哪些对象需要更新。

于 2012-02-14T15:38:00.600 回答
1
ALTER TABLE oldName RENAME TO newName

将保留表的依赖关系和数据,但总有一段 PL/SQL 引用了将变得无效的旧名称。

于 2012-02-14T15:42:40.183 回答