【发布时间】:2011-05-01 22:14:49
【问题描述】:
当我尝试执行 XA 事务时,我的日志中出现以下异常:
javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc_SQLServerException: 未能创建 XA 控制连接。错误:“对象'xp_sqljdbc_xa_init_ex',数据库'master'模式'dbo'的EXECUTE权限被拒绝
我遵循了这些教程 Understanding XA Transactions 和 How to make MSSQL Server XA Datasource Work? 在遵循第一个教程之后,我还在 SSMS 中运行了以下命令:
使用大师 GO
EXEC sp_addrolemember [SqlJDBCXAUser], 'MyUserName' GO
我还要补充说我跑了
使用 master GO EXEC sp_grantdbaccess 'MyUserName','MyUserName' GO
验证用户是否有权访问主数据库,我收到“用户已存在于当前数据库中”的错误。
最后,我通过 SSMS 验证了角色 SqlJDBCXAUser 确实已授予与 xp_sqljdbc_xa_init_ex 相关的 EXECUTE。
我使用的数据库显然不是master,而是myDBName。
关于这个问题,两者之间唯一的关联是MyUserName 是myDBName 的所有者,并且作为master 中的用户存在。
我的服务器在 Windows XP SP3 上运行(因此第一个教程中提到的修补程序不相关,因为它适用于 XP SP2 及更低版本,我知道我尝试运行该修补程序)。
有人遇到过这个问题吗?我真的很感激一些线索。
谢谢,
伊泰
更新:
我再次查看了来自Microsoft 的第一个教程,其中有两段我不确定它们的含义,它们可能包含解决方案:
在将参与分布式事务的每个 SQL Server 实例上执行数据库脚本 xa_install.sql。此脚本安装由 sqljdbc_xa.dll 调用的扩展存储过程。这些扩展存储过程实现了对 Microsoft SQL Server JDBC 驱动程序的分布式事务和 XA 支持。您需要以 SQL Server 实例的管理员身份运行此脚本。
当他们说SQL Server instance时,他们的意思是包含几个数据库的sql server,包括master和myDBName(我习惯了oracle术语有点不同)?我运行了xa_install.sql 脚本一次,它显示use master。
这是第二段:
配置用户定义的角色
要授予特定用户使用 JDBC 驱动程序参与分布式事务的权限,请将用户添加到 SqlJDBCXAUser 角色。例如,使用以下 Transact-SQL 代码将名为“shelby”的用户(名为“shelby”的 SQL 标准登录用户)添加到 SqlJDBCXAUser 角色:
USE master
GO
EXEC sp_grantdbaccess 'shelby', 'shelby'
GO
EXEC sp_addrolemember [SqlJDBCXAUser], 'shelby'
SQL 用户定义角色按数据库定义。为了安全起见,要创建自己的角色,您必须在每个数据库中定义角色,并以每个数据库的方式添加用户。 SqlJDBCXAUser 角色在 master 数据库中严格定义,因为它用于授予对驻留在 master 中的 SQL JDBC 扩展存储过程的访问权限。您必须首先授予个别用户对 master 的访问权限,然后在您登录到 master 数据库时授予他们对 SqlJDBCXAUser 角色的访问权限。
我不确定,但我认为上面加粗的句子说SqlJDBCXAUser 角色应该只在master 上定义,并且访问myDBName 的其他用户应该被授予对master 的访问权限,然后添加到角色中,这将以某种方式(不知道如何)使他们能够在使用 myDBName 数据库时使用 xa 包。
更新 2: 这是 SSMS 中 SqlJDBCXAUser 角色下存储过程的安全设置的屏幕截图
【问题讨论】:
标签: java sql-server jdbc