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 Server PostgreSQLタイプ
少し
小さい
 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. サードパーティのデータラッパーのリスト



All Articles