从DBMS_AQ的enqueue方法的Oracle文档中,可以指定“对象的名称由可选的架构名称和名称指定。如果没有指定模式名称,则当前的模式假定为”1。
所讨论的系统定义了模式中的所有对象,让我们称之为DEV。然后像DEV_AD一样定义用户,并且在登录期间有一个触发器将他们当前的模式更改为DEV。这意味着当他们从DEV.sometable中选择*时,他们从DEV_AD.sometable中选择*,而不是DEV_AD.sometable。这是没有问题的。
然而,当用户试图在SOMEQUEUE上排队时,它就不起作用了--系统试图在不存在的DEV_AD.SOMEQUEUE (而不是DEV.SOMEQUEUE )上排队。通过将DEV.SOMEQUEUE (而不仅仅是SOMEQUEUE )放置为DBMS_AQ.ENQUEUE的参数,消息就成功地排队了。
这是Oracle错误(或文档错误)吗?有解决办法吗?
如果它是一个bug,那么在接下来的几个月中,我们仍然使用10.2.0.4.0。是11克吗?
1
发布于 2014-05-20 09:33:38
考虑到这是bug 1259821,并且事件解决方案对您不起作用,或者实现起来不实用,那么您的另一个选项是通过指定模式名称来完全限定队列名。您大概是想避免在AQ调用中对模式名称进行硬编码,比如:
dbms_aq.enqueue(queue_name => 'DEV.SOMEQUEUE', ...);..。因为您有跨环境共享的公共代码,并且希望根据登录触发器设置的架构在运行时使用正确的架构/队列。
如果是这样的话,那么您可以使用当前模式指定完整的队列名称:
dbms_aq.enqueue(queue_name =>
sys_context('USERENV', 'CURRENT_SCHEMA') || '.SOMEQUEUE', ...);在运行时,对于您的DEV_AD用户,它仍然将'DEV.SOMEQUEUE'作为队列名传递。
这在特殊代码中有点麻烦(如果您是从匿名块调用的),但如果您正在从存储过程中排队,则不算太糟。从错误描述来看,这似乎只是存储代码中的一个问题,因为定义者/调用者的权限与匿名块无关。
发布于 2014-05-20 06:50:11
在进一步搜索Oracle支持之后,这是一个bug --参见Metalink中的Doc 220477.1。
它在11.2.0.2中得到了修正;这个公共链接包含了更多的信息:https://community.oracle.com/thread/846141,但是这个修补程序对我们不起作用。
https://stackoverflow.com/questions/23740016
复制相似问题