Достаточно часто встречающаяся задача — сделать dblink из Oracle в MS SQL.
В качестве OS для базы используется OEL 5.6 x86_64, в котором уже установлен UnixODBC. Если его нет — качаем с http://www.unixodbc.org/ и устанавливаем.
База данных Oracle 11g, MS SQL 2000.

Важное отступление: если у вас версия Oracle RDBMS 9i или 10g, настроить в 64-х битной
системе гетерогенный сервис даже с помощью техподдержки Oracle у меня не получилось — ставьте рядом софт Oracle 11g(без базы) и сконфигурируйте прослушиватель именно в нем.
Устанавливаем переменные окружения для FreeTDS под пользователем oracle:
$echo ‘export SYBASE=/usr/local/freetds-0.82’ >> /etc/bashrc
$echo ‘export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$SYBASE/lib’ >> /etc/bashrc
$echo ‘export ODBCINI=/etc/odbc.ini’ >> /etc/bashrc
$echo ‘export ODBCSYSINI=/etc’ >> /etc/bashrc

Скачиваем сам FreeTDS и разархивируем:
$cd /usr/local/src/
$wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz
$tar zxvf freetds-stable.tgz
$cd freetds-0.82/

Конфигурируем и компилируем:
$./configure —prefix=/usr/local/freetds-0.82 —with-tdsver=8.0 —with-unixodbc=/usr/
$make
$make install
$echo ‘/usr/local/freetds-0.82/lib’ >> /etc/ld.so.conf
$ldconfig

В файл /usr/local/freetds-0.82/etc/freetds.conf вставляем секцию:
[172.16.0.1] — имя секции, сюда будет ссылка из конфигурации ODBC для загрузки настроек
host = 172.16.0.1 — хост или IP-адрес MS SQL сервера
port = 1433 — порт MS SQL сервера
tds version = 8.0 — используемая версия TDS протокола (у меня MS SQL 2000)
client charset = cp1251 — кодировка для использования

Создаем темплейт freetds.driver.template со следующим содержимым:
—freetds.driver.template—
[FreeTDS] — имя драйвера DSN
Description=FreeTDS unixODBC Driver — описание драйвера
Driver= /usr/local/freetds-0.82/lib/libtdsodbc.so — путь к библиотеке драйвера
Setup= /usr/lib64/libodbc.so — путь к библиотеке ODBC(обращайте внимание на разрядность)
UsageCount=1
—freetds.driver.template—
и из шелла регистрируем его:
$odbcinst -i -d -f freetds.driver.template

Создаем темплейт mssql.datasource.template на базу данных со следующим содержимым:
— mssql.datasource.template—
[mssql] — имя ODBC-соединения
Driver=FreeTDS — здесь указываем используемый драйвер
Description=mssql — описание, если нужно
TDS_Version = 8.0 — тут тоже можно указать версию TDS протокола. Если они будет отличаться с настройками в freetds.conf, будут использоваться отсюда
Trace=No — включение трассировки
ServerName=172,16,10,1 — имя сервера в конфигурационном файле freetds
Port=1433 — порт для соединения
Database=data1 — база данные для соединения
UID=user — имя пользователя для соединения с БД
PWD=poassword — пароль для соединения с БД
— mssql.datasource.template—
и регистрируем его:
$odbcinst -i -s -f mssql.datasource.template –l

Если на сервере MSSQL два инстанса, то согласно документации можно указать параметр
Instance = SQL2005 для выбора конкретного инстанса, но у меня данная конфигурация не заработала — Win2000 Server + MSSQL2000 + MSSQL2005. Пришлось узнать на какой порт вешается второй инстанс MSSQL2005 и только прописав этот порт в конфигурации odbc.ini подключение прошло.
ODBC настроен, проверить можно следующим образом:
$echo «select @@Version» | isql mssql login password
+——————————+
| Connected! |
| sql-statement |
| help [tablename] |
| quit |
| |
+——————————+
SQL>
Microsoft SQL Server 2000 — 8.00.2055 (Intel X86)
Dec 16 2008 19:46:53
Copyright (c) 1988-2003 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
SQLRowCount returns 1
1 rows fetched
Теперь начинаем настраивать сам гетерогенный сервис и dblink.
В $ORACLE_HOME/network/admin/tnsnames.ora вставляем:
MSSQL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost )(PORT = 1521))
)
(CONNECT_DATA =
(SID= mssql)
)
(HS=OK)
)
В $ORACLE_HOME/network/admin/listener.ora вставляем в конфиг прослушивателя секцию:
SID_LIST_LISTENER =
…………………………….
(SID_DESC =
(PROGRAM = dg4odbc)
(ORACLE_HOME = /opt/oracle/product/11.2.0/dbhome_1)
(SID_NAME = mssql)
(ENVS=»LD_LIBRARY_PATH = /usr/local/freetds-0.82/lib:/lib64:/usr/lib64:/opt/oracle/product/11.2.0/dbhome_1/lib»)
)
………………………………..
)

В $ORACLE_HOME/hs/admin создаем файл initmssql.ora и вставляем:
HS_FDS_CONNECT_INFO = mssql — имя
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so — путь к библиотеке UnixODBC
HS_FDS_SQLLEN_INTERPRETATION=64 — зависит от разрядности системы
HS_LANGUAGE = AMERICAN_AMERICA.CL8MSWIN1251 — указываем кодировку
set ODBCINI=/etc/odbc.ini

Рестартуем листенер:
$lsnrctrl stop
$lsnrctrl start
Создаем dblink и проверяем его работоспособность:
$sqlplus /nolog
SQL>conn test/test@testdb
create public database link mssql connect to user identified by password using ‘mssql’;
select count(*) from testtable@mssql;
COUNT(*)
———-
2

Готово, можно пользоваться )