2010-10-28 32 views
7

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 alt text

Respuesta

13

única que teníamos que hacer lo siguiente:

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

¡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

+0

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

1

Ha sido un tiempo desde que he usado Java con SQL Server, pero justo al lado de la He notado algo en tu T-SQL que podría no haberse comportado de la manera que querías. El fragmento:

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

Sólo se aplica la [SqlJDBCXAUser] a su nombre de usuario en la base de datos maestra. Si su base de datos está en otra instancia, también deberá agregarla allí. El otro supongo que fue un error tipográfico ('sp_gratdbaccess' debería ser 'sp_grantdbaccess').

Supongo que las secuencias de comandos 'xa_install.sql' que tenía que ejecutar en todos los servidores participantes se ejecutaron correctamente y no recibió ningún mensaje de error. Examine la secuencia de comandos para las funciones que define, solo para asegurarse de que lo que está escribiendo coincide con lo que se necesita.

Actualizar:

A sólo algunas comprobaciones:

Microsoft es ambiguo cuando llama a las cosas una "Instancia", particularmente porque lo aplican a instancias de base de datos (su base de datos) así como instancias de SQL Server. Un servidor físico puede tener múltiples copias de SQL Server ejecutándose al mismo tiempo escuchando en diferentes puertos. Cada uno de estos tendría su propia instancia de base de datos maestra. En el contexto de las otras declaraciones (es decir, el soporte de transacción XA vive en la base de datos maestra), están hablando de cada copia de SQL Server que tiene en ejecución. Si la base de datos de su aplicación se distribuye en 4 instancias (instalaciones) de SQL Server, debe realizar los pasos de instalación de XA en las cuatro instalaciones.

El último paso para asegurarse de que las funciones tomaron, y se aplican correctamente a su sistema, abrir la base de datos maestra con la consola de administración. Desea asegurarse de que su usuario se encuentre en la carpeta Bases de datos/maestro/Seguridad/Usuarios, y que tenga activada la función SqlJDBCXAUser (casilla de verificación para la función).

A continuación, vaya al procedimiento almacenado ofensivo que se queja y asegúrese de que las configuraciones de seguridad incluyan la función SqlJDBCXAUser. Los nombres de roles no deben ser sensibles a las mayúsculas y minúsculas (como SQL no lo es), pero no estaría de más comprobar si el caso de función es el mismo caso, por si acaso.

Si eso falla, también ejecute el script 'xa_install.sql' en su instancia MyDatabase. Personalmente odio esta ambigüedad, pero muy bien podría ser lo que significan. Pero antes de hacer eso, asegúrese de que no necesita ninguna corrección urgente o de que la configuración no funcione correctamente. Deshacer algo que hace un script SQL complicado puede ser un gran dolor. Es por eso que sugiero hacer esto último.

+0

Hola, gracias por su comentario. El error tipográfico es de hecho un error tipográfico. No hubo errores, aparte del hecho de que el script (que es un script emitido por Microsoft) intenta descartar los paquetes relevantes antes de agregarlos y, por lo tanto, establece un error la primera vez porque no hay nada que perder. En cuanto a su comentario sobre el rol que no se aplica a mi nombre de usuario en 'myDBName', he agregado información arriba que me llevó a pensar que esto es lo que tengo que hacer. Si puedes echarle un vistazo y darme tu opinión, te lo agradecería. – Ittai

+0

También actualicé mi respuesta para agregar algunas otras cosas para probar. –

+0

El sistema operativo es Win XP-SP3, por lo que la revisión no es relevante (intenté instalarlo antes, pero dice que ya está instalado, ya que es para SP2). Verifiqué nuevamente que el rol aparece en los usuarios de master y publicaré en un segundo en la pregunta una captura de pantalla de los permisos del rol SqlJDBCXAUser con respecto al procedimiento almacenado. Si está de acuerdo en que se ve como corresponde, por desgracia intentaré ejecutar xa_install.sql en myDB – Ittai

Cuestiones relacionadas