在保留现有触发器的同时重命名表

时间:2013-11-28 11:10:56

标签: database oracle table-rename

决定在群集中将几个现有表连接在一起。

这显然意味着需要重新创建表,以便将它们聚集在一起,但是应该保留现有数据。

当然,我认为程序将是:

  • 以不同的名称(通过重命名或其他内容)备份现有表格
  • 使用旧名称
  • 创建新的群集表
  • 将备份表中的所有数据复制到新创建的数据

然而,当前表有相当多的触发器分配给它(如果我错了,请纠正我但是)当我将对该表执行重命名操作时,我假设所有触发器都按顺序分配给它将重构自己以匹配新名称。

在这种情况下,完美的情况可能是触发器在重命名后暂时从表中“分离”自己(仍然指向那个在该点不存在的旧表名),然后将是一次在新创建的聚簇表出现时再次起作用。

但是我不确定这是否可行。

所以这里的问题是:我可以在重命名表时留下触发器,还是应该手动处理它们?

2 个答案:

答案 0 :(得分:3)

是的,你是对的:当你重命名一个表时,它的相关触发器仍然会引用同一个表。 (注意,不会重命名触发器名称本身。)

我遇到了这个问题所以我编写了一个脚本,利用DMBS_METADATA.GET_DDL来提取表的触发器代码。这个过程是:

对于每个表T

  1. 对于每个触发器,约束,检查约束,非pk索引 T使用DMBS_METADATA.GET_DDL
  2. 提取到DDL
  3. 将表格T重命名为OLD_TABLE_NAME
  4. 创建新表(如果要迁移,可以使用CTAS) 数据)
  5. 删除(或重命名)所有触发器,约束和索引 OLD_TABLE_NAME
  6. 运行提取的DDL以重新创建新的触发器,约束和索引 表

答案 1 :(得分:2)

触发器不按名称引用表,只有创建它们的DDL才会这样做。它们引用表的内部标识符,因此当您重命名表时,触发器根本不会更改。但是,如果从数据库对触发器的DDL进行反向工程,代码当然会引用表的新名称。如果触发器中的代码专门引用了表名,则不会更改其中的代码,但希望情况并非如此。

当然,触发器无法与表取消关联,您可以做的最好的事情是为触发器,索引权限等导出DDL。

类似地,索引不直接引用表名。

这听起来像是一个潜在的问题是你没有使用代码存储库,因为这样你就可以重新运行授予权限所需的脚本,创建索引,应用触发器等,重命名表并删除关联的模式项目