3

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

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

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

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

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

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

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

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

4

2 回答 2

3

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

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

对于每个表T

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

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

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

同样,索引不直接引用表名。

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

于 2013-11-28T11:51:55.757 回答