Sql 无法获取视图上的锁以重新编译它
在基表a和B上创建了视图VW。有一个ETL过程将数据加载到T_a和T_B。数据加载完成后,作业触发重命名过程。此过程将T_A重命名为A,表A重命名为T_A。同样,T_B表重命名为B,表B重命名为T_B 当这种重命名发生时,视图将变得无效,为了使其有效,必须重新编译它 为了解决这个问题,在重命名过程的末尾添加了视图编译语句。它工作正常,但问题是,假设用户A正在访问视图数据,同时触发了我的重命名过程。现在,只要用户A访问该视图,重命名过程就无法编译该视图 请分享你对如何克服这个问题的想法Sql 无法获取视图上的锁以重新编译它,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,在基表a和B上创建了视图VW。有一个ETL过程将数据加载到T_a和T_B。数据加载完成后,作业触发重命名过程。此过程将T_A重命名为A,表A重命名为T_A。同样,T_B表重命名为B,表B重命名为T_B 当这种重命名发生时,视图将变得无效,为了使其有效,必须重新编译它 为了解决这个问题,在重命名过程的末尾添加了视图编译语句。它工作正常,但问题是,假设用户A正在访问视图数据,同时触发了我的重命名过程。现在,只要用户A访问该视图,重命名过程就无法编译该视图 请分享你对如何克服这个问题的想法 索引。当对
索引。当对基础
表
进行更改时,从属视图
无效,Oracle将在访问视图时自动重新编译该视图
因此,在您的示例中,VW
在删除表A
时无效,
当T_A
重命名为A
时,它仍然是无效的,但一旦有人查询视图
,它就会自动重新编译,查询工作正常,视图
变为有效
因此,无需在脚本中显式地重新编译视图 不,事实并非如此……当有人查询视图时,该视图不会自动编译……它正在运行forever@Dex这很奇怪-因为我在发布之前在11g
上测试了上述场景。。。T\u A
和A
的结构是否完全相同?我尝试过的是删除一个表
,重新创建相同的表
——而视图的行为就是我所描述的….@Dex实际上就是您描述它的方式。。。似乎oracle试图重新编译视图。。。但它正在等待视图首先被解锁。。。你会永远等待。。是否有什么原因可能导致此初始锁定?在我的情况下,我不会删除表…将_T重命名为_A,表的结构是相同的,但索引是相同的different@Dex能否尝试将A
重命名为A_old
(此操作将使视图无效)
,然后将A_old
重命名回A
(与以前一样-因此结构和索引都相同),然后检查查询是否挂起(没有显式编译视图)?