Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
Софтина должна работать на зоопарке СУБД, так как логика там простая, скорее её даже нет вовсе, только тупо insert update delete select и иногда create table.

Раньше всегда в случае необходимости поддержки зоопарка "пропихивал" типа сервера из параметров подключения.
А вот на этот раз задумался, может можно этого избежать, и если да - то какой ценой.

Идея заключается в возможности парой запросов после подключения (ну скажем подключение через ODBC или DBX - так что большой разницы в параметрах нет) определить, что за зверя подсунули. Основывается идея на возможности придушить исключение после select @@version или select from dual или других подобных характерых запросах. Если это реально за пару запросов определить СУБД (и в идеале ещё и версию) - я тогда не буду пропихивать типа сервера, а определю это самостоятельно SQL-запросами.

Решение ищется для "большой пятёрки" + огнептица + мускуль + постгреса. Если будет работать для извратов типа мимера - тем лучше ))))

зы. Понимаю что брежу, но давайте назовём это спортивным интересом ))).
9 окт 12, 19:13    [13292451]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54850

Сергей Васкецов
ну скажем подключение через ODBC или DBX - так что большой разницы в
параметрах нет

Ага. А та самая "маленькая разница в параметрах" и есть указание используемого драйвера,
то бишь СУБД.

Posted via ActualForum NNTP Server 1.5

9 окт 12, 19:56    [13292550]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Сергей Васкецов
после подключения (ну скажем подключение через ODBC...


Интересно, как можно подключиться к чему-то через ODBC (или через другой механизм доступа к данным) не указав конкретного драйвера?!

ЗЫ. IMHO, в общем случае задача решения не имеет, если только тупо не пытаться перебирать драйвера "большой пятёрки" и производить попытку установить коннект с учетом необходимых параметров строки подключения для каждой из СУБД. Т.е. без диалога с пользователем не обойтись.
9 окт 12, 19:56    [13292553]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
АнатоЛой
Member

Откуда: Киев, Украина
Сообщений: 2897
Блог
pkarklin, из постановки задачи следует, чтодрайвер уже указан и настроен. А тут программисту захотелось узнать, что за БД ему подсунули, чтобы что-то простенькое в create/insert/update/delete/select подкрутить...
9 окт 12, 20:20    [13292593]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
pkarklin
Интересно, как можно подключиться к чему-то через ODBC (или через другой механизм доступа к данным) не указав конкретного драйвера?!

Ну конкретно тупо по настроенному системному алиасу. Надо лишь алиас, логин и пароль ))).
Да и хотелось бы попробовать без привязки к типу драйвера. Понятно что можно и параметры подключения понюхать, и класс объекта драйвера dbx поглядеть. Но, скажем так, спортивный интерес в голом SQL и реакции на его результат выполнения или факт невыполнения по ошибке.

pkarklin
и производить попытку установить коннект

Давай допустим, что коннект уже есть. Поэтому задача по определнию имеет решение, и число запросов не более чем 8 в самом худшем случае (по числу проверяемых СУБД). С учётом select @@version и других, работающих более чем на одной СУБД, оно очевидно уменьшается. Вопрос в конкретных магических командах и результирующем минимуме числа таковых.

АнатоЛой
чтобы что-то простенькое в create/insert/update/delete/select подкрутить...

Ну в общем да. Я конечно могу и тупо к системным таблицам попробовать обратиться, но хотелось бы решения проще, интуитивно кажется, что оно должно существовать и быть достаточно простым.

Если кому-то не нравится постановка про "спортивный интерес" - давайте модифицируем это как возможный вопрос на собеседовании ))))))))))))))))
9 окт 12, 20:31    [13292621]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
pkarklin
через ODBC (или через другой механизм доступа к данным) не указав конкретного драйвера?!

Вот так на перле:
$dbh = DBI->connect('dbi:ODBC:GIS', 'sa', '', {AutoCommit => 1}) || die "Can't connect to server";
9 окт 12, 20:34    [13292625]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54850

Сергей Васкецов
Давай допустим, что коннект уже есть.

В этом случае SQLGetInfo(), например, выдаст названия драйвера, СУБД и даже её версию.

Posted via ActualForum NNTP Server 1.5

9 окт 12, 20:41    [13292636]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
АнатоЛой
из постановки задачи следует, чтодрайвер уже указан и настроен. А тут программисту захотелось узнать, что за БД ему подсунули, чтобы что-то простенькое в create/insert/update/delete/select подкрутить...


Первое, что я бы спросил у программиста на собеседовании: "Если коннект установлен и драйвер уже указан, то как тебе могло придти в голову узнать, что за СУБД с помощью create/insert/update/delete/select".

Сергей Васкецов
Если кому-то не нравится постановка про "спортивный интерес" - давайте модифицируем это как возможный вопрос на собеседовании ))))))))))))))))


Нет, уж, пусть вопрос останется спортивным.
9 окт 12, 21:05    [13292670]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
Dimitry Sibiryakov
SQLGetInfo()

Нет привязки к ODBC API
9 окт 12, 21:06    [13292674]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
pkarklin
Если коннект установлен и драйвер уже указан, то как тебе могло придти в голову узнать, что за СУБД с помощью create/insert/update/delete/select

Выше пример коннекта на перле. Догадаешься к какому серверу? )))
9 окт 12, 21:08    [13292677]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54850

Сергей Васкецов
Нет привязки к ODBC API

Ага, а запрос ты собрался отправлять телепатически, без API?.. Ню-ню...

Posted via ActualForum NNTP Server 1.5

9 окт 12, 21:10    [13292682]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Сергей Васкецов
Выше пример коннекта на перле. Догадаешься к какому серверу? )))


Учетная запись sa есть у MS SQL и у Sybase. Не догадываюсь...
9 окт 12, 21:13    [13292689]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
Dimitry Sibiryakov
запрос ты собрался отправлять телепатически, без API?

Выше пример коннекта на перле.

зы. Я выше написал, что спортивный интерес в реализации проверки на голом SQL. Чтобы не зависеть ни от драйверов, ни от прочих транспортов и языка.
9 окт 12, 21:15    [13292690]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
pkarklin
Учетная запись sa есть у MS SQL и у Sybase

А у каких-то других СУБД есть запрет на создание такого логина? )))
9 окт 12, 21:16    [13292692]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Сергей Васкецов
А у каких-то других СУБД есть запрет на создание такого логина? )))


Спасибо, кэп, нет.
9 окт 12, 21:19    [13292701]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54850

Сергей Васкецов
Выше пример коннекта на перле.

И что? Тебе тупо лень поискать в документации по DBI аналогичную функцию?..

Posted via ActualForum NNTP Server 1.5

9 окт 12, 21:25    [13292711]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
Dimitry Sibiryakov
Тебе тупо лень поискать в документации по DBI аналогичную функцию?..

Не-а, задача немного другая )))
9 окт 12, 21:29    [13292722]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Сергей Васкецов
Тебе тупо лень поискать в документации по DBI аналогичную функцию?..

Не-а, задача немного другая )))[/quot]

Тогда только запросы, котоые гарантированно выполняться только на одной из СУБД, которые бы возвращали для "правильной" СУБД всю необходимую информацию.
9 окт 12, 21:36    [13292742]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
pkarklin
Тогда только запросы, котоые гарантированно выполняться только на одной из СУБД

Кэп подказывает про select @@version )))
И я даже ещё не уверен, что у каких-нить постгресов или DB2 нет своего дополнительного формата комментариев. На этом тоже можно было бы попробовать сыграть. Я ж не со всеми работал, ща вот маны штудирую под пиво ))
9 окт 12, 22:06    [13292817]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Сергей Васкецов
Кэп подказывает про select @@version )))
И я даже ещё не уверен, что у каких-нить постгресов или DB2 нет своего дополнительного формата комментариев. На этом тоже можно было бы попробовать сыграть. Я ж не со всеми работал, ща вот маны штудирую под пиво ))


Я тоже не совсеми. select @@version прокатит точно на MS SQL и Sybase.
9 окт 12, 22:10    [13292826]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Gallagher
Member

Откуда: ( ͡°◞ʖ◟ ͡°)
Сообщений: 542
Для этого нужно знать/выбрать несколько специфичных фич, которые работают по разному в разных субд.
Первое что приходит на ум, проверить как работает MVCC, установив пару сессий. Можно определить поддерживаемые режимы изоляции транзакций (скорее всего один, дефолтовый, который будет выставлен на сессию через ODBC драйвер, если не указано иного). Но многое из этого, насколько мне известно, будет варьировать даже в пределах одной СУБД в зависимости от выбранного storage backend'а.
Второе, что приходит - покрутить запросики, но опять таки, ODBC драйвер скорее всего будет работать в режиме совместимости ANSI XY и зарезать любой SQL выпадающий из него. Если же ODBC драйвер тупо проксирует текст запроса без синтаксических проверок, то можно погонять какой-нибудь database-specific sql, как например select без from для mySQL или наличие dual для Oracle.
9 окт 12, 22:15    [13292839]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Gallagher
Member

Откуда: ( ͡°◞ʖ◟ ͡°)
Сообщений: 542
Самым типичным мерилом будут различия в наличии/поведении скалярных функций. Для этого нужно создать табличку, опционально налить данных и погонять простой запрос с разными специфичными функциями
9 окт 12, 22:19    [13292843]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Gallagher
Member

Откуда: ( ͡°◞ʖ◟ ͡°)
Сообщений: 542
Еще, зная физические ограничения (если не жалко времени сразу после установления соединения) можно посоздавать структуры критических размеров (кол-во полей, типы данных) и тп. Но это уже за гранью DML.
9 окт 12, 22:23    [13292853]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
Gallagher, нужно что-то сильно проще.
Как вариант до которого допетрил - это при генерации скриптов из модели сделать что-то типа
select @@version as v
into DUAL

ну обломается - и хрен бы с ним.
Зато будет реальная польза от SELECT * FROM DUAL
9 окт 12, 22:37    [13292891]     Ответить | Цитировать Сообщить модератору
 Re: Определить типа сервера БД запросом(ами)  [new]
Сергей Васкецов
Member

Откуда:
Сообщений: 20362
Для MySQL раскопал вот что, типа код внутри /*!1 */ отработает начиная с версии 1:
SELECT /*!1 'mysql' as f, */ * from DUAL

зы. есичо - не проверял )))
9 окт 12, 23:17    [13292974]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить