2010-10-28 144 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