MS-SQL Server,JDBC和XA事务的异常

Itt*_*tai 8 java sql-server jdbc

当我尝试执行XA事务时,我在日志中遇到以下异常:

javax.transaction.xa.XAException:com.microsoft.sqlserver.jdbc_SQLServerException:无法创建XA控件连接.错误:"对象'xp_sqljdbc_xa_init_ex',数据库'master'架构'dbo'上的EXECUTE权限被拒绝

我按照这些教程了解XA事务如何使MSSQL Server XA数据源工作? 在完成第一个教程之后,我还在SSMS中运行了以下命令:

使用主GO
EXEC sp_addrolemember [SqlJDBCXAUser],'MyUserName'GO

我还要补充说我跑了

使用主GO EXEC sp_grantdbaccess'MyUserName','MyUserName'GO

验证用户是否有权访问主数据库,并且出现"用户已存在于当前数据库中"的错误.最后,我通过SSMS验证了该角色SqlJDBCXAUser确实已经授予EXECUTE xp_sqljdbc_xa_init_ex.
我使用的DB显然不是master,但myDBName.关于这个问题,两者之间唯一的关联是,作为用户MyUserName的所有者myDBName和存在master.
我的服务器在Windows XP SP3上运行(因此第一个教程中提到的修补程序不相关,因为它适用于XP SP2及其下,我知道当我尝试运行此修补程序时).

有人遇到过这个问题吗?我真的很感激一些线索.
谢谢,
Ittai

更新:
Microsoft再次查看了第一个教程,有两个段落,我不确定它们是什么意思,它们可能包含解决方案:

在将参与分布式事务的每个SQL Server实例上执行数据库脚本xa_install.sql.此脚本安装由sqljdbc_xa.dll调用的扩展存储过程.这些扩展存储过程实现了Microsoft SQL Server JDBC驱动程序的分布式事务和XA支持.您需要以SQL Server实例的管理员身份运行此脚本.

当他们说SQL Server instance,他们是否意味着包含几个数据库的sql server,包括mastermyDBName(我习惯了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'  
Run Code Online (Sandbox Code Playgroud)

SQL用户定义的角色是按数据库定义的.要出于安全目的创建自己的角色,您必须在每个数据库中定义角色,并以每个数据库的方式添加用户.SqlJDBCXAUser角色在master数据库中严格定义,因为它用于授予对驻留在master中的SQL JDBC扩展存储过程的访问权限.您必须首先授予单个用户访问master的权限,然后在登录master数据库时授予他们访问SqlJDBCXAUser角色的权限.

我不确定,但我认为上面的粗体句子说SqlJDBCXAUser只应该定义角色,master并且myDBName应该授予其他访问权限的用户访问权限master然后添加到该角色,这将以某种方式(不知道如何)在使用myDBName数据库使用xa包时将启用它们.

更新2: 这是来自SSMS的SqlJDBCXAUser角色下存储过程的安全设置的屏幕截图 替代文字

Jan*_*Jan 15

我们只需要做以下事情:

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
Run Code Online (Sandbox Code Playgroud)