Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

Механизм работы с транзакциями при работе через linkedserver с Oracle

$
0
0
Добрый день.

Есть вот такая конструкция в процедуре :
	begin try
		begin tran tran_name

			<some_code_here>

			set @sql_com = 'select * from openquery([LINKED_SERVER_TO_ORACLE],''select SCHEME_NAME.GET_PARAMS('+cast(@num_id as varchar)+') from dual'')'
  			exec sp_executesql @sql_com
	 		insert into out_results 
			select XR."NUM_ID",
				XR."LINE_NUMBER",
				XR."RESULT"
			from LINKED_SERVER_TO_ORACLE..SCHEME_NAME.OUT_RESULT as XR	

			delete 
			from LINKED_SERVER_TO_ORACLE..SCHEME_NAME.OUT_RESULT

			<some_code_here>

		commit tran tran_name
	end try

	begin catch
		if @@trancount > 0
			rollback tran tran_name
			set @err = 'GW ERROR: ' + error_message()
			exec dbo.LOG_TASK @num_id = @num_id,
			@message = @err,
			@log_level = 2   -- 2 - если ошибка
		raiserror(@err,16,1)
		return -1
	end catch


Дело в том, что даже при абсолютно нормальной работе куска кода, запрятанного в транзакцию, сервер не понимает, что с внешним oracle-сервером все прошло хорошо и все благополучно откатывает. Аналогичная конструкция с try..catch, но без транзакции отрабатывает отлично. Транзакция обязательна, там за <some code> еще много всего и оно все должно откатится в случае чего.

Вопрос: как дать ему понять, что все прошло прекрасно?

Viewing all articles
Browse latest Browse all 7251

Trending Articles