ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

他社が作ったシステムで、予想外のコーディングをされていてハマる

Windows ServerでWebサーバーとデータベースサーバーが動作しています。
データベースサーバーはPostgreSQLです。

データベースサーバーが分散しているのは不便になったので、1台のサーバーに集約することになりました。
1つのデータベース毎にバックアップして、新しいサーバーでリストアし、接続先を変更したテストプログラムで動作を確認、を繰り返して、順番にデータベースを切り替えていきます。

データベースを切り替えると、動作しないシステムが発生

順調に切り替えを実施していましたが、テストプログラムで正常に動作が確認できないシステムがありました。
どのような経緯でそうなったのかわかりませんが、連絡が取れない他社が作成したシステムを引き継いでいて、そのシステムが正常に動作しませんでした。

Webシステムの設定には、データベースサーバーのアドレス、ポート、ユーザー名、パスワードが定義してあります。
それぞれ定義を変更すると、

Query failed: ERROR: permission denied for relation テーブル名

が表示されます。

検索すると、メッセージの通り、テーブルの権限がないので、GRANTコマンドで権限を与えるとありました。
www.postgresql.jp

データベース
Photo by Campaign Creators on Unsplash

権限があるはずなのにエラーが解消しない

なぜテーブルの権限がないのか、さっぱりわかりません。
データベースに接続はできるけれど、テーブルに対して権限が無いという設定を行ってはいません。
バックアップしてリストアするときに、データベースサーバーのユーザーが違うのが原因なんでしょうか?

GRANTコマンドには、PUBLICキーワードが指定できます。
PUBLICキーワードは、先のドキュメントに

今後作成されるロールを含む、全てのロールへの許可を示します。

とあります。

GRANTコマンドで、PUBLICキーワードをつけて、テーブルへのアクセス権を設定しましたが、状況は変わりませんでした。
なぜ状況が変わらないのか理解ができません。

どうすればいいのかわからず、バックアップからリストアしたデータベースを削除し、データベースとテーブルをを手動で作るときに、OWNERを明示的に指定しても、状況は変わりませんでした。

何をすれば状況が改善するのか、他に思いついたことを試してみましたが、一向に改善しません。

原因はプログラムにあり

プログラム側で特殊な設定をしていないか確認をしていましたが、改めてどのような設定およびコードが書かれているのか確認しました。
設定は間違ってはいません。
コードを改めて見ていくと、データベースサーバーのアドレス、ポートが接続時に指定されるようになっていません。
ユーザー名、パスワードだけ、指定されるようになっていました。

データベースサーバーを切り替えたつもりが、データベースサーバーのアドレスが指定されていないために、ローカルのデータベースに接続をされていました。

データベースサーバーのアドレス、ポートを接続時に指定するように修正をしたら、エラーは解消されました。


定義だけされて未使用だとは思いもしなかったために、解決までに数時間かかってしまいました。
定義だけでなく、定義がどのように使われているのか、ソースコードの確認が必要と学びました。