que estoy obteniendo la siguiente excepción en mi registro cuando trato de realizar una transacción XA:Excepción con el servidor, transacciones XA JDBC y MS-SQL
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'
que siguieron estos tutoriales Understanding XA Transactions y How to make MSSQL Server XA Datasource Work? Después de seguir el primer tutorial que también corrió el siguiente comando en SSMS:
use master GO
EXEC sp_addrolemember [SqlJDBCXAUser], 'MyUserName' GO
también voy a añadir que me encontré
use master GO EXEC sp_grantdbaccess 'MyUserName','MyUserName' GO
para verificar que el usuario tiene acceso al maestro db y me salió un error que "el usuario ya existe en la base de datos actual". Por último, he verificado, a través de SSMS, que la función SqlJDBCXAUser
tiene EXECUTE concedida con respecto a xp_sqljdbc_xa_init_ex
.
La base de datos que estoy utilizando obviamente no es master
sino myDBName
. La única correlación entre los dos, con respecto a este problema, es que MyUserName
es el propietario de myDBName
y existe como usuario en master
.
Mi servidor se ejecuta en Windows XP SP3 (por lo que la revisión mencionada en el primer tutorial no es relevante ya que está destinada para XP SP2 y versiones anteriores, lo sé cuando traté de ejecutar la revisión).
¿Alguien ha encontrado este problema? Realmente apreciaría algunas pistas.
Gracias,
Itai
Actualización:
He mirado en el primer tutorial, desde Microsoft
, una vez más, y hay dos párrafos que no estoy seguro de lo que significan y que pueden contener la solución :
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.
Cuando dicen SQL Server instance
, quieren decir que el servidor SQL que contiene varias bases de datos, incluyendo master
y myDBName
(estoy acostumbrado a los términos del oráculo que son un poco dif Ferent)? Ejecuto el script xa_install.sql
una vez como se dio y dice use master
.
Este es el segundo párrafo:
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.
No estoy seguro pero creo que la frase en negrita arriba dice que el papel SqlJDBCXAUser
sólo debe ser definida en master
y que otra los usuarios que acceden al myDBName
deben tener acceso a master
y luego agregarse a la función y eso hará que de alguna manera (no sé cómo) les permita usar el myDBName
base de datos para usar los paquetes xa.
Actualización 2: Esta es una captura de pantalla de SSMS de configuración de seguridad del procedimiento almacenado en el papel SqlJDBCXAUser
¡Guau! Esto realmente funcionó! Gracias. Lo extraño es que realicé una variación de estos comandos (como parte del tutorial de MS forman parte de xa_install.sl) con la única diferencia de que otorgué los permisos a un rol y agregué mi usuario al rol. ¿Sabes quizás por qué ocurrió esto? Estaría muy agradecido. – Ittai
Esto también funcionó para mí, ¡gracias! - Creo que Microsoft debería actualizar sus documentos para hacerlos un poco más completos y a prueba de tontos. – monojohnny