如何在Oracle中重命名表以便更新所有外键,约束,触发器和序列并保留任何现有数据?

War*_*now 11 oracle rename preserve

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

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

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

Jus*_*ave 20

如果你

ALTER TABLE old_table_name
 RENAME TO new_table_name;
Run Code Online (Sandbox Code Playgroud)

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

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

ALTER TRIGGER trg_bi_foo
  RENAME TO trg_bi_bar;
Run Code Online (Sandbox Code Playgroud)

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

ALTER TABLE bar
  RENAME CONSTRAINT pk_foo TO pk_bar;
Run Code Online (Sandbox Code Playgroud)


Ada*_*sch 13

它取决于你的意思"引用该表的任何外键,约束,触发器和序列都被更新为使用新名称."

针对要重命名的表的任何现有索引,约束和触发器将自动引用新名称.

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

需要检查的是代码 - 包,过程和函数 - 它们引用了旧表名,以及引用旧表名的任何触发器.同样,针对旧表名的视图也会中断.该视图ALL_DEPENDENCIES可以帮助识别哪些对象需要更新.

  • 是.但是如果你在其他表上有一些其他触发器对`foo`执行查询,则该触发器不会自动更新以查询`bar`. (3认同)