Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MS-SQL Server、JDBC和XA事务异常_Java_Sql Server_Jdbc - Fatal编程技术网

Java MS-SQL Server、JDBC和XA事务异常

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

当我尝试执行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[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时
微软称之为“实例”是含糊不清的,特别是因为他们将其应用于数据库实例(您的数据库)以及SQL Server实例。一台物理服务器可以有多个SQL Server副本同时运行在不同的端口上侦听。每个端口都有自己的主数据库实例。根据其他语句的上下文(即XA事务支持位于主数据库中),他们谈论的是您运行的SQL Server的每个副本。如果您的应用程序的数据库分布在SQL Server的4个实例(安装)上,则您必须在所有4个安装上执行XA安装步骤

最后一步,要确保角色已正确地应用于您的系统,请使用管理控制台打开主数据库。您要确保您的用户位于Databases/master/Security/Users文件夹中,并且它已
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