質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

1443閲覧

postgresからSQLサーバーのデータを参照したいがAdaptive Server is unavailable or does not existとなる

mmkkmm

総合スコア103

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2023/03/10 10:51

編集2023/03/10 11:15

実現したいこと

postgresからtds_fdwでSQLサーバーのデータを参照したい。

前提

全てイントラ内の話なのですが、CentOS7(192.168.10.1)上のpostgres14から、別の場所にあるSQLサーバーのデータを参照したく、CentOS7側にtds_fdwをインストールし、CREATE EXTENSION tds_fdw;しました。

参照したいSQLサーバーは2台。
①192.168.20.2:インスタンス1つ(MSSQLSERVER)
②192.168.30.3:インスタンス2つ(SQLSVRABCDEFG,SQLSVRHIJKLM)

現在、①には無事postgres(192.168.10.1)から接続出来たのですが、
②については、postgres内に作成した外部表をセレクトしようとすると、以下エラーとなってしまいます。どなたか、解決に向けてこういうこと調べるといいよ、など、アドバイスをいただけましたら幸いです…。

発生している問題・エラーメッセージ

mypgdb=# select count(*) from mssql_fdw_ng1_dbo_顧客種別 ; ERROR: DB-Library error: DB #: 20009, DB Msg: Unable to connect: Adaptive Server is unavailable or does not exist (192.168.30.3\SQLSVRHIJKLM), OS #: 0, OS Msg: 成功です, Level: 9

該当のソースコード

shell

1Last login: Fri Mar 10 13:40:02 2023 from myWinPC.my-company.local 2[root@myCentOS7 ~]# tsql -LH 192.168.20.2 3 ServerName DCSVDB01 4 InstanceName MSSQLSERVER 5 IsClustered No 6 Version 12.0.5000.0 7 tcp 1433 8 np \\DCSVDB01\pipe\sql\query 9[root@myCentOS7 ~]# psql -h192.168.10.1 -Upostgres -W mypgdb 10ユーザ postgres のパスワード: 11psql (9.2.24, サーバー 14.7) 12注意: psql バージョン 9.2, サーバーバージョン 14.0. 13 psql の機能の中で、動作しないものがあるかもしれません。 14"help" でヘルプを表示します. 15 16mypgdb=# CREATE SERVER mssql_fdw_ok1 FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername '192.168.20.2', port '1433', database 'oksqlsvdbname'); 17CREATE SERVER 18mypgdb=# CREATE USER MAPPING FOR postgres SERVER mssql_fdw_ok1 OPTIONS (username 'oksqlsvusername', password 'oksqlsvpass'); 19CREATE USER MAPPING 20mypgdb=# grant usage on foreign server mssql_fdw_ok1 to postgres; 21GRANT 22mypgdb=# CREATE FOREIGN TABLE mssql_fdw_ok1_common_staff ( 23mypgdb(# "staff_cd" varchar(16) not null, 24mypgdb(# "staff_name" varchar(20) 25mypgdb(# ) 26mypgdb-# SERVER mssql_fdw_ok1 27mypgdb-# OPTIONS (query 'SELECT staff_cd, staff_name FROM common.staff'); 28CREATE FOREIGN TABLE 29mypgdb=# select count(*) from mssql_fdw_ok1_common_staff ; 30NOTICE: tds_fdw: Query executed correctly 31NOTICE: tds_fdw: Getting results 32WARNING: Table definition mismatch: Foreign source has column named staff_cd, but target table does not. Column will be ignored. 33WARNING: Table definition mismatch: Foreign source has column named staff_name, but target table does not. Column will be ignored. 34 count 35------- 36 10 37(1) 38 39mypgdb=# \q 40[root@myCentOS7 ~]# tsql -LH 192.168.30.3 41 ServerName HNSDB01 42 InstanceName SQLSVRABCDEFG 43 IsClustered No 44 Version 15.0.2000.5 45 tcp 51214 46 47 ServerName HNSDB01 48 InstanceName SQLSVRHIJKLM 49 IsClustered No 50 Version 15.0.2000.5 51 tcp 51267 52[root@myCentOS7 ~]# psql -h192.168.10.1 -Upostgres -W mypgdb 53 54mypgdb=# CREATE SERVER mssql_fdw_ng1 FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername '192.168.30.3\SQLSVRHIJKLM', port '51267', database 'ngsqlsvdbname'); 55CREATE SERVER 56mypgdb=# CREATE USER MAPPING FOR postgres SERVER mssql_fdw_ng1 OPTIONS (username 'ngsqlsvusername', password 'ngsqlsvpass'); 57CREATE USER MAPPING 58mypgdb=# grant usage on foreign server mssql_fdw_ng1 to postgres; 59GRANT 60mypgdb=# CREATE FOREIGN TABLE mssql_fdw_ng1_dbo_顧客種別 ( 61mypgdb(# "顧客種別ID" int, 62mypgdb(# "顧客種別" varchar(50) 63mypgdb(# ) 64mypgdb-# SERVER mssql_fdw_ng1 65mypgdb-# OPTIONS (query 'SELECT "顧客種別ID", "顧客種別" FROM dbo.顧客種別'); 66CREATE FOREIGN TABLE 67mypgdb=# select count(*) from mssql_fdw_ng1_dbo_顧客種別 ; 68ERROR: DB-Library error: DB #: 20009, DB Msg: Unable to connect: Adaptive Server is unavailable or does not exist (192.168.30.3\SQLSVRHIJKLM), OS #: 0, OS Msg: 成功です, Level: 9 69mypgdb=# \q 70[root@myCentOS7 ~]# tsql -H '192.168.30.3\SQLSVRHIJKLM' -p 51267 -U ngsqlsvusername -P ngsqlsvpass 71locale is "ja_JP.UTF-8" 72locale charset is "UTF-8" 73using default charset "UTF-8" 741> USE ngsqlsvdbname 752> select count(*) from 顧客種別 763> go 77 7810 79(1 row affected) 801> 812> quit 82[root@myCentOS7 ~]# sqlcmd -S '192.168.30.3\SQLSVRHIJKLM' -U ngsqlsvusername -P ngsqlsvpass 831> use [ngsqlsvdbname] 842> select count(*) from dbo.顧客種別 853> go 86データベース コンテキストが 'ngsqlsvdbname' に変更されました。 87 88----------- 89 10 90 91(1 rows affected) 921> 932> quit 94[root@myCentOS7 ~]# 95

試したこと

  • fdwでなくdb_linkは?と調べたが、postgres同士でないとだめみたいだった。

  • エラーメッセージで検索し、HITしたページを読んでいきました。特に一番上に出てきた こちら は入念に読み、内容を確認しました。

  • 接続出来たサーバーのポートは標準の1433で、出来ない方は51267という違いがあることを疑った。CentOSからSQLサーバーに以下が通るので、51267で問題ないと考えた。

shell

1tsql -H '192.168.30.3\SQLSVRHIJKLM' -p 51267 -U ngsqlsvusername -P ngsqlsvpass
  • 念の為、接続出来なかったSQLサーバーのWindowsDefenderファイアウォールに、送受信の規則[TCP51267をパブリック除いて許可]を追加したがだめ。

  • 192.168.30.3\SQLSVRABCDEFG(もう一個のインスタンス)でも試したが、結果は同じだった。

  • 同じCentOS7上のapache上のphpから、pdoでは、'192.168.30.3\SQLSVRHIJKLM'に普通に接続出来ている。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

SQLSVRHIJKLMインスタンスのポートを1433に変更

  1. 接続したいHNSDB01にrdpログイン
  2. SQLサーバー構成マネージャにてSQLサーバーネットワークの構成→SQLSVRHIJKLMのプロトコル
  3. TCP/IP右クリック→プロパティ→プロトコルはすべて受信待ち「はい」なので→IPアドレス→IPALL→TCP動的ポート「51267」削除し、TCPポートに「1433」入力して「適用」
  4. SQLサーバーのサービス→SQLサーバー「SQLSVRHIJKLM」右クリック→再起動

外部サーバー構成定義を変更

  • 前:CREATE SERVER mssql_fdw_ng1 FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername '192.168.30.3 \SQLSVRHIJKLM ', port ' 51267', database 'ngsqlsvdbname');
  • 後:CREATE SERVER mssql_fdw_okninatta FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername '192.168.30.3', port ' 1433', database 'ngsqlsvdbname');

→これでアクセス出来ました。

HNSDB01のもう一つの方のインスタンスに恒常的に同時にアクセスする方法は以前不明だが、同時にアクセス出来なくても、かわりばんこに切り替えながら使えれば当面は大丈夫なので、一旦終了…。'IPアドレス\インスタンス名'が鬼門だったのか、1433以外がサポートされていないのか、なんだったのか…。なお、外部表定義時、SQLサーバー側のセレクトは、ダブコでなく[] にしないとだめだったので、そこは後で修正しました。ここ、セレクト文でなくtable みたいな文法も使えるみたいなので、それ出来るならその方が場合によっては簡潔でいいかも。

投稿2023/03/13 01:11

編集2023/03/13 01:33
mmkkmm

総合スコア103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問