2013-11-28 32 views
2

决定在集群中将多个现有表格连接在一起。在保留现有触发器的情况下重命名表格

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

当然,我假设程序是沿着线的东西:在一个不同的名字

  • 备份现有的表(通过重命名或东西)
  • 在旧的名字创建一个新的聚集表
  • 从备份表复制所有数据到新创建的一个

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

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

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

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

+0

难道你不能只复制旧表作为备份,然后改变现有的表,改变后复制旧的数据? – Armunin

回答

2

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

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

对于每个表T

  1. 对于每个触发器,约束,检查约束,上 T提取物非PK索引使用DMBS_METADATA.GET_DDL
  2. 表重命名TOLD_TABLE_NAME
  3. 到DDL
  4. 创建新表(如果要迁移 数据,可以使用CTAS)
  5. 删除(或重命名)a LL触发器,约束,索引从提取DDL OLD_TABLE_NAME
  6. 运行并重新创建触发器,约束,对新 表索引
+0

谢谢,我可能不得不建立一个这样的脚本。 另一件需要注意的是,如果我为表创建视图并将触发器移动到视图而不是表,我可以重命名表并且视图不会跟随,触发器将与现在重命名的表分离。 之后,当我使用与旧的名称相同的名称创建一个新表格时,该视图将与触发器一起对齐。 –

2

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

所以当然触发器不能从表中的关联,而你能做的最好的是出口的DDL触发器,索引权限等。

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

这听起来像是一个潜在的问题,因为这会让你重新运行授予权限所需的脚本,创建索引,应用触发器等重命名表并删除关联后所需的脚本架构项目。

相关问题