PostgresSQLの初期設定

PostgresSQLでの基本操作を説明します。
ほとんど使用しないかもしれませんが、自身の環境で必要だったので備忘録がてら書いていきます。

#ユーザ
PostgresSQLは少し特殊（これが普通かもしれないが）で、ユーザ単体の概念がありません。ユーザもグループもすべてロールという概念で統一されています。
なので、ユーザ（ロール）ぐらいに考えるとちょうど良いと思います。

##ユーザ操作
まず、ユーザの作成方法からみていきます。
ユーザの作成には、CREATE ROLEコマンドを使用します。

```
CREATE ROLE ユーザ名;
```

同様に、ユーザの削除は、DROP ROLEコマンドを使用します。

```
DROP ROLE ユーザ名;
```

今存在するユーザを確認するには、以下のSQLを実行します。

```
SELECT rolname FROM pg_roles;
```

また、psqlプログラムの\duコマンドでもユーザを確認できます。

PostgresSQLでは、初期状態で「postgres」というスーパーユーザが存在しています。
新規にユーザを追加したい場合は、まず、postgresで接続してから追加しないといけません。

##属性
ユーザ（ロール）には、属性を設定することができます。
属性を設定することによって、そのユーザで実行可能なことを設定することができます。

###ログイン
この属性が設定されていないと作成したユーザ（ロール）でログインすることができません。
設定しない場合は、グループという概念のロールということです。
以下のコマンドで生成できます。

```
CREATE ROLE name LOGIN;
CREATE USER name;
```


###データベース作成
データベースを作成するために必要な属性です。
コマンドは以下の通りです。

```
CREATE ROLE name CREATEDB
```

###ユーザ（ロール）作成
ユーザ（ロール）を作成するために必要な属性です。
この属性を持っていると、ユーザの作成、変更、削除を実施できます。
以下のコマンドでユーザ（ロール）作成の属性をもったユーザを作成できます。

```
CREATE ROLE name CREATEROLE
```

###パスワード
データベースに接続するときに、パスワードを要求したい場合に使用します。

```
CREATE ROLE name PASSWORD 'string'
```

また、指定したパスワードを暗号化した保存したい場合は、パスワードの前に「ENCRYPTED」と追記します。
逆に暗号化したくない場合は、「UNENCRYPTED」と記述します。
もし、何も設定しなかった場合、「~data/postgresql.conf」に記述されている「password_encryption」の値によって変わります。


ユーザ（ロール）の属性は、ALTER ROLEコマンドで変更できます。

#データベース

##作成コマンド
データベースの作成は以下のコマンドで実行できます。

```
CREATE DATABASE name;
```

このコマンドを実行したときのユーザ（ロール）が作成したデータベースの所有者になります。
作成後、データベースを削除する権限は所有者にあります。

ここで、このコマンドを実行するためにどのデータベースに接続たら良いのかと思うと思います。
PostgresSQLでは初期化時に「postgres」という名称のデータベースが必ず作成されます。
なので、任意のデータベースを作成したい場合は、このpostgresに接続してから実施してください。
また、postgres以外にも初期時に「template1」というデータベースが作成されます。
このデータベースはテンプレートデータベースと呼ばれ、
template1に変更を与えると、その後に作成されるデータベースすべてにその変更が反映されるようになってます。
新しく作成するデータベースすべてに反映させたい内容が存在しない限りtemplate1内にオブジェクトを作成しないようにしましょう。

ちなみにデータベースの作成は、シェルからcreatedbを実行して行うことができます。

```
>createdb データベース名
```

##テンプレートデータベース
CREATE DATABASEのコマンドでは、データベースを新規に作成しているわけではなくデフォルトのデータベースをコピーして作成しています。
そのコピー元となるデータベースをテンプレートデータベースと呼んでいます。デフォルトでは、「template1」というデータベースがそれにあたります。
作成するデータベースに共通の何かを設定したい場合に、このテンプレートデータベースに設定をしておくと
以降に作成するデータベースにその設定を個別に設定しなくてもよくなります。
また、データベースを作成するときに明示的にテンプレートデータベースを指定するには以下のコマンドを実行します。

```
CREATE DATABASE dbname TEMPLATE template名;
```


#権限
ユーザが持つことができるオブジェクトに対する権限を紹介したいと思います。

##権限の付与、はく奪方法
権限を付与するには、GRANTコマンドを使用します。
また、権限の取り消しは、REVOKEコマンドを使用します。

```
GRANT UPDATE ON accounts TO joe;
REVOKE INSERT ON accounts FROM joe;
```

この例では、joeというロールに対してacconutsテーブルのUPDATE権限を付与しています。
また、joeというロールに対してacconutsテーブルのINSERT権限を取り消しています。
基本的に、権限を付与することが可能なのは、オブジェクトの所有者もしくはスーパーユーザだけですが
GRANT時に「with grant option」を付けることで権限を付与されたユーザが他のユーザに権限を付与することが可能になります。

##権限の種類
###SELECT
指定したテーブル、ビュー、シーケンスの任意の列、行を参照するために必要な権限です。
存在する列の値をUPDATEやDELETEで参照するためにも、この権限は必要です。つまり、DELETE権限、UPDATE権限だけあってもほとんど意味がないということですね。

###INSERT
指定したテーブルに対して行を追加する権限です。

###UPDATE
指定したテーブルに対して更新を行うための権限です。

###DELETE
指定したテーブルに対して削除を行うための権限です。

###TRUNCATE
指定したテーブルに対してTRUNCATEを行うための権限です。

###REFERENCES
外部キー制約を作成するための権限です。

###TRIGGER
指定したテーブル上のトリガの作成を許可する権限です。

###CONNECT
データベースへ接続するための権限です。

###TEMPORARY,TEMP
指定したデータベースの使用中に一時テーブルを作成するための権限です。

###EXECUTE
指定された関数、さらにその関数で実装されている任意の演算子を使用するための権限です。
関数に対する権限は、EXECUTEしかありません。

###USAGE
対象が手続き言語の場合、その言語で関数を作成するための権限です。

###ALL PRIVILEGES
利用可能な全ての権限を一度に付与します。PRIVILEGESキーワードは省略可能です。

#最後に
以上で、PostgresSQLでの初期設定で使用しそうな個所の紹介を終了します。
自身でアプリを作成するときは、アプリから接続する用のユーザを作成して、ログインとパスワードの属性を設定するのがよさそうですね。
データベース作成や、ユーザ作成の属性は、万が一を考えてアプリから接続するユーザには設定しないほうがよいでしょう。
権限系は、必要なものを適時設定したらよいかなと思います。