k1LoW/tbls についてまとめ
- PostgreSQL における
detectVirtualRelations
の話。 - 任意のデータベースの public スキーマでは期待通りに機能する。
- 任意のデータベースの public 以外のスキーマでは
- 期待通りに機能しない。設定していない状態時と同様の結果となる。
- dns 設定にて、
options=--search_path%3Dshcema_name
などと指定すると期待通りに機能する。
detectVirtualRelations
の話。options=--search_path%3Dshcema_name
などと指定すると期待通りに機能する。つまりこうだ
psql 'postgres://postgres:password@localhost:5432/db2?sslmode=disable&options=--search_path%3Duser2
これで db2 データベースに user2 スキーマで接続する。
.env
は用意しなかった。5.8. 行セキュリティポリシー を利用することで単一データベースかつ単一スキーマ方式を採用したマルチテナントアーキテクチャをより安全にすることができそうです。
実際にシステムやアプリに組み込む前に、 PostgreSQL の Row Level Security とはそもそもどのような物なのか、手を動かすことで体験いたしました。
本投稿では、その時の動きをまとめます。また、時間が経ってもう一度 PostgreSQL の Row Level Security をおさらいしたくなったり、新たに挙動を確かめたくなったりした時のために、すぐにお試しの環境を作れるように記録を残します。
POSTGRES_INITDB_ARGS
で設定することで、ロケールをなし (C) に設定可能
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --locale=C
POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C"
<= 注意。コッチっは試していない。docker run --rm -it -e POSTGRES_PASSWORD=secret -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=C" postgres:12.2 bash
といった書式になる。docker-php-ext-install pdo_pgsql
を行うこと。以下は、公式ページの例に解説を加えた、シンプルな例です。
CAST(1 || ' month' AS interval)
というようにする。”1″ の部分を引数など、動的にできる。