MS SQL ServerとのPostgreSQL統合

前の記事で 、同僚のDmitry Vasilievが PostgreSQLとMySQLの統合を構成する方法と、いくつかのクエリをより効率的に実行する方法を説明しました。


MS SQL ServerとのPostgreSQL統合


この記事では、Linuxを実行しているPostgreSQLをMS SQL Serverに接続する構成について説明します。 各テーブルの構造を説明せずに、特定のMS SQL ServerデータベーススキーマのすべてのテーブルをPostgreSQLにインポートする方法と同様に。


tds_fdwをインストールして構成する


Tds_fdwは、 PostgreSQLとMS SQL Serverを統合するために使用されます。 このモジュールは、 TDS (Tabular Data Stream)プロトコルを介してデータベースと通信します。 TDSは、MS SQL ServerやSybase SQL ServerなどのDBMSで使用されます。


tds_fdwをビルドしてインストールする前に、 FreeTDSライブラリをインストールする必要があります。 Ubuntuの場合、これらはfreetds-devおよびfreetds-commonパッケージです。


sudo apt-get install freetds-dev freetds-common 

次に、tds_fdwをダウンロードしてビルドします(アセンブリには、インストールされたPostgreSQLとPATH環境変数のpg_configも必要です)。


 git clone https://github.com/tds-fdw/tds_fdw.git cd tds_fdw make USE_PGXS=1 install 

tds_fdwを使用する前に、FreeTDSを構成する必要があります。 MS SQL Serverに接続するためのFreeTDSの構成は、/ etc / freetds / freetds.confファイルを使用して実行されます。 たとえば、次のコンテンツを追加します。


 [mssql01] host = 192.168.0.1 port = 1433 tds version = 7.1 instance = MSSQL01 

これで、PostgreSQLに必要なオブジェクトを作成できます。


 --   CREATE EXTENSION tds_fdw; --  CREATE SERVER sql01 FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername 'mssql01', database 'test_sql01', msg_handler 'notice'); --   CREATE USER MAPPING FOR pguser SERVER sql01 OPTIONS (username 'msuser', password 'userpass'); 

ここで、mssql01はfreetds.conf内のサーバーの名前、pguserはPostgreSQLユーザー、msuserはMS SQL Serverユーザーです。


その後、MS SQL ServerテーブルごとにPostgreSQLで外部テーブルを作成できます。 ただし、代わりにIMPORT FOREIGN SCHEMAコマンドを使用できます。


MS SQL Serverを使用したテーブル定義のインポート


IMPORT FOREIGN SCHEMAチームはPostgreSQL 9.5で実装されました。 oracle_fdw、mysql_fdwなどのサードパーティデータラッパーは、そのサポートを実装しました。 しかし、tds_fdwのサポートはありませんでした。


私たちのプロジェクトの1つでは、tds_fdwにもこのチームのサポートが必要でした。 チームを実装し、 プルリクエストを作成しました。 その日、開発者は喜んでそれを受け取りました。 その前に、彼らはPythonに実装されているテスト用のスクリプトを数時間で修正しました。 テストはPostgreSQL 9.2、9.3、9.4、および9.5で実行されます。 ただし、 IMPORT FOREIGN SCHEMAコマンドはバージョン9.5でのみ追加されました。


これで、次のコマンドを実行できます。


 IMPORT FOREIGN SCHEMA msschema01 FROM SERVER sql01 INTO pgschema01 OPTIONS (import_default 'true'); 

スキームmsschema01およびpgschema01はすでに存在している必要があります。 このコマンドは次のオプションを受け入れます。



テーブル列の説明をインポートする場合、次のタイプマッピングが使用されます。


タイプマッピングテーブル
タイプMS SQL ServerPostgreSQLタイプ
少し
小さい
 tinyint
小さい
 int
整数
ビッグ
ビッグ
 10進数(p [、s])
 10進数(p [、s])
数値(p [、s])
数値(p [、s])
お金
小銭
お金
浮く
 float(n)、ここで25 <= n <= 53
倍精度
本当の
 float(n)、1 <= n <= 24
本当の
日付
日付
日時
 datetime2
小さい
タイムゾーンなしのタイムスタンプ
日時オフセット
タイムゾーン付きのタイムスタンプ
時間
時間
 char(n)
 nchar(n)
 char(n)
 varchar(n)
 nvarchar(n)
 varchar(n)
 varchar(MAX)
テキスト
 ntext
テキスト
バイナリ
 varbinary
画像
 rowversion
タイムスタンプ
バイテア
 xml
 xml

したがって、tds_fdwを使用したデータ移行がはるかに簡単になり、各テーブルを個別にインポートする必要がなくなりました。


ご清聴ありがとうございました!


UPDATE型マッピングテーブルが更新されました。 現在、MS SQL Serverのrowversionおよびtimestampタイプは、PostgreSQLのbyteaタイプに対応しています( commitを参照)。


参照資料


  1. ダウンロードtds_fdw
  2. 外部データラッパーのドキュメント (en)
  3. 外部データラッパーのドキュメント (en)
  4. サードパーティのデータラッパーのリスト


Source: https://habr.com/ru/post/J309490/


All Articles