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

Откуда:
Сообщений: 311
Добрый день.

Есть
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
May 14 2014 18:34:29
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

С которого требуется через LinkedServer_а к oracle_у; MySQL и т.д. и т.п. получать различные выборки, результат которых записывать с таблички.
Проблема в том, что в запросах
insert into @SomeTbl Exec(@SomeOracleQuery) at [Oracle]
-- OR
insert into @SomeTbl Exec(@SomeMySqlQuery) at [MySQL]

будет задействован MSDTC.
Т.к. провайдеры к Oracle и MySQL "нормально" работают только в режиме "Allow inprocess", то в случае использования MSDTC
SQL-сервер падает (если Oracle) или виснет (если MySQL).

Долгое время спасался двойной динамикой
insert into @SomeTbl exec(N'EXEC(''' + @SomeOracleQuery + ''') at [Oracle]')


Но вот требуется переехать на SQL2014, в котором финт ушами с двойной динамикой не прокатывает.

Попытался перенести Exec в CLR
  [SqlProcedure]
  public static void clrExec([SqlFacet(MaxSize = -1)] String stmt)
  {
    using (SqlConnection conn = new SqlConnection("context connection=true"))
    {
      SqlCommand cmd = new SqlCommand(stmt, conn);
      conn.Open();

      SqlDataReader reader = cmd.ExecuteReader();

      SqlContext.Pipe.Send(reader);

      conn.Close();
    }
  }

и получил тот же MSDTC
Msg 6549, Level 16, State 1, Procedure clrExec, Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'clrExec':
System.Data.SqlClient.SqlException: MSDTC on server 'MyComp' is unavailable.
MSDTC специально мною заблокирован (см.выше почему...).

Вопрос: Как бы избавиться от MSDTC в CLR ?
28 июл 14, 16:15    [16367177]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
так для линкеда запретите промоут транзакции - не?
28 июл 14, 16:37    [16367326]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Greenhorn
Member

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

Спасибо, помогло - забыл совсем про это
28 июл 14, 16:41    [16367352]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
To ALL

Из чисто спортивного интереса и в качестве увеличения энтропии еще пара вопросов.

Как я понял все классы, имена которых начинающиеся с "SQL", работают в контексте SQL-сервера, что приводит к провалу попыток избавиться от MSDTC.

Следовательно необходимо уйти от этих классов и перейти на другие.
Вопрос на какие ?

Тут же возникнет вопрос, как вернуть полученный RecordSet в SQL.
Пока нашел следующий способ:
SqlMetaData[] metaData = new SqlMetaData[FieldCount];
//... Как получить соответствие типов полей с типами SqlDbType ???
  SqlDataRecord record = new SqlDataRecord(metaData);
  SqlContext.Pipe.SendResultsStart(record);
//... Дальше просто ...
  SqlContext.Pipe.SendResultsEnd();


Вопрос как привести полученый RecordSet от классов, имена которых не начинающихся с "SQL", например к SqlDataRecord ?

PS. Прошу прощения за совсе чайниковские вопросы, но я только приступил к изучению C#
29 июл 14, 09:54    [16369523]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Форум по C# с другом месте.
29 июл 14, 11:12    [16369936]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Greenhorn
я только приступил к изучению C#


начали изучать SQL и C# и сразу полезли CLR сборки для SQL рисовать?
не надо оно вам на этом этапе, совсем, поверьте
29 июл 14, 11:38    [16370130]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 888
Greenhorn
..................

Т.к. провайдеры к Oracle и MySQL "нормально" работают только в режиме "Allow inprocess", то в случае использования MSDTC
SQL-сервер падает (если Oracle) или виснет (если MySQL).
..................


так между прочим, из опыта работы, 85 % запросов к связанным серверам пишутся неправильно. Разработчики забывают, что в разных СУБД различные типы данных, которые часто несовместимы. Вот и делают "Allowin Process", а потом жалобы почему ms sql server упал.
29 июл 14, 11:51    [16370277]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Crimean
Greenhorn
я только приступил к изучению C#


начали изучать SQL и C# и сразу полезли CLR сборки для SQL рисовать?
не надо оно вам на этом этапе, совсем, поверьте

Ну, допустим, SQL изучаю с 2007_го и успешно обходился все это время без CLR.

А тут приперло...

В одном проекте:
Могучая куча SOAP_овских клиентов ломится со сложными запросами к моему интеграционному сервису (embarcadero XE5).
Сложность запросов сводится к тому, что необходимо обратиться за данными к куче систем -
Oracle; MySQL; MSSQL; SOAP-сервисы и т.д. и т.п..
А полученные данные обработать по часто изменяемым бизнес правилам.
Результаты "обработки" использовать для последующих запросов к куче систем ....
и в конечном итоге получить множество RecordSet_ов, которые и отдать SOAP_овским клиентам.
Ситуация усугубляется тем, что часть SOAP_овских клиентов - web-морды, написанные, как бы это помягче,
не совсем дружественно - могут прислать один и тот же запрос 10-20 раз подряд.

Я не всегда в курсе структур БД систем, к которым мне нужно обратиться.
Иногда, как в случае с MYSQL, об удаленной системе мне известно только явки/пароли.
Соответственно при разработке архитектуры принял решение, что скрипты запросов к удаленным системам будут мне предоставляться в виде файлов.
WEB-сервис - совсем тупой и очень храбрый - получил запрос и дернул SP_шку моего SQL_я.
А в моем SQL_е - вся бизнес логика в SP_шках; запросы к удаленным серверам в FileTable_е;
исполнительный механизм асинхронный на Service Broker_е; cache ответов и многе другое ...

Все бы ничего, и работает уже второй год, но я слишком ленив, и хочу свести любую свою работу к нулю, автоматизировав все, что только можно.
Так, например, на FileTable повесил триггер в котором новый файл-скрипт выполняется с фиктивными параметрами для выяснения выходного RecordSet_а,
чтоб исполнительная система в динамике могла создать таблицу в которую и будет помещен промежуточный/конечный результат.

Вот и первые грабельки:
Я не нашел оптимального способа получить DDL по скрипту на TSQL_е
1) SELECT * INTO ##t FROM OpenRowSet() -- Скрипт не должен превышать 4000; нельзя в скрипте использовать DDL команды ...
2) sp_cursor* -- Все бы ничего, но как подавить пустой RecordSet, структуру которого и пытаемся вычислить ?
Есть конечно тупой способ, но это уже совсем говнокод.

Решение - CLR ...

Вторые грабельки:
Не надежная работа
insert into #SomeTable exec(@SomeScript) at [LinkedServer]

Вывод - нужно уходит от LinkedServer_ов

Решение - CLR ? Или я не прав ?

PS. Можно, конечно, и в консерватории что-то поправить, выкинув например SQL-сервер, но время показало, что выбранная архитектура себя оправдала
1) Минимум времени на ввод нового функционала
2) Минимум времени на изменение бизнес логики
3) И вникать в структуры удаленных систем не надо
4) И т.д. и т.п.
29 июл 14, 15:18    [16371642]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Если делать хорошо, надо все строго документировать и требовать выполнения ТУ. А так ванговать бесконечно можно по поводу структур данных.
Угадывание структур не входит в реляционную теорию
29 июл 14, 15:43    [16371848]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Greenhorn
Member

Откуда:
Сообщений: 311
Владислав Колосов
Если делать хорошо, надо все строго документировать и требовать выполнения ТУ. А так ванговать бесконечно можно по поводу структур данных.
Угадывание структур не входит в реляционную теорию

Совершенно верно !
Значит CLR ?
29 июл 14, 15:55    [16371930]     Ответить | Цитировать Сообщить модератору
 Re: Как избавиться от MSDTC в CLR ?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Насчет именно CLR сложно сказать, может быть отдельное приложение. Нужен какой-то инструмент, позволяющий получить информацию о неизвестной заранее структуре разносортных источников данных.
29 июл 14, 16:47    [16372310]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить