【发布时间】:2012-03-05 23:23:37
【问题描述】:
我需要在 Oracle 中重命名一个表,但我想确保引用该表的任何外键、约束、触发器和序列都更新为使用新名称。
我如何确定我没有损坏任何东西?
请注意,我想保留表中包含的所有现有数据。
【问题讨论】:
我需要在 Oracle 中重命名一个表,但我想确保引用该表的任何外键、约束、触发器和序列都更新为使用新名称。
我如何确定我没有损坏任何东西?
请注意,我想保留表中包含的所有现有数据。
【问题讨论】:
ALTER TABLE oldName RENAME TO newName
将保留表的依赖关系和数据,但总有一段 PL/SQL 引用了将失效的旧名称。
【讨论】:
如果你
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;
【讨论】:
这取决于您所说的“引用该表的任何外键、约束、触发器和序列都将更新以使用新名称。”
针对要重命名的表的任何现有索引、约束和触发器都将自动引用新名称。
但是,用于这些对象的任何命名约定都不会自动使用更新后的名称。例如,如果TABLE_NAME 的主键通常命名为TABLE_NAME_PK,则将TABLE_NAME 重命名为NEW_TABLE_NAME 不会自动将主键约束重命名为NEW_TABLE_NAME_PK。
需要检查的是引用旧表名的代码(包、过程和函数)以及引用旧表名的任何触发器。同样,针对旧表名的视图也会中断。视图ALL_DEPENDENCIES 可以帮助确定哪些对象需要更新。
【讨论】:
foo 执行查询的其他表上有其他触发器,则该触发器将不会自动更新为针对 bar 进行查询。