{{tag>databases postgres postgresql macos homebrew}}

====== PostrgeSQL - Установка и настройка ======

===== Установка =====

    * $ sudo apt-get install postgresql postgresql-contrib
    * $ passwd postgres
    * $ sudo su - postgres
    * $ psql postgres

==== Homebrew plst ====

nano /usr/local/Cellar/postgresql-9.4/9.4.5/homebrew.mxcl.postgresql.plist
<code xml>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>KeepAlive</key>
  <true/>
  <key>Label</key>
  <string>homebrew.mxcl.postgresql.plist</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/Cellar/postgresql-9.4/9.4.5/bin/postgres</string>
    <string>-D</string>
    <string>/usr/local/var/postgres</string>
    <string>-r</string>
    <string>/usr/local/var/postgres/server.log</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
  <key>WorkingDirectory</key>
  <string>/usr/local/var</string>
  <key>StandardErrorPath</key>
  <string>/usr/local/var/postgres/server.log</string>
</dict>
</plist>
</code>
==== Настройка доступа ====

Не безопасно, даем внешний доступ для IP **192.168.1.1** ([[:networks#маски|можно использовать маски сети]])
Для подключения извне, также необходимо включить прослушивания внешнего IP \\ 
в настройках **/etc/postgresql/X.Y/main/postgresql.conf**


**nano /etc/postgresql/X.Y/main/pg_hba.conf**
<code>
# Database administrative login by Unix domain socket
#local   all             postgres                                peer

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
#local   all             all                                     peer
# IPv4 local connections:
#host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
#host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     peer
host    replication     all             127.0.0.1/32            md5
host    replication     all             ::1/128                 md5

local   all             all                                     trust
host    all             all             ::1/128                 trust
host    all             all             127.0.0.1/32            trust
host    all             all             192.168.1.1/32             trust
</code>

<note important>Последующие записи не переобозначают предыдущие.\\ Предыдущие однотипные записи должны быть закомментированы \\
Это однотипные записи \\
<code>
#local   all             all                                     peer
local   all             all                                     trust
</code>
</note>

  * ADDRESS - [[:networks#маски|Соответсвует маске]]
  * METHOD - Метод-аутентификации
=== методы аутентификации ===

**trust** \\
Разрешает безусловное подключение. Этот метод позволяет тому, кто может подключиться к серверу с базой данных Postgres Pro, войти под любым желаемым пользователем Postgres Pro без введения пароля и без какой-либо другой аутентификации.\\
**ident** \\
Получает имя пользователя операционной системы клиента, связываясь с сервером Ident, и проверяет, соответствует ли оно имени пользователя базы данных. Аутентификация ident может использоваться только для подключений по TCP/IP. Для локальных подключений применяется аутентификация peer \\
**peer** \\
Получает имя пользователя операционной системы клиента из операционной системы и проверяет, соответствует ли оно имени пользователя запрашиваемой базы данных. Доступно только для локальных подключений. \\
**md5** \\
**scram-sha-256** \\
Проверяет пароль пользователя, производя аутентификацию SCRAM-SHA-256 или MD5.  \\

[[https://postgrespro.ru/docs/postgrespro/10/auth-pg-hba-conf.html|Подробнее...]]
=== Проверка доступа ===


<code bash>
$ psql -U postgres -h localhost
$ psql -U postgres
</code>

===== Вопрос/Ответ =====

==== Пользователи ====

  * **Как создать пользователя в PostgreSQL?**
  * CREATE USER ramesh WITH password ‘tmppassword’;

  * **Как посмотреть список пользователей?**
  * SELECT * FROM pg_shadow;

  * **Как сменить пароль у пользователя?**
  * ALTER USER postgres WITH PASSWORD 'password';

=== Смена пароля ===

Включаем однопользовательский режим nano /usr/local/opt/postgresql/pg_hba.conf
<code>
local   all             all                                     trust
</code>

  * подключаемся к бд, указывая локального пользователя (в моем случае mirocow)
  * меняем пароль у пользователя mirocow

включаем многопользовательский режим
добавляем строчку в nano /usr/local/opt/postgresql/pg_hba.conf
<code>
local   all         postgres                          password
</code>

==== Права ====

=== Смена прав ===

  * ALTER TABLE sequence_name OWNER TO владелец

==== Привелегии ====

  * **Как посмотреть привелегии пользователя?**
  * <code>
SELECT n.nspname as "Схема", 
c.relname as "Таблица", 
c.relacl as "Привилегии доступа" 
FROM pg_catalog.pg_class c 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE c.relkind IN ('r', 'v', 'S') 
AND pg_catalog.pg_table_is_visible(c.oid) /*AND n.nspname !~ '^pg_'*/ 
ORDER BY 1, 2;
</code>

  * **Как дать привелегии**
  * GRANT ALL ON DATABASE demodb TO demo;

==== Базы ====

  * **Как создать базу в PostgreSQL?**
  * CREATE DATABASE mydb WITH OWNER ramesh;

  * **Как удалить базу в PostgreSQL?**
  * DROP DATABASE mydb;

  * **Как получить весь список баз в Postgresql?**
  * SELECT datname FROM pg_database;
  * SELECT * FROM pg_database;

==== Таблицы ====


  * **Как вывести список всех таблиц?**
  * SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

