首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle AQ队列默认模式

Oracle AQ队列默认模式
EN

Stack Overflow用户
提问于 2014-05-19 14:11:09
回答 2查看 573关注 0票数 1

从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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-20 09:33:38

考虑到这是bug 1259821,并且事件解决方案对您不起作用,或者实现起来不实用,那么您的另一个选项是通过指定模式名称来完全限定队列名。您大概是想避免在AQ调用中对模式名称进行硬编码,比如:

代码语言:javascript
复制
dbms_aq.enqueue(queue_name => 'DEV.SOMEQUEUE', ...);

..。因为您有跨环境共享的公共代码,并且希望根据登录触发器设置的架构在运行时使用正确的架构/队列。

如果是这样的话,那么您可以使用当前模式指定完整的队列名称:

代码语言:javascript
复制
dbms_aq.enqueue(queue_name =>
  sys_context('USERENV', 'CURRENT_SCHEMA') || '.SOMEQUEUE', ...);

在运行时,对于您的DEV_AD用户,它仍然将'DEV.SOMEQUEUE'作为队列名传递。

这在特殊代码中有点麻烦(如果您是从匿名块调用的),但如果您正在从存储过程中排队,则不算太糟。从错误描述来看,这似乎只是存储代码中的一个问题,因为定义者/调用者的权限与匿名块无关。

票数 1
EN

Stack Overflow用户

发布于 2014-05-20 06:50:11

在进一步搜索Oracle支持之后,这是一个bug --参见Metalink中的Doc 220477.1。

它在11.2.0.2中得到了修正;这个公共链接包含了更多的信息:https://community.oracle.com/thread/846141,但是这个修补程序对我们不起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23740016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档