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

yzckvree  于 2023-08-03  发布在  Oracle
关注(0)|答案(2)|浏览(198)

决定将两个现有表连接到一个集群中。
这显然意味着需要重新创建表,以便将它们聚集在一起,但是应该保留现有的数据。
当然,我认为这个程序应该是这样的:

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

然而,当前表有相当多的触发器分配给它(如果我错了请纠正我,但是),当我在该表上执行重命名操作时,我假设所有分配给它的触发器都将根据方便的顺序重构自己以匹配新名称。
在这种情况下,最理想的情况可能是,触发器在重命名表后暂时将自己与表“分离”(仍然指向旧的表名,此时该表名不存在),然后在新创建的集群表出现时再次起作用。
但我不确定这是否可能。

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

mrzz3bfm

mrzz3bfm1#

触发器不按名称引用表,只有创建它们的DDL才按名称引用表。它们引用表的内部标识符,因此当重命名表时,触发器根本不会更改。但是,如果对数据库中触发器的DDL进行反向工程,代码当然会引用表的新名称。如果触发器中的代码专门引用表名,则不会更改,但希望不是这种情况。
因此,触发器当然不能与表解除关联,最好的办法是导出触发器的DDL、索引权限等。
同样,索引也不直接引用表名。
听起来这里的一个潜在问题是,你没有使用代码存储库,因为这将使你能够在重命名表并删除相关的模式项后重新运行授予特权、创建索引、应用触发器等所需的脚本。

gz5pxeao

gz5pxeao2#

是的,你是正确的:重命名表时,其关联的触发器仍将引用同一个表。(注意,触发器名称本身不会重命名)。
我遇到了这个问题,所以我写了一个脚本,利用DMBS_METADATA.GET_DDL来提取表的触发器代码。流程如下:
对于每个表T
1.对于每个触发器、约束、检查约束,T上的非pk索引使用DMBS_METADATA.GET_DDL提取到DDL
1.将表T重命名为OLD_TABLE_NAME
1.创建新表(如果要迁移数据,可以使用CTAS)
1.删除(或重命名)OLD_TABLE_NAME中的所有触发器、约束和索引
1.运行提取的DDL以在新表上重新创建触发器、约束和索引

相关问题