【问题标题】:Renaming a table while leaving the existing triggers behind在保留现有触发器的同时重命名表
【发布时间】:2013-12-14 09:34:49
【问题描述】:

决定将几个现有的表连接到一个集群中。

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

当然,我认为该程序将类似于以下内容:

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

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

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

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

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

【问题讨论】:

  • 你不能直接复制旧表作为备份,然后修改现有表,修改后将旧数据复制回来吗?

标签: database oracle table-rename


【解决方案1】:

是的,您是正确的:当您重命名表时,其关联的触发器仍将引用同一个表。 (注意触发器名称本身不会被重命名)。

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

对于每个表T

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

【讨论】:

  • 谢谢,我可能不得不构建一个这样的脚本。另一件需要注意的事情是,如果我为表创建视图并将触发器移动到视图而不是表上,我可以重命名表并且视图将不会跟随,并且触发器将与现在重命名的表分离。之后,当我创建一个与旧表同名的新表时,视图将与触发器一起捕捉到它。
【解决方案2】:

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

所以当然触发器不能与表解除关联,你能做的最好的就是导出触发器的 DDL、索引权限等。

类似的索引不直接引用表名。

这听起来像一个潜在的问题是您没有使用代码存储库,因为这将使您能够在重命名表并删除关联的架构后重新运行授予权限、创建索引、应用触发器等所需的脚本项目。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 2019-10-26
    • 1970-01-01
    • 2015-06-18
    • 2012-03-05
    • 2021-11-15
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多