Oracle XA权限

vhmi4jdf  于 2023-04-20  发布在  Oracle
关注(0)|答案(2)|浏览(273)

我在IBM WebSphere上部署的一个应用程序使用Oracle 12c数据库。该应用程序确实需要在Oracle上启用XA事务,并且用户(通过WebSphere的数据源连接到Oracle)应该具有XA权限。如何查找用户是否已被授予XA权限?我尝试运行以下查询来查找权限,但没有运气。

select * from dba_profiles where resource_name='IDLE_TIME';

select * from dba_profiles where resource_name='CONNECT_TIME';

select * from dba_2pc_pending;

select * from session_privs;

SELECT * FROM DBA_TAB_PRIVS;

SELECT * FROM DBA_TAB_PRIVS where owner='<schema_user>';

SELECT * FROM USER_ROLE_PRIVS;

我知道在Oracle12中,XA是默认启用的,但是我们需要授予模式所有者参与事务的任何权限吗?

wfsdck30

wfsdck301#

在与我的DBA团队进行了几次电子邮件交流后,他们最终通过执行以下命令授予了用户权限,并解决了问题。希望这对您有所帮助。

GRANT EXECUTE ON SYS.DBMS_XA TO <user>;
Prompt Privs on TABLE SYS.PENDING_TRANS$ to <user>;
GRANT SELECT ON SYS.PENDING_TRANS$ TO <user>;
fd3cxomn

fd3cxomn2#

有点晚了,但您可能需要更多的赠款,这取决于您的内部解决方案或外部库的要求。

grant execute on dbms_xa                  to <user>;
grant select  on pending_trans$           to <user>; 
grant select  on dba_2pc_pending          to <user>;
grant select  on dba_pending_transactions to <user>;

最后,要确定您是否具有正确的权限,只需尝试访问(SELECT/EXECUTE)您需要赠款的表/包。例如:

-- Running those in your <user> should not error.
SELECT * FROM sys.dba_pending_transactions;
SELECT * FROM sys.pending_trans$;
SELECT * FROM sys.dba_2pc_pending;

或者如果您可以访问SYSDBA

select * from USER_TAB_PRIVS where Grantee = <user>;

根据Oracle XA Distributed Transactions白色:
第十一页
类似地,对于PL/SQL(来自Oracle Database 11 gR 1),DBMS_XA包中的XA_SETTIMEOUT函数可用于设置事务超时,默认值为60秒。
第12页
如果某个事务超时并变为“in-doubt”,则它将出现在DBA_2PC_PENDING和DBA_PENDING_TRANSACTIONS视图中。
第十四页
Oracle数据库允许访问数据库中有关分布式事务处理的以下信息:

  • 关于未解决的分布式事务的信息(例如,准备好的和等待提交/回滚的)可以通过DBA_PENDING_TRANSACTIONS系统视图获得。
  • 有关等待恢复的分布式事务(例如“可疑”事务)的信息可通过DBA_2PC_PENDING系统视图获得。
  • 有关当前活动的分布式事务的信息可通过V$GLOBAL_TRANSACTION系统视图获得。

第十九页:
执行分布式事务的任何数据库帐户都必须具有以下权限:

  • 具有读取DBA_PENDING_TRANSACTIONS系统视图的权限(GRANT)。
  • 具有对“FORCE ANY TRANSACTION”特权的权限(GRANT),用于需要操作其他数据库用户创建的分布式事务的数据库用户。

此外,使用RAC时,用户帐户必须具有以下权限:

  • 具有执行DBMS_SYSTEM系统软件包的权限(GRANT)(适用于9.2.0.810.2.0.3及更低版本,5945463的修补程序除外
  • 服务器,5965349 - OCI /C库,5892995 JDBC已应用)或DBMS_XA系统包(10.2.0.4或更高版本用于数据库服务器,客户端OCI库或JDBC驱动程序)。
  • 使用同一修补程序集的客户端和服务器版本,或应用适当的修补程序,以避免在同一部署中混合使用DBMS_SYSTEM包和DBMS_XA包。

第20页
XA接口中提供的功能,用于支持涉及多个资源管理器(如数据库和队列)的事务。PL/SQL现在能够使用DBMS_XA包中包含的XA/Open接口库在SQL*Plus会话或进程之间切换或共享事务(例如,XA_START加入事务,XA_END离开事务)。
第24页
尽管本文描述了配置XA数据库用户的权限(GRANT)以执行www.example.com的DBMS_SYSTEM系统包10.2.0.3,但对于数据库的更高版本,这可能需要对DBMS_XA系统包的权限。
因此,我们需要一个SELECT GRANT来处理DBA_2PC_PENDINGDBA_PENDING_TRANSACTIONS。如果我们想处理“有疑问”的事务,Atomikos需要很多功能(即un/lock由有疑问的分布式事务持有,Expired In-Doubt Transactions等)。
最重要的是,我们需要DBA_PENDING_TRANSACTIONS上的SELECT GRANT。关于DBMS_SYSTEM,我们使用Oracle 11 g(见10.2.0.4),所以我们应该对DBMS_XA表执行GRANT。
如果我们想了解为什么使用DBMS_XA而不是DBMS_SYSTEM,请参见第18页,其中解释了原因:
以前,XA客户端需要DBMS_SYSTEM上的执行权限才能调用DIST_TXN_SYNC。此安全性增强需要更改服务器和客户端软件(例如,客户端OCI库和JDBC),以便调用数据包DBMS_XA而不是DBMS_SYSTEM。这意味着为了避免数据库故障转移时的用户权限错误,所有XA客户端用户现在都需要DBMS_XA上的执行权限,而不是DBMS_SYSTEM。
关于pending_trans$,像Atomikos团队(和IBM team)这样的XA工具可能会使用这个值,因此它通常被记录为必需的授权。
也许他们是通过一个legacy documentation来推导这个值的:
对于Oracle,XA数据源的数据库用户需要具有必要的权限,才能在Application Server崩溃并重新启动后恢复任何事务。恢复事务所需的各种表的Oracle权限如下:

  • DBA_PENDING_TRANSACTIONS、PENDING_TRANS$、DBA_2PC_PENDING和DBA_2PC_NEIGHBORS表的SELECT权限
  • DBMS_SYSTEM表的EXECUTE权限

而且,如果你看一下ORA-01500 to ORA-02098 range of errors,你会看到PENDING_TRANS$正在被使用/描述。

相关问题