実現したいこと
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'に普通に接続出来ている。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。