Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
что такое автономные транзакции и как они синтаксически оформляются в mssql?
21 апр 15, 16:50    [17545012]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Никак, потому что их в mssql нет.
21 апр 15, 17:00    [17545068]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Гавриленко Сергей Алексеевич,
я вроде нашел статью
http://blogs.msdn.com/b/sqlprogrammability/archive/2008/08/22/how-to-create-an-autonomous-transaction-in-sql-server-2008.aspx


но понять не могу, автономная транзакция это просто вложенная транзакция и как она оформляется.
21 апр 15, 17:10    [17545105]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
это вы про оракловые автономные транзакции? вам уже сказали, что аналога в MS SQL нет. в статья эмуляция через CLR
21 апр 15, 17:13    [17545118]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Konst_One,

а как автономные транзакции сделать через CLR?
21 апр 15, 17:17    [17545136]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
там в вашей статейке есть и в ссылках ниже посмотрите.
но зачем вам это нужно? тут другая парадигма, не надо в лоб из оракла в ms sql транслировать код.
21 апр 15, 17:19    [17545147]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
вот смотрите тикет на коннекте:
https://connect.microsoft.com/SQLServer/feedback/details/296870/add-support-for-autonomous-transactions
21 апр 15, 17:24    [17545167]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Konst_One,

я не переношу текст из оракл в mssql. Мне нужно создать что-то подобное автономной транзакции в mssql. Как это сделать?
21 апр 15, 17:38    [17545219]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
relav
Konst_One,

я не переношу текст из оракл в mssql. Мне нужно создать что-то подобное автономной транзакции в mssql. Как это сделать?

CLR / Service Broker / Loopback server / табличные переменные. Выбирайте на здоровье.
21 апр 15, 17:39    [17545231]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
табличная переменная:

http://www.c-sharpcorner.com/UploadFile/john_charles/simulating-autonomous-transactions-in-microsoft-sql-server/
21 апр 15, 17:50    [17545284]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Гавриленко Сергей Алексеевич,

мне нужно реализовать update в автономной транзакции. Как это реализовать с помощью CLR?
21 апр 15, 17:53    [17545302]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
relav
Мне нужно создать что-то подобное автономной транзакции в mssql. Как это сделать?

relav
мне нужно реализовать update в автономной транзакции. Как это реализовать с помощью CLR?

relav
я вроде нашел статью http://blogs.msdn.com/b/sqlprogrammability/archive/2008/08/22/how-to-create-an-autonomous-transaction-in-sql-server-2008.aspx
Вы нашли статью, как сделать автономные транзакции на MSSQL с помощью CLR, и пять раз задаёте вопрос, как сделать автономные транзакции на MSSQL с помощью CLR?

Прочитайте статью, сделайте, потом поделитесь здесь, в форуме, расскажите про свой опыт.

Или задавайте конкретные вопросы по мере реализации, если будут трудности.
21 апр 15, 19:23    [17545631]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
relav
что такое автономные транзакции и как они синтаксически оформляются в mssql?

Т.е. человек даже не знает что это, но хочет именно автономные и именно в ms sql
21 апр 15, 19:32    [17545669]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
alexeyvg
Вы нашли статью, как сделать автономные транзакции на MSSQL с помощью CLR, и пять раз задаёте вопрос, как сделать автономные транзакции на MSSQL с помощью CLR?

Прочитайте статью, сделайте, потом поделитесь здесь, в форуме, расскажите про свой опыт.
В статье только общая идея, вот, тут можно посмотреть пример реализации, секция Simulating Autonomous Transactions
http://sqlblog.com/blogs/paul_white/archive/2010/10/19/sequence-tables.aspx
21 апр 15, 20:45    [17545912]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
скажите, пожалуйста, где должна вызываться процедура sys.sp_addlinkedserver?
Я ее вызываю следующим образом
+
CREATE PROCEDURE [oss].[P_excel_clients]
@report int,
@city_id int,
@date_start datetime,
@date_end datetime
AS
BEGIN
  declare @outscript varchar(max),
          @outfile varbinary(max),
          @sql varchar(max),
          @sql2 varchar(max),
          @server varchar(100),                    
          @password varchar(20),
          @path varchar(100),
          @p varchar(100),
          @path_dir varchar(100),
          @path_file varchar(100),
          @t varchar(100);
          
  DECLARE @servername SYSNAME;
          
    
   set @path_dir = 'D:\Reports\';
   set @path_file = 'Report4';
   SET @path = @path_dir + @path_file + '_' + CONVERT(varchar, getdate(), 102) + '.xlsx';
   set @p=@path_dir + @path_file;
   set @sql2='OLEDBConnection.CommandText = "update oss.test1 set code = ''' +@p+ ''' where id =40"';
         
   if ISNULL(cast(cast(@date_start as DATE) as varchar(10)),'1990-01-01')<> '1990-01-01'
   begin
      set @sql='OLEDBConnection.CommandText = "select city as ''Наименование города'', street_type as ''Тип улицы'', street as ''Наименование улицы'', building as ''Адрес'', flat_count as ''Количество квартир'', sector as ''Сектор'', date_exploitation as ''Дата ввода в эксплуатацию'', kol_tkd as ''Количество ТКД в доме'', kol1_tkd as ''Количество коммутаторов «подключено»'', kol2_tkd as ''Количество коммутаторов «Временно не подключен»'', cl_all as ''Количество абонентов  (всего)'', cl_open as ''Статус абонента «Ореn»'', cl_suspend as ''Статус абонента «Suspend»'', cl_cancel as ''Статус абонента «Cancel»'',comment_penetr as ''Примечание к пенетрации'', ksk as ''КСК (основной)'', ksk1 as ''КСК'', comment as ''Комментарий (из категории «адреса»)''  from oss.f_v_report_client_date('''+cast(cast(@date_start as DATE) as varchar(10))+''','''+cast(cast(@date_end as DATE) as varchar(10))+''') ';  
       
   if ISNULL(@city_id,0)>0
      set @sql=@sql+' where city_id='+CAST(@city_id as varchar(3));                 
   end 
   else
   begin  
      set @sql='OLEDBConnection.CommandText = "select city as ''Наименование города'', street_type as ''Тип улицы'', street as ''Наименование улицы'', building as ''Адрес'', flat_count as ''Количество квартир'', sector as ''Сектор'', date_exploitation as ''Дата ввода в эксплуатацию'', kol_tkd as ''Количество ТКД в доме'', kol1_tkd as ''Количество коммутаторов «подключено»'', kol2_tkd as ''Количество коммутаторов «Временно не подключен»'', cl_all as ''Количество абонентов  (всего)'', cl_open as ''Статус абонента «Ореn»'', cl_suspend as ''Статус абонента «Suspend»'', cl_cancel as ''Статус абонента «Cancel»'',comment_penetr as ''Примечание к пенетрации'', ksk as ''КСК (основной)'', ksk1 as ''КСК'', comment as ''Комментарий (из категории «адреса»)''  from oss.f_v_report_client()';
   if ISNULL(@city_id,0)>0
      set @sql=@sql+' where city_id='+CAST(@city_id as varchar(3));
    end 
   set @sql=@sql+' order by 2,3,4,5 "'
   
           
   select  @server =@@servername;
  -- set @outscript = '     connectionString = "Driver=Sql Server;Server=' + cast( @@servername as varchar( 128 ) ) + '; Database=kartel; User ID=oss;Password='+ @password + '"
  set @outscript = '     
    
rem 
	dim WorkbookConnection
	dim WorkbookConnectionOp
	dim QueryTableb
	dim OLEDBConnection
	dim connstr
	dim cmdText
	dim OLEDBConnectionPr
    dim Worksheet
    dim rDest
    dim objBook
    dim ListObj
    dim ListOb
    dim wsSheet
    dim rnStart
    dim SelChange
    dim SelChangeCor
    dim SelChangeCorN
    dim selection

rem
connstr = "OLEDB;Provider=SQLOLEDB.1;Password=ReporT;Persist Security Info=True;User ID=report;Initial Catalog=kartel;Data Source=AL-FTB005;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=ATITOCHKA;Use Encryption for Data=False;Tag with column collation when possible=False"
cmdText = ""

     set objBook = objXLApp.Workbooks(1)
	 set mainSheet = objBook.Sheets(1)
	 set wsSheet = objBook.Worksheets(1)
     set WorkbookConnection=objBook.Connections("kartel")          
     set OLEDBConnection = WorkbookConnection.OLEDBConnection
     OLEDBConnection.CommandText = ""
     set ListObj = wsSheet.ListObjects(1)
     set QueryTableb = ListObj.QueryTable
     QueryTableb.PreserveColumnInfo = "False"
     QueryTableb.PreserveFormatting = "False"     
     OLEDBConnection.Refresh
     objBook.Connections("kartel").Delete    
     wsSheet.Columns("G:G").NumberFormat = "dd.mm.yyyy"
     objBook.Application.DisplayAlerts = False
     objBook.SaveAs "Filename"
     objBook.Application.DisplayAlerts = True
          		 	 '      		 	      
  set @outscript = REPLACE( @outscript, 'OLEDBConnection.CommandText = ""', @sql);
  set @outscript = REPLACE( @outscript, 'Filename', @path);

  set @outfile = oss.f_report( @report );
  select @outscript outscript, @outfile outfile;
 -- exec p_create_loopback_linked_server @path;
 
SET @servername = CONVERT(SYSNAME, SERVERPROPERTY(N'ServerName'));

EXECUTE sys.sp_addlinkedserver @server = N'loopback',
                               @srvproduct = N'',
                               @provider = N'SQLNCLI',
                               @datasrc = @servername;

EXECUTE sys.sp_serveroption @server = N'loopback',
                            @optname = 'remote proc transaction promotion',        
                            @optvalue = 'OFF';
                            
BEGIN TRAN InnerTran
    EXEC loopback.tempdb.dbo.p_update_path @path;
COMMIT TRAN InnerTran
  return;
  
END;


и у меня возникает ошибка: the procedure 'sys.sp_addlinkedserver' cannot be executed within a transaction
22 апр 15, 10:51    [17547498]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
relav
и у меня возникает ошибка: the procedure 'sys.sp_addlinkedserver' cannot be executed within a transaction

И что вас заставило вопреки документации запускать sys.sp_addlinkedserver в транзакции ?
22 апр 15, 10:52    [17547503]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Glory,

я не понимаю где нужно вызывать процедуру sp_addlinkedserver . Если можете , то подскажите.
22 апр 15, 11:08    [17547565]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
relav
я не понимаю где нужно вызывать процедуру sp_addlinkedserver . Если можете , то подскажите.

ее надо вызывать НЕ в транзакции.
22 апр 15, 11:11    [17547577]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Glory,

если я процедуру sp_addlinkedserver вызываю в другой процедуре это означает, что я ее вызываю в транзакции?
22 апр 15, 11:19    [17547600]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
relav
если я процедуру sp_addlinkedserver вызываю в другой процедуре это означает, что я ее вызываю в транзакции?

Нет. Это означает, что вы начали транзакцию и в ней вызвали sp_addlinkedserver
22 апр 15, 11:20    [17547611]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Glory,

можно создать линк сервер отдельно под администратором, а потом вызывать процедуру следующим образом?
BEGIN TRAN InnerTran
    EXEC loopback.tempdb.dbo.p_update_path @path;
COMMIT TRAN InnerTran
22 апр 15, 12:46    [17548164]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
relav
можно создать линк сервер отдельно под администратором

Вообще то так всегда и делают
22 апр 15, 12:55    [17548236]     Ответить | Цитировать Сообщить модератору
 Re: транзакции  [new]
relav
Member

Откуда:
Сообщений: 204
Glory,

получилось , спасибо большое
22 апр 15, 13:41    [17548634]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить