gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:34:00 24 4
gpt4 key购买 nike

当我尝试执行 XA 事务时,我的日志中出现以下异常:

javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc_SQLServerException: failed to create the XA control connection. Error: "The EXECUTE permission was denied on the object 'xp_sqljdbc_xa_init_ex', database 'master' schema 'dbo'

我遵循了这些教程 Understanding XA TransactionsHow to make MSSQL Server XA Datasource Work?完成第一个教程后,我还在 SSMS 中运行了以下命令:

use master GO
EXEC sp_addrolemember [SqlJDBCXAUser], 'MyUserName' GO

我还要补充一点,我跑了

use master GO EXEC sp_grantdbaccess 'MyUserName','MyUserName' GO

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

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

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

Execute the database script xa_install.sql on every SQL Server instance that will participate in distributed transactions. This script installs the extended stored procedures that are called by sqljdbc_xa.dll. These extended stored procedures implement distributed transaction and XA support for the Microsoft SQL Server JDBC Driver. You will need to run this script as an administrator of the SQL Server instance.

当他们说 SQL Server 实例 时,他们是指包含多个数据库的 sql server,包括 mastermyDBName(我是以前使用的 oracle 术语有点不同)?我运行了一次 xa_install.sql 脚本,它显示了 use master

这是第二段:

Configuring the User-Defined Roles
To grant permissions to a specific user to participate in distributed transactions with the JDBC driver, add the user to the SqlJDBCXAUser role. For example, use the following Transact-SQL code to add a user named 'shelby' (SQL standard login user named 'shelby') to the SqlJDBCXAUser role:

USE master  
GO
EXEC sp_grantdbaccess 'shelby', 'shelby'
GO
EXEC sp_addrolemember [SqlJDBCXAUser], 'shelby'

SQL user-defined roles are defined per database. To create your own role for security purposes, you will have to define the role in each database, and add users in a per database manner. The SqlJDBCXAUser role is strictly defined in the master database because it is used to grant access to the SQL JDBC extended stored procedures that reside in master. You will have to first grant individual users access to master, and then grant them access to the SqlJDBCXAUser role while you are logged into the master database.

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

更新 2:这是 SqlJDBCXAUser 角色下存储过程安全设置的 SSMS 截图 alt text

最佳答案

我们只需要做以下事情:

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

关于java - MS-SQL Server、JDBC 和 XA 事务异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4043859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com