====== postgresql ======
===== Команды psql =====
''\l'' - список баз данных.
''\c'' dbname - подсоединение к БД dbname.
''\dn'' - список схем
''\dt'' - список всех таблиц.
''\d table'' - структура таблицы table.
''\du'' - список всех пользователей и их привилегий.
''\dt+'' - список всех таблиц с описанием.
''\dt *s*'' - список всех таблиц, содержащих s в имени.
''\i FILE'' - выполнить команды из файла FILE.
''\o FILE'' - сохранить результат запроса в файл FILE.
''\a'' - переключение между режимами вывода: с/без выравнивания.
''\q'' - выход
===== Схема =====
создать схему:
CREATE SCHEMA имя_схемы [ AUTHORIZATION указание_роли ] [ элемент_схемы [ ... ] ]
===== Пользователи и права =====
==== Создание пользователя ====
CREATE USER username WITH PASSWORD 'your_password';
==== Смена пароля ====
ALTER USER user WITH PASSWORD 'password';
==== Ввод хэшированного пароля пароля ====
ALTER USER User WITH ENCRYPTED PASSWORD 'md5788e7531f05a27b36bbb6187d58db2c8';
Где пароль хэшируется алгоритмом 'md5' || md5('Pass' || 'User').
Например, в Python3:
import hashlib
print('md5' + hashlib.md5("PassUser".encode()).hexdigest())
==== Включение пользователя в группу ====
GRANT group TO user;
==== Разрешения ====
=== подключение к БД ===
GRANT CONNECT ON DATABASE database_name TO role_name;
Кроме того, для удалённого подключения с паролем нужно добавить в pg_hba.conf:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
host database_name user_name 192.168.0.1/32 md5
# or for coonect all users to all databases from all ip-addresses:
host all all 0.0.0.0/0 md5
=== использование схемы ===
GRANT USAGE ON SCHEMA schema_name TO role_name;
=== селект в таблице ===
GRANT SELECT ON table_name TO role_name;
=== селект во всех таблицах схемы ===
GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO role_name;
=== разрешение по-умолчанию для новых таблиц схемы ===
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT SELECT ON TABLES TO role_name;
==== Просмотр разрешений ====
SELECT * FROM information_schema.role_table_grants;
===== Примерное количество строк в таблице =====
select n.nspname, c.relname, c.reltuples::bigint
FROM pg_class c
left join pg_namespace n on relnamespace = n.oid
where relname like 'u%'
and n.nspname = 'app'
and relkind = 'r'
order by relname
{{tag> postgresql }}