2022-07-29 意図せず postgres ユーザが owner となっているテーブルを洗い出す

<!-----

Yay, no errors, warnings, or alerts!

Conversion time: 0.379 seconds.


Using this Markdown file:

1. Paste this output into your source file.
2. See the notes and action items below regarding this conversion run.
3. Check the rendered output (headings, lists, code blocks, tables) for proper
   formatting and use a linkchecker before you publish this page.

Conversion notes:

* Docs to Markdown version 1.0β33
* Fri Jul 29 2022 01:59:15 GMT-0700 (PDT)
* Source doc: 2022-07-29 意図せず postgres ユーザが owner となっているテーブルを洗い出す
* Tables are currently converted to HTML tables.
----->

## 前書き

\d コマンドでテーブルの一覧を確認していたら、 owner が postgres になっていたり、アプリケーションユーザになっていたりと秩序のない状態となっていた。

これをアプリケーションユーザに揃えることにした。


```
                               List of relations
 Schema |                      Name                      |   Type   |   Owner
--------+------------------------------------------------+----------+-----------
 public | test1                                          | table    | postgres
 public | test2                                          | table    | user
 public | test3                                          | table    | postgres
 public | test4                                          | table    | user
 public | test5                                          | table    | postgres
 public | test6                                          | table    | postgres
 public | test7                                          | table    | user
```



## 方法

下記のようなコマンドラインを流し込み、一括で変更をかける。


```
echo "select tablename from pg_tables where schemaname = 'public' AND tableowner = 'postgres';" \
| psql -U user -d db -t \
| xargs -I {} echo 'ALTER TABLE {} OWNER TO user;' \
| psql -U user -d db
```


[change table owner postgres Code Example (codegrepper.com)](https://www.codegrepper.com/code-examples/sql/change+table+owner+postgres)


## pg_tables

\d クエリにおいて、where 句を利用した絞り込みは行うことができない。

pg_tables テーブルで似たような情報を得ることができるので、これを利用する。

[What is a PostgreSQL table owner? - Stack Overflow](https://stackoverflow.com/questions/33841647/what-is-a-postgresql-table-owner)

また、 pg_tables にはデータベースシステムの設定情報のテーブルが含まれる。

これのユーザを postgres ユーザから変更したくはないため、 public 名前空間に絞って変換する。


## psql コマンドの -t オプション

これを用いて psql コマンドを実行することで、ヘッダと末尾の行数出力がなくなる。

パイプを使って値を受け渡す際に利用しやすくなる。

[How to turn off header only in psql (postgresql) - Database Administrators Stack Exchange](https://dba.stackexchange.com/questions/24215/how-to-turn-off-header-only-in-psql-postgresql)


## 実行結果の確認

再度 \d を実行し、各テーブルの owner を確認する。

```
                               List of relations
 Schema |                      Name                      |   Type   |   Owner
--------+------------------------------------------------+----------+-----------
 public | test1                                          | table    | user
 public | test2                                          | table    | user
 public | test3                                          | table    | user
 public | test4                                          | table    | user
 public | test5                                          | table    | user
 public | test6                                          | table    | user
 public | test7                                          | table    | user
```