Oracle 如何在MV上重新创建触发器

Oracle 如何在MV上重新创建触发器,oracle,plsql,triggers,materialized-views,Oracle,Plsql,Triggers,Materialized Views,我们有两个Oracle DB实例:ORIG和REPL,它们之间有一个DB链接 ORIG中有一些表,每个表都有一个实体化视图日志(MVL)。MVL用于刷新位于REPL中的实体化视图(MV) REPL中的其他用户有权从MVs中进行选择。REPL中的某些mv包含after-insert触发器 如果我们需要更改ORIG中的表(例如,添加一个新列),有一个程序可以执行以下操作(以确保REPL中的MV与ORIG中的表具有相同的结构): 更改原始表格 更改原始版本中的MVL 在REPL中删除并重新创建MV(

我们有两个Oracle DB实例:ORIG和REPL,它们之间有一个DB链接

ORIG中有一些表,每个表都有一个实体化视图日志(MVL)。MVL用于刷新位于REPL中的实体化视图(MV)

REPL中的其他用户有权从MVs中进行选择。REPL中的某些mv包含after-insert触发器

如果我们需要更改ORIG中的表(例如,添加一个新列),有一个程序可以执行以下操作(以确保REPL中的MV与ORIG中的表具有相同的结构):

  • 更改原始表格
  • 更改原始版本中的MVL
  • 在REPL中删除并重新创建MV(使其与ORIG中的表格具有相同的结构)
  • 授予REPL中MV的权限
最后一个操作(授予特权)的原因是,由于删除并重新创建MV,所有相关对象(授予、触发器等)都将丢失

我的问题: 由于某些MVs包含触发器,我需要修改该过程,以便它也重新创建这些触发器。 触发代码不同(表与表)。我知道我可以硬编码像这样的东西

if table_name = 'tableA' then

create triggerA
...
但我相信有更好的解决办法


有什么建议吗?

一种解决方案是将触发器的定义从所有触发器字典表存储到临时表,然后读取该表以重新创建触发器。巴努·亚达夫:好主意,谢谢。明天我会考虑一下。如果源表和MV结构发生了变化,触发代码也会发生变化吗?无论是哪种方式,看起来你都开始着手编写一个数据库部署过程:也许你应该考虑一个产品,比如Liquibase,它使用源代码管理和构建工具(Maven,TeaveCase:Actudio)。APC:不,即使源表发生变化,触发器代码仍然是相同的。