Исключение с MS-SQL Server, JDBC и транзакциями XA - PullRequest
8 голосов
/ 28 октября 2010

При попытке выполнить транзакцию XA в журнале появляется следующее исключение:

javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc_SQLServerException: не удалось создатьконтрольное соединение XA.Ошибка: «Отказано в разрешении EXECUTE для объекта« xp_sqljdbc_xa_init_ex », схема« master »базы данных« dbo »

Я следовал этим урокам Понимание транзакций XA и Какзаставить работать MSSQL Server XA Datasource? После прохождения первого урока я также выполнил следующую команду в SSMS:

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

Я также добавлю, что я запустил

, используйте мастер GO EXEC sp_grantdbaccess 'MyUserName', 'MyUserName' GO

для проверкичто у пользователя есть доступ к главной базе данных, и я получил ошибку, что «пользователь уже существует в текущей базе данных». Наконец, через SSMS я убедился, что роли SqlJDBCXAUser действительно предоставлено EXECUTE в отношении xp_sqljdbc_xa_init_ex.
Я использую БД, очевидно, не master, а myDBName. Единственная корреляция между ними в отношении этой проблемы заключается в том, что MyUserName является владельцем myDBName и существует как пользовательв master.
Мой сервер работает под управлением Windows XP SP3 (поэтому исправление, упомянутое в первом руководстве, не имеет значения, поскольку оно предназначено для XP SP2 и ниже, я знаю, что пытался запустить исправление).

Имееткто-то сталкивался с этой проблемой?Я очень признателен за некоторые выводы.
Спасибо,
Иттай

Обновление:
Я посмотрел первый урок, начиная с Microsoft, сноваЕсть два абзаца, которые я не уверен, что они означают, и они могут содержать решение:

Выполнить скрипт базы данных xa_install.sql на каждом экземпляре SQL Server, который будет участвовать в распределенных транзакциях.Этот скрипт устанавливает расширенные хранимые процедуры, вызываемые sqljdbc_xa.dll.Эти расширенные хранимые процедуры реализуют распределенную транзакцию и поддержку XA для драйвера JDBC Microsoft SQL Server.Вам нужно будет запустить этот скрипт как администратор экземпляра SQL Server.

Когда они говорят SQL Server instance, означают ли они сервер sql, который содержит несколько баз данных, включая master и myDBName (Я привык к оракулам, которые немного отличаются)Я запускал сценарий xa_install.sql один раз, как он был указан, и он гласит: use master.

Это второй абзац:

Настройка пользовательских ролей
Чтобы предоставить разрешения конкретному пользователю для участия в распределенных транзакциях с драйвером JDBC, добавьте пользователя в роль SqlJDBCXAUser.Например, используйте следующий код Transact-SQL, чтобы добавить пользователя с именем shelby (стандартный пользователь SQL для входа в систему с именем shelby) в роль SqlJDBCXAUser:

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

пользователь SQL-определенные роли определены для базы данных .Чтобы создать собственную роль в целях безопасности, вам нужно будет определить роль в каждой базе данных и добавить пользователей для каждой базы данных. Роль SqlJDBCXAUser строго определена в базе данных master , поскольку она используется для предоставления доступа к расширенным хранимым процедурам SQL JDBC, которые находятся в master.Сначала вам нужно предоставить отдельным пользователям доступ к мастеру, а затем предоставить им доступ к роли SqlJDBCXAUser, когда вы вошли в базу данных master.

Я не уверен, но думаю, что приведенное вышеВыделенное предложение говорит, что роль SqlJDBCXAUser должна быть определена только для master, и что другим пользователям, которые имеют доступ к myDBName, должен быть предоставлен доступ к master, а затем добавлен к роли, и это будет каким-то образом (не знаю как) включит их при использовании базы данных myDBName для использования пакетов xa.

Обновление 2: Это скриншот из SSMS настроек безопасности хранимой процедурыпод ролью SqlJDBCXAUser alt text

Ответы [ 2 ]

15 голосов
/ 05 ноября 2010

Нам нужно было только сделать следующее:

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
2 голосов
/ 31 октября 2010

Прошло много времени с тех пор, как я использовал Java с SQL-сервером, но сразу же я заметил в вашем T-SQL что-то, что могло бы не вести себя так, как вы хотели.Фрагмент:

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

Применяет только [SqlJDBCXAUser] к вашему имени пользователя в базе данных master.Если ваша база данных находится в другом экземпляре, вам также придется добавить туда роль.Другой, я предполагаю, был опечаткой (sp_gratdbaccess должен быть sp_grantdbaccess ').

Я предполагаю, что ваши сценарии' xa_install.sql ', которые вы должны были запустить на всех участвующих серверах, работали успешно, ивы не получили сообщений об ошибках?Изучите скрипт для определения ролей, которые он определяет, просто чтобы убедиться, что набираемый вами текст соответствует тому, что вам нужно.

Обновление:

Просто некоторые проверки работоспособности:

  • SQL Server работает на сервере Windows XP (почему?)?затем у вас есть исправление: http://support.microsoft.com/kb/922668
  • Является ли SQL Server на Windows 2003 box с координатором распределенных транзакций Microsoft (MS DTC)?Если у вас есть исправление: http://support.microsoft.com/kb/899756
  • Проверьте http://msdn.microsoft.com/en-us/library/aa342335.aspx на наличие других ограничений, с которыми вы можете столкнуться: особенно если вы используете MS DTC.

Microsoft isнеоднозначно, когда он называет вещи «экземпляром», особенно потому что они применяют его к экземплярам базы данных (вашей базе данных), а также к экземплярам SQL Server.Один физический сервер может иметь несколько копий SQL-сервера, работающих одновременно и прослушивающих разные порты.Каждый из них будет иметь свой собственный экземпляр базы данных Master.В контексте других операторов (т. Е. Поддержка транзакций XA находится в базе данных master), они говорят о каждой копии SQL Server, которую вы используете.Если база данных вашего приложения распределена по 4 экземплярам (установкам) SQL Server, вам необходимо выполнить шаги установки XA на всех четырех установках.

Последний шаг, чтобы убедиться, что роли выполнялись и применяются квашей системы правильно, откройте главную базу данных с помощью консоли управления.Вы хотите убедиться, что ваш пользователь находится в папке Databases / master / Security / Users и что у него включена роль SqlJDBCXAUser (флажок для роли).

Затем перейдите к хранимой процедуре, которая нарушаетжалобы и убедитесь, что все параметры безопасности включают роль SqlJDBCXAUser.Имена ролей не должны быть чувствительными к регистру (как и сам SQL), но не мешало бы убедиться, что регистр ролей совпадает с регистром - на всякий случай.

Если это не помогло, также запустите скрипт 'xa_install.sql' в вашем экземпляре MyDatabase.Лично я ненавижу эту двусмысленность, но вполне возможно, что они имеют в виду.Но прежде чем сделать это, убедитесь, что вам не нужны какие-либо оперативные исправления или конфигурация, в которой она не будет работать правильно.Отмена чего-либо, что делает сложный сценарий SQL, может быть серьезной болью.Вот почему я предлагаю сделать это в прошлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...