决定在群集中将几个现有表连接在一起。
这显然意味着需要重新创建表,以便将它们聚集在一起,但是应该保留现有数据。
当然,我认为程序将是:
然而,当前表有相当多的触发器分配给它(如果我错了,请纠正我但是)当我将对该表执行重命名操作时,我假设所有触发器都按顺序分配给它将重构自己以匹配新名称。
在这种情况下,完美的情况可能是触发器在重命名后暂时从表中“分离”自己(仍然指向那个在该点不存在的旧表名),然后将是一次在新创建的聚簇表出现时再次起作用。
但是我不确定这是否可行。
所以这里的问题是:我可以在重命名表时留下触发器,还是应该手动处理它们?
答案 0 :(得分:3)
是的,你是对的:当你重命名一个表时,它的相关触发器仍然会引用同一个表。 (注意,不会重命名触发器名称本身。)
我遇到了这个问题所以我编写了一个脚本,利用DMBS_METADATA.GET_DDL
来提取表的触发器代码。这个过程是:
对于每个表T
:
T
使用DMBS_METADATA.GET_DDL
T
重命名为OLD_TABLE_NAME
OLD_TABLE_NAME
答案 1 :(得分:2)
触发器不按名称引用表,只有创建它们的DDL才会这样做。它们引用表的内部标识符,因此当您重命名表时,触发器根本不会更改。但是,如果从数据库对触发器的DDL进行反向工程,代码当然会引用表的新名称。如果触发器中的代码专门引用了表名,则不会更改其中的代码,但希望情况并非如此。
当然,触发器无法与表取消关联,您可以做的最好的事情是为触发器,索引权限等导出DDL。
类似地,索引不直接引用表名。
这听起来像是一个潜在的问题是你没有使用代码存储库,因为这样你就可以重新运行授予权限所需的脚本,创建索引,应用触发器等,重命名表并删除关联的模式项目