2010-10-28 80 views
7

我得到以下异常在我的日志,当我尝试执行XA事务:异常与MS-SQL服务器,JDBC和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 instance,做他们的意思是它包含几个数据库,包括mastermyDBName在SQL Server(我已经习惯了甲骨文而言这是一个有点DIF ferent)?我运行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的访问权限,然后添加到角色中,并且将以某种方式(不知道如何)在使用时启用它们数据库使用xa软件包。

更新2: 这是从存储过程中的安全设置SSMS下SqlJDBCXAUser作用 alt text

回答

13

我们只需要做到以下几点:

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 
+0

哇!这实际上工作!谢谢。奇怪的是,我执行了这些命令的变体(作为MS教程的一部分,它们是xa_install.sl的一部分),唯一的区别是我授予角色权限并将我的用户添加到角色。你知不知道为什么会发生这种情况?我会非常感激。 – Ittai 2010-11-06 12:35:38

+0

这也适用于我,谢谢! - 我认为微软应该更新他们的文档,使他们更全面和更加傻瓜。 – monojohnny 2014-07-28 15:56:32

1

这已经有一段时间,因为我使用的Java与SQL服务器的截图,但就在蝙蝠我发现你的T-SQL中可能没有表现出你想要的方式。代码片段:

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

仅在主数据库中将[SqlJDBCXAUser]应用于您的用户名。如果你的数据库在另一个实例中,你还必须在那里添加角色。另一个我假设是一个错字('sp_gratdbaccess'应该是'sp_grantdbaccess')。

我假设您必须在所有参与服务器中运行的'xa_install.sql'脚本运行成功,并且您没有收到任何错误消息?检查它定义的角色的脚本,只是为了确保你所输入的内容与需要的内容相匹配。

更新:

只是一些健全检查:

当Microsoft调用事件“实例”时,微软并不明确,尤其是因为它们将它应用于数据库实例(数据库)以及SQL Server实例。一台物理服务器可以同时运行多个SQL Server副本,并监听不同的端口。其中每个都有自己的主数据库实例。通过其他语句(即XA事务支持驻留在主数据库中)的上下文,他们正在讨论您正在运行的每个SQL Server副本。如果您的应用程序的数据库跨SQL Server的4个实例(安装)分布,则必须在所有四个安装中执行XA安装步骤。

确保角色获得并适用于您的系统的最后一步是使用管理控制台打开master数据库。您希望确保您的用户位于Databases/master/Security/Users文件夹中,并且它已启用SqlJDBCXAUser角色(该角色的复选框)。

接下来,转到抱怨的违规存储过程,并确保任何安全设置包含SqlJDBCXAUser角色。角色名称不应该是区分大小写(因为SQL本身不是),但是确保角色案例是相同的情况不会有什么影响 - 以防万一。

如果失败,请在MyDatabase实例中运行'xa_install.sql'脚本。我个人讨厌这种含糊不清,但很可能是他们的意思。但在你这样做之前,确保你不需要任何修补程序或者有一个配置无法正常工作。撤销一些复杂的SQL脚本确实是一个很大的麻烦。这就是为什么我建议最后这样做。

+0

您好,感谢您发表评论。错字确实是一个错字。除了脚本(这是一个微软发布的脚本)在添加相关软件包之前尝试删除相关软件包并因此第一次指出错误而没有任何错误,因为没有什么可以放弃。关于你对'myDBName'没有应用于我的用户名的评论,我添加了一些信息,使我认为这是我需要做的。如果你可以看看它,并给我你的意见,我会很感激。 – Ittai 2010-11-01 07:36:16

+0

我也更新了我的答案,添加了其他一些事情来尝试。 – 2010-11-01 15:21:52

+0

操作系统是Win XP-SP3,所以这个修复程序是不相关的(我试图安装它,但它说它已经安装,因为它的SP2下)。我再次验证角色出现在master的用户身上,我将在第二个问题中发布关于存储过程的SqlJDBCXAUser角色的权限截图。如果你同意它看起来是正确的,我会悲伤地尝试在myDB上运行xa_install.sql – Ittai 2010-11-01 15:32:14