Как подключиться к БД MSSQL?

Обсуждение вопросов и решений

Модератор: ykolesnikov

Ответить
VARD32
OTRS Новобранец
Сообщения: 55
Зарегистрирован: 09 фев 2017, 15:18

Как подключиться к БД MSSQL?

Сообщение VARD32 » 17 фев 2017, 13:38

Здравствуйте.

Есть сервер в домене, на котором крутится MSSQL. Как мне подключиться к этому серверу чтобы сделать SELECT из нужной мне таблицы?

PS: Как сделать SELECT я знаю, не понятно как подключиться к другому серверу, указать его имя и базу данных, чтобы потом с ним можно было работать.

Спасибо.

paver
OTRS Мастер
Сообщения: 507
Зарегистрирован: 22 апр 2015, 06:45
Откуда: Томск
Благодарил (а): 7 раз
Поблагодарили: 45 раз

Re: Как подключиться к БД MSSQL?

Сообщение paver » 17 фев 2017, 14:29

--
OTRS 6.0.22

VARD32
OTRS Новобранец
Сообщения: 55
Зарегистрирован: 09 фев 2017, 15:18

Re: Как подключиться к БД MSSQL?

Сообщение VARD32 » 17 фев 2017, 14:32

мне нужно подключение к MSSQL (не MySQL).
Причем не пересатить OTRS на MSSQL а просто сделать выборку нужных мне данных с удаленного MSSQL сервера. Но из OTRS!

mukexa
OTRS Новобранец
Сообщения: 148
Зарегистрирован: 30 апр 2013, 19:08
Откуда: Украина, Киев.
Поблагодарили: 1 раз

Re: Как подключиться к БД MSSQL?

Сообщение mukexa » 20 фев 2017, 14:06

мне нужно подключение к MSSQL (не MySQL).
Причем не пересатить OTRS на MSSQL а просто сделать выборку нужных мне данных с удаленного MSSQL сервера. Но из OTRS!

Код: Выделить всё

use DBI;
OTRS 5s, Ubuntu 12.04

alexus
OTRS Гуру
Сообщения: 5192
Зарегистрирован: 20 сен 2010, 18:17
Откуда: Москва
Благодарил (а): 92 раза
Поблагодарили: 82 раза

Re: Как подключиться к БД MSSQL?

Сообщение alexus » 20 фев 2017, 14:16

mukexa писал(а):
мне нужно подключение к MSSQL (не MySQL).
Причем не пересатить OTRS на MSSQL а просто сделать выборку нужных мне данных с удаленного MSSQL сервера. Но из OTRS!

Код: Выделить всё

use DBI;
Судя по постановке вопроса, Ваш ответ не сильно поможет )))))
С уважением,
Алексей Юсов

Prod: OTRS CE ITSM 6.0.28 on CentOS 7 Apache 2.4 MariaDB 10.4.13 + Radiant Customer Portal

Radiant System OTRS Intergrator RU
Группа OTRS Community в Teleram
Хотите внедрить OTRS? Спросите меня как!

N_ton
OTRS Новобранец
Сообщения: 108
Зарегистрирован: 09 авг 2012, 22:57
Откуда: Санкт-Петербург
Благодарил (а): 1 раз
Контактная информация:

Re: Как подключиться к БД MSSQL?

Сообщение N_ton » 21 фев 2017, 13:45

1. Нужен драйвер для ODBC под Linux.
2. в перловом модуле:
my $driver1 = 'ODBC Driver 13 for SQL Server';
my $database = '********';
my $dsn = 'DBI:ODBC:**********';
my $userid = '***';
my $password = '*******';
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr; # коннекция с БД
my $sth = $dbh->prepare('SELECT ****** FROM table WHERE email = ?'); # запрос
$sth->bind_param( 1, $Address ); # параметр запроса
$sth->execute( $Address ) or die $DBI::errstr;
3. далее по результатам запроса и целям.
OTRS 3.3.8, Debian 7, PostgreSQL 9.1.13
OTRS 4.0.17, Debian 8, MySQL + MSSQL

VARD32
OTRS Новобранец
Сообщения: 55
Зарегистрирован: 09 фев 2017, 15:18

Re: Как подключиться к БД MSSQL?

Сообщение VARD32 » 21 фев 2017, 19:33

вооооооотт...
в развитие темы добавлю - у меня получилось подключиться к мсскл.
И даже вызвать хранимую процедуру с параметрами. Всё отрабатывает как надо.

Но есть проблема: я не могу из хранимой процедуры получить один ВЫходной параметр. Там должен возвращаться Id-шник задачи.

Пробовал так:

Код: Выделить всё

my $sth = $dbh->prepare("exec my_proc \@p1 = ?, \@p2 = ?, \@p3 = ? OUTPUT ");
$sth->execute('one', 'two', 'three');
my (@data) = $sth->syb_output_params();
Не работает. Точнее вываливается с ошибкой типа: my_proc ожидает параметр param1 и не получает его. И т.д. по остальному списку.
Пробовал в разных позах - не работает.

Инфу с примерами брал отсюда: https://metacpan.org/pod/DBD::Sybase#Ca ... Procedures

Artjoms
OTRS Новобранец
Сообщения: 34
Зарегистрирован: 06 окт 2011, 17:36
Откуда: Latvija

Re: Как подключиться к БД MSSQL?

Сообщение Artjoms » 24 фев 2017, 15:10

Если честно, то не лучший вариант поддерживать 2 DB соединения - и со стороны производительности, и со стороны безопасности, и со стороны создания Upgrade-safe решений.

По-моему, более правильно на машине с MSSQL создать Web-Service отдающий необходимые данные и использовать в OTRS спомощью GenericInterface ( http://doc.otrs.com/doc/manual/admin/5. ... .6.12.4.10 )

Если же решите оставить текущее решение ( эхх... ) то используйте следующую форму вызова Stored Procedure (предполагаю, что используете Sybase driver):

Код: Выделить всё

my $sth = $dbh->prepare("exec my_proc ");

$sth->bind_param("p1",'one');
$sth->bind_param("p2",'two');
$sth->bind_param("p3","three");
my $result;
$sth->bind_inout_param("out1",\$result);
$sth->execute();

# output the value or do anything else
echo $result;

# cleanup resources after yourself.
$sth=undef;
$dbh->disconnect;
Smile :)
----------------------------------------
Artjoms Petrovs
System Analyst / Системный Аналитик
Software Developer / Разработчик Информационных Систем
----------------------------------------
OTRS 5 Patch Level 9

VARD32
OTRS Новобранец
Сообщения: 55
Зарегистрирован: 09 фев 2017, 15:18

Re: Как подключиться к БД MSSQL?

Сообщение VARD32 » 24 фев 2017, 17:05

Спасибо Вам.
А названия параметров p1, p2 и т.д. должны совпадать с названиями параметров из хранимой процедуры?

Artjoms
OTRS Новобранец
Сообщения: 34
Зарегистрирован: 06 окт 2011, 17:36
Откуда: Latvija

Re: Как подключиться к БД MSSQL?

Сообщение Artjoms » 24 фев 2017, 22:27

Да, конечно.

К примеру

Код: Выделить всё

create procedure testproc @p1 int, @p2 int, @p3 int, @out1 int output as
        select @out1=@p1+@p2+@p3
Smile :)
----------------------------------------
Artjoms Petrovs
System Analyst / Системный Аналитик
Software Developer / Разработчик Информационных Систем
----------------------------------------
OTRS 5 Patch Level 9

VARD32
OTRS Новобранец
Сообщения: 55
Зарегистрирован: 09 фев 2017, 15:18

Re: Как подключиться к БД MSSQL?

Сообщение VARD32 » 24 фев 2017, 22:50

К сожалению, по прежнему не могу получить выходной параметр. Что то с ним не так, или я что-то не так делаю.

Код: Выделить всё

    my $sth = $dbh->prepare('exec dbo.create_task \@task_parent_id=?, \@task_name=?, \@record_comment=?, \@attachment_data=?, \@attachment_name=?, \@task_performer_id=?, \@task_priority=?, \@task_product_id=?, \@registration_number=?, \@task_id=? OUTPUT');    
    
    $sth->bind_param(1, 254957);
    $sth->bind_param(2, '#100066');
    $sth->bind_param(3, '');
    $sth->bind_param(4, undef);
    $sth->bind_param(5, '');
    $sth->bind_param(6, 683);
    $sth->bind_param(7, 'C');
    $sth->bind_param(8, 1);
    $sth->bind_param(9, 100066);

    my $result = 0;
    $sth->bind_param_inout(10, \$result, 0);
        
    $sth->execute;
    print "\n"."task_id = ".$result."\n";
И тишина... не могу получить task_id.. хоть убей... ((
т.е. Входные параметры точно передаются корректно. Хранимая процедура, по их значениям, создает объект правильно, но на выходе ничего не возвращает. Или возвращает, но я не могу правильно это забрать. Бьюсь уже который день.

Artjoms
OTRS Новобранец
Сообщения: 34
Зарегистрирован: 06 окт 2011, 17:36
Откуда: Latvija

Re: Как подключиться к БД MSSQL?

Сообщение Artjoms » 24 фев 2017, 23:24

Может проблема не в запросе, а в stored procedure?

Можете запостить ее сюда?

К слову несколько комментариев о запросе:

1) Нет смысла двойного bind'a

Код: Выделить всё

   \@task_parent_id=?, ...
    $sth->bind_param(1, 254957);
достаточно

Код: Выделить всё

$sth->bind_param("task_parent_id",'254954');
Притом, если в stored pocedure указан исходящий параметр, то не стоит указывать в exec ( OUTPUT )
Smile :)
----------------------------------------
Artjoms Petrovs
System Analyst / Системный Аналитик
Software Developer / Разработчик Информационных Систем
----------------------------------------
OTRS 5 Patch Level 9

alexus
OTRS Гуру
Сообщения: 5192
Зарегистрирован: 20 сен 2010, 18:17
Откуда: Москва
Благодарил (а): 92 раза
Поблагодарили: 82 раза

Re: Как подключиться к БД MSSQL?

Сообщение alexus » 24 фев 2017, 23:30

"Тут у нас такие гости - украшение компаний" )))))
Артём, привет :) !
По сути теперь задам вопрос, но немного в сторону. Что за задача дикая такая, чтобы из внешней системы task_id получать хранимой процедурой :? Может дело не в бобине вообще.
И с точки зрения секьюрности так же соглашусь с Артёмом - из внешней системы разрешать запуск процедур очень нехорошо.
Мне кажется, мы имеем в наличии архитектурно кривую поставку задачи и, как следствие, попытки решения.
С уважением,
Алексей Юсов

Prod: OTRS CE ITSM 6.0.28 on CentOS 7 Apache 2.4 MariaDB 10.4.13 + Radiant Customer Portal

Radiant System OTRS Intergrator RU
Группа OTRS Community в Teleram
Хотите внедрить OTRS? Спросите меня как!

VARD32
OTRS Новобранец
Сообщения: 55
Зарегистрирован: 09 фев 2017, 15:18

Re: Как подключиться к БД MSSQL?

Сообщение VARD32 » 25 фев 2017, 06:40

Здравствуйте.

1) Нет смысла двойного bind'a
достаточно

Код: Выделить всё

$sth->bind_param("task_parent_id",'254954');
Дело в том, что предложенный Вами вариант, в таком виде не работает.
Perl выдает ошибку из серии: stored procedure or function dbo.create_task cant locate parameter @task_parent_id with supplied value... и т.д.

Работет если указать сразу в exec-выражении с именем хп и параметрами. Но проблема по прежнему остается: я не могу получить выходной параметр процедуры.

также пробовал и с OUTPUT и без него - реакция та же самая.

Причем, если указать 9 in-параметров, и пропустить 10-ый inout-параметр, то всё отрабатывает без ошибок. Но task_id я так и не могу получить.


Если кратко, она создает в БД объект "задачу", частью имени которой является номер (создаваемый этой хранимой процедурой). Вот этот номер то мне и нужно получить.
т.е. вариант, что хп работает как-то не правильно, думаю, можно, отмести. Я сам вижу созданную задачу со сгенерированным номером.

Artjoms
OTRS Новобранец
Сообщения: 34
Зарегистрирован: 06 окт 2011, 17:36
Откуда: Latvija

Re: Как подключиться к БД MSSQL?

Сообщение Artjoms » 27 фев 2017, 17:35

И снова попрошу предоставить тело Хранимой процедуры :) Если запрос не отрабатывает, то возможно процедура объявлена некорректно.

А пока могу предложить статью, где описано, как создать REST service для вызова SP на Microsoft SQL Server
Smile :)
----------------------------------------
Artjoms Petrovs
System Analyst / Системный Аналитик
Software Developer / Разработчик Информационных Систем
----------------------------------------
OTRS 5 Patch Level 9

Ответить