У меня есть две базы данных на одном экземпляре SQL Server.
В «DatabaseA» у меня есть хранимая процедура, которая вызывает код C# (сборка CLR в SQL) для распаковки данных и после распаковки записывает распакованные данные в таблицы DatabaseB (ScanTracking, Strings, Numerics)
Хранимая процедура при выполнении вручную работает нормально.
Однако, когда я запускаю хранимую процедуру через триггер для таблицы, присутствующей в DatabaseA. Я получаю следующую ошибку
«Контекст транзакции используется другим сеансом»
Полная информация об ошибке выглядит следующим образом:
Msg 6522, Level 16, State 1, Procedure ExecuteDeSerializeBulk, Line 0
A .NET Framework error occurred during execution of user-defined routine or aggregate "ExecuteDeSerializeBulk":
System.Data.SqlClient.SqlException: Transaction context in use by another session.
System.Data.SqlClient.SqlException:
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
at System.Data.SqlClient.SqlInternalConnectionTds.PropagateTransactionCookie(Byte[] cookie)
at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnecti...
The statement has been terminated.
Я провел небольшое исследование и нашел следующие ссылки
Контекст транзакции, используемый другим сеансом
Я не использую связанный сервер или что-то сложное, обе мои базы данных находятся на одном сервере.
В качестве обходного пути я вернулся к заданию агента SQL, которое запускается каждые 5 минут и распаковывает данные в базу данных. Это работает нормально. Однако мой разум говорит мне, что я не нахожу решения проблемы с триггером и не работаю над этим, используя задание агента SQL.
Любые мысли или предложения очень помогут.
ExecuteDeSerializeBulk
, триггера и кода C#, который обновляет базу данных (таким образом, «активирует триггер»). - person mjwills   schedule 01.12.2017