Java MS-SQL Server、JDBC和XA事务异常
当我尝试执行XA事务时,日志中出现以下异常: javax.transaction.xa.XAException:com.microsoft.sqlserver.jdbc_SQLServerException:未能创建xa控件连接。错误:“对对象“xp\u sqljdbc\u xa\u init\u ex”、数据库“master”架构“dbo”的执行权限被拒绝 我遵循这些教程并 在完成第一个教程之后,我还在SSMS中运行了以下命令: 使用主围棋Java MS-SQL Server、JDBC和XA事务异常,java,sql-server,jdbc,Java,Sql Server,Jdbc,当我尝试执行XA事务时,日志中出现以下异常: javax.transaction.xa.XAException:com.microsoft.sqlserver.jdbc_SQLServerException:未能创建xa控件连接。错误:“对对象“xp\u sqljdbc\u xa\u init\u ex”、数据库“master”架构“dbo”的执行权限被拒绝 我遵循这些教程并 在完成第一个教程之后,我还在SSMS中运行了以下命令: 使用主围棋 EXEC sp_addrolemember[SqlJ
EXEC sp_addrolemember[SqlJDBCXAUser],'MyUserName'GO 我还要补充一点,我曾 使用master GO EXEC sp_GrantDB访问“我的用户名”和“我的用户名”GO 为了验证用户是否有权访问主数据库,我得到了一个错误,即“用户已存在于当前数据库中”。 最后,我通过SSMS验证了角色
SqlJDBCXAUser
是否已就xp\u sqljdbc\u xa\u init\u ex
授予执行权限我使用的数据库显然不是
master
,而是myDBName
。
关于这个问题,两者之间的唯一关联是MyUserName
是myDBName
的所有者,并且作为用户存在于master
中我的服务器运行在Windows XP SP3上(因此,第一个教程中提到的修补程序与此无关,因为它是针对XP SP2及以下版本的,我知道我尝试运行修补程序) 有人遇到过这个问题吗?我非常感谢一些线索。
谢谢,
伊泰 更新:
我再次阅读了Microsoft的第一个教程,其中有两段我不确定它们的意思,它们可能包含解决方案: 在将参与分布式事务的每个sql Server实例上执行数据库脚本xa_install.sql。此脚本安装由sqljdbc_xa.dll调用的扩展存储过程。这些扩展存储过程实现对Microsoft sql Server JDBC驱动程序的分布式事务和xa支持。您将需要d以SQL Server实例的管理员身份运行此脚本 当他们说
SQL Server实例
时,他们是指包含多个数据库的SQL Server,包括master
和myDBName
(我习惯于使用oracle术语,这些术语有点不同)?我运行了xa_install.SQL
脚本一次,它说明使用master
这是第二段:
配置用户定义的角色要向特定用户授予参与JDBC驱动程序分布式事务的权限,请将该用户添加到SqlJDBCXAUser角色。例如,使用以下Transact-SQL代码将名为“shelby”(名为“shelby”的SQL标准登录用户)的用户添加到SqlJDBCXAUser角色: SQL用户定义的角色是按数据库定义的。为了安全起见,要创建自己的角色,您必须在每个数据库中定义角色,并以按数据库的方式添加用户。SqlJDBCXAUser角色在主数据库中严格定义,因为它用于授予对SQL JDBC扩展数据库的访问权限驻留在master中的存储过程。您必须首先授予单个用户对master的访问权限,然后在登录master数据库时授予他们对SqlJDBCXAUser角色的访问权限 我不确定,但我认为上面粗体的一句话说,
SqlJDBCXAUser
角色应该只在master
上定义,其他访问myDBName
的用户应该被授予访问master
的权限,然后添加到角色中,这将以某种方式(不知道如何)将在使用myDBName
数据库使用xa包时启用它们
更新2:
这是SqlJDBCXAUser角色下存储过程安全设置的SSMS屏幕截图
我已经有一段时间没有在SQL server中使用Java了,但我突然注意到您的T-SQL中有一些可能没有按照您希望的方式运行。代码片段:
use master GO;
EXEC sp_addrolemember [SqlJDBCXAUser], 'MyUserName' GO;
仅将[SqlJDBCXAUser]应用于主数据库中的用户名。如果您的数据库位于另一个实例中,您还必须在该实例中添加角色。我假设另一个是输入错误(“sp_gratdbaccess”应为“sp_grandbaccess”)
我假设您必须在所有参与服务器中运行的“xa_install.sql”脚本已成功运行,并且未收到任何错误消息?请检查脚本中定义的角色,以确保键入的内容与需要的内容匹配
更新:
只是做一些精神检查:
- SQL Server是否在Windows XP(为什么?)服务器上?那么您有一个修补程序:
- SQL Server是否位于带有Microsoft分布式事务处理协调器(MS DTC)的Windows 2003机箱上?您有一个修补程序:
- 检查您可能遇到的其他限制:尤其是在使用MS DTC时
use master GO;
EXEC sp_addrolemember [SqlJDBCXAUser], 'MyUserName' GO;
USE [master]
GO
CREATE USER [UserName] FOR LOGIN [UserName] WITH DEFAULT_SCHEMA=[dbo]
use [master]
GO
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_commit] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_end] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_forget] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_forget_ex] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_init] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_init_ex] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_prepare] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_prepare_ex] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_recover] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_rollback] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_rollback_ex] TO [UserName]
GRANT EXECUTE ON [dbo].[xp_sqljdbc_xa_start] TO [UserName]
GO