При попытке выполнить транзакцию 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