Запретить пользователям создавать таблицы в табличном пространстве по умолчанию. Пользователь postgresql по умолчанию


Установка и легкая настройка postgresql при помощи консоли для начинающих sevsait.com

Установка и легкая настройка postgresql через консоль и программу yum для начинающих.
Проверяем, установлен ли postgresql, для этого в консоли набираем:
#su root вводим пароль пользователя root # yum info postgresgl
В результате увидим, вывод :

Если вывод выглядит, как у меня на картинке, то postgresql установлен. Если нет «Repo : installed» , то придется установить. Стоит обратить внимание, на то что, если вы устанавливали posgresql вместе с осью сразу, то в некоторых дистрибутивах за вас уже все сделали и инициализировать базу не нужно, пропускаем эти манипуляции ! Остается только настроить под себя, создать пароль на локального пользователя postgres и создать пароль на администратора базы данных postgres, через утилиту «psql», описание процедуры находится ниже. Вернемся к установке, в консоли от root , вводим :
#yum install postgresql #yum install qt3-PostgreSQL
установив все зависимости , yum спросит про установить или нет , отвечаете «Y» , пакеты установятся. В самом низу будет виден результат. Вообще , если есть необходимость использовать весь пакет postgresql, то рекомендую установить его так :
#yum install postgresql* #yum install qt3-PostgreSQL
В результате будет установлены все пакеты, начинающиеся на имя «postgresql» и пакет «qt3-PostgreSQL». Все делается от пользователя root. Убеждаемся всегда о положительном завершении процедуры установки. Теперь у вас проинсталлирован postgresql, но не стоит спешить его запускать, даже если он и запуститься по команде
#service postgresql start
То скорей всего, выдаст ошибку, так как мы еще не создали «template1» базы. От греха подальше перегружаем систему, смотрим, что у нас стартует, выдает ошибки или нет. Убедившись , что установка не внесла проблемных изменений, конфликтов и возвращаемся крутить postgresql дальше. Необходимо инициализировать сервер и базы данных для работы с ними от пользователя postgres.
#su root вводим пароль пользователя root
Переходим в каталог var/lib/pgsql/data , для этого вводим:
#cd /var/lib/pgsql/data/ #ls (вывод имеющихся файлов )
Если в этой папке присутствуют, какие нить файлы, базы данных, то лучше все зачистить, для большей наглядности рекомендую это сделать с помощью файлового менеджера «MC»:
#mc /var/lib/pgsql/data/ Переходим в каталог, выделяем все файлы с помощью клавиши "Insert" и нажимаем "F8".
Если «MC» еще не установлен, то рекомендую его проинсталлировать , так как для начинающего пользователя это палка-выручалка номер один !!! Тем более что установить его не сложно:
#yum install mc (он вам еще пригодится, особенно если не стоит ни каких Х-ов)
Входим в консоль пользователем «postgres», который был автоматически создан при установке и вводим команду создания необходимых файлов баз данных и инициализации сервера.
#su postgres bash-4.1$initdb -D /var/lib/pgsql/data
Получится вывод как на скрине:

Базы данных инициализируются для пользователя «postgres»!!! Не думаю, что вы часто будете сидеть под пользователем «root», это не совсем корректно! После рекомендую запустить «Postgresql» через команду от root:
#service postgresql start
Вывод должен быть положительным ! Так сразу будет ясно, стартанет ли наш сервер при загрузке системы. Добавим в автозагрузку , для наглядности , через команду:

Установим пароль для локального пользователя «postgres»:
Пароль рекомендую установить ! И чем сложней, тем лучше, это поможет вам избежать некоторых проблем с безопасностью! )))
Смена пароля администратора баз данных postgres, пароль администратора должен быть установлен, иначе сторонние приложения не будут взаимодействовать с базами данных, да и безопасности прибавит, что не лишне при работе с серверами баз данных:
#su postgres bash-4.1$psql postgres=#\password postgres
Не забываем подправить конфиг под себя ! Дело в том, что по умолчанию нет аутентификации локальных пользователей, а так же нет возможности использовать posgresql server для сетевого использования. Локальные пользователи подключаются свободно, что необходимо подправить. Открываем для редактирования конфигурационный файл /var/lib/pgsql/data/pg_hba.conf и приводим его в такой вид , как на картинке:

 

Теперь локальные пользователи проходят аутентификацию по паролю в md5 . Если необходимо , чтобы к серверу подключались из сети или определенного узла, то добавляем свои правила подобные локальным пользователям. Стоит лишний раз подумать про безопасность соединении к базе, так как если не шифровать трафик, то он спокойно может быть перехвачен. Ну и фаервол (на Федоре это iptables , мощный и могучий, главное держать талмут под рукой и понимать как он работает) стоит под настроить , под доступ к серверу баз данных только с тех хостов , которым он разрешен.
Для более глубокого изучения рекомендую хорошо погуглить данный вопрос, а лучше почитать полную документацию на http://postgresql.ru.net/. С помощью данной статьи вы получаете работоспособный postgresql, а статья используется мной как напоминалака в случаи, когда что то позабылось ). Для соответствующих программ нужно установить соответствующие модули, обычно описаны в readme к программе. Успешной вам настройки и использования pstgresql.
Создание нового пользователя и управление его правами.
Добавить нового пользователя можно командой :
postgres=#CREATE USER имя_пользователя PASSWORD 'пароль'; (в ответ: «CREATE ROLE», что говорит о положительном результате).
Если есть надобность сделать обычного пользователя «суперпользователем» , то вводим
postgres=#ALTER USER 'имя_пользователя' SUPERUSER; (в случае успеха получаем ответ ALTER ROLE).
Отменяем права супер пользователя:
postgres=#ALTER USER 'имя_пользователя' NOSUPERUSER; (в случае успеха получаем ответ ALTER ROLE).
"ALTER USER" очень полезная команда, она позволяет выставить права пользователям, те , которые они заслужили. Далее чуть приведу информации по данному аператору с "postgresql.ru.net", которая понадобится почти каждому, да и вообщем очень рекомендую ознакомиться с содержанием данного сайта, особенно если решили серьезно заняться этим делом ) .
ALTER USER ALTER USER Имя_пользователя [ [ WITH ] option [ ... ] ] SUPERUSER | NOSUPERUSER - Как говорилось выше , дать или отнять прова суперпользователя. CREATEDB | NOCREATEDB - Дать разрешение создавать или запретить создавать базы данных пользователю. CREATEROLE | NOCREATEROLE - Дать пользователю возможность создавать роли доступа. CREATEUSER | NOCREATEUSER - Дать возможность пользователю создавать других пользователей или отнять данную привилегию. ALTER USER Имя_пользователя RENAME TO Новое _имя_пользователя - Переименовать одного пользователя в другого.
Проверяем наличие пользователей, которые могут работать с базами данных:
postgres=#\du (в выводе будет список пользователей с их разрешениями).
Вход под желанным пользователем, по умолчанию вход производится от пользователя «postgresql»:
bash-4.1$psql –U имя_пользователя
Создание базы данных и управление ими.
Создание базы данных можно сделать двумя способами:
1. Меняем пользователя на Postgres:
#su postgres bash-4.1$createdb Имя_создаваемой_базы bash-4.1$exit
2. Надо сменить пользователя на Postgres и запустить утилиту psql.
#su postrges bash-4.1$psql postgres=#CREATE DATABASE имя_базы ;
Вывод существующих баз данных производится по команде:
Для того чтобы созданный пользователь мог работать с определенной базой данных , нужно изменить права доступа к данной базе данных и дабы все происходило нормально отдать эту базу данных во владения этому пользователю! Проделываем следующие шаги:
postgres=#\q (выход из утилиты psql , если вы еще не выходили)
Следующая команда выполняется от пользователя «postgres», так что если что входим :
#su postgres bash-4.1$psql имя_базы (вход в утилиту с редактированием нужной базы данных) здесь будет имя базы=# GRANT ALL PRIVILEGES ON DATABASE имя_базы TO имя_пользователя; Ответ : GRANT postgres=#\q bash-4.1$psql postgres=#ALTER DATABASE имя_базы_данных owner to Имя_пользователя кому отдать базу данных ; postgres=#\l - Смотрим вывод и кому чего принадлежит.
После данных действий пользователь получает права на базу данных и получает ее в свое пользование. Обычно этого с головой достаточно. Не забываем ставить знак « ; », там, где он стоит у меня при вводе команд, если вдруг подзабыли или пропустили – не страшно, поставьте на следующей строке и нажмите ввод. Выйти из утилиты psql можно командой:
Удаление ненужной базы данных:
#su postgres bash-4.1$ dropdb Имя_удоляемой_базы_данных
или
bash-4.1$ psql postgres=# DROP DATABASE Имя_удаляемой базы данных; в ответ "DROP DATABASE"
Бывает ситуация, когда по какой то причине захотелось глянуть, а не появилось ли в базе данных каких нить данных ), и нам на помощь прийдет:
#su postgres bash-4.1$psql Имя_Базы_данных Сдесь_будет_имя_базы_данных =# \d - и мы получаем вывод таблиц из данной базы данных.
Резервное копирование и восстановление отдельных баз данных.
Резервная копия отдельной базы данных производится с помощью "pg_dump".
Утилита очень проста в использовании, но перед использованием нужно создать каталог для резервных копий и дабы не путаться создать отдельную папку для резервного копирования индивидуальной базы.
#mkdir /home/rezervdb #mkdir /home/rezervdb/Имя_базы_данных #chown -R postgres: /home/rezervdb
Так как мы не работаем под пользователем root с базами данных , то входим под пользователем postgres:
#su postgres pg_dump Имя_базы_данных > /home/rezervdb/Имя_базы_данных/Имя_базы.pgdump
Вводим пароль пользователя postgres, после чего проверяем создания копии базы:
bash-4.1$cd /home/rezervdb/Имя_базы_данных/ bash-4.1$ls - В выводе видим нашу свеж созданную копию базы данных.
Восстановить, переименовать, переместить проще простого : bash-4.1$ cat /home/Имя_базы_данных/Имя_базы.pgdump | psql Имя_базы
Если нам нужно создать и сразу заархивировать копию базы данных, что бывает очень полезно при больших по объему базах данных, то используем стандартные средства:
bash-4.1$pg_dump Имя_базы_данных | gzip > /home/rezervdb/Имя_базы_данных/Имя_базы.dump.gz
Восстанавление, переименование, перемещение:
bash-4.1$gunzip -c /home/rezervdb/Имя_базы_данных/Имя_базы.dump.gz | psql Имя_базы_данных_в_которую_востанавливаем
Резервное копирование и восстановление всего в один клик ).
# mkdir /home/rezervdb/postgres #chown -R postgres: /home/rezervdb #su postgres bash-4.1$pg_dumpall > /home/rezervdb/postgres/db.out
Для востановления:
#su postgres bash-4.1$psql -f /home/rezervdb/postgres/db.out postgres
И на последок , если вы запутались, ни кто не отменял помощь из консоли ))) :
Выведит помощь по командам и их синтаксису, а ввод допустим:
выведит помощь для всех команд с данным названием.

 

sevsait.com

database - База данных по умолчанию с именем postgres на сервере Postgresql

По-видимому, существует база данных "postgres", которая создается по умолчанию для каждой установки сервера postgresql. Может ли кто-нибудь сказать мне или указать мне на документацию, для чего он используется?

задан dareios 03 марта '10 в 13:55 источник поделиться

Похоже, что у него действительно нет четко определенной цели. Согласно документам:

Создание кластера базы данных состоит из создания каталогов, в которых будут храниться данные базы данных, создания общих таблиц каталога (таблиц, принадлежащих всему кластеру, а не какой-либо конкретной базе данных) и создания "шаблона1" и "postgres".

[...]

База данных postgres - это база данных по умолчанию, предназначенная для пользователей, утилит и сторонних приложений.

(Источник: http://www.postgresql.org/docs/8.2/interactive/app-initdb.html)

ответ дан sleske 03 марта '10 в 14:06 источник поделиться

Когда клиентское приложение подключается к серверу Postgres, он должен указать, к какой базе данных он хочет подключиться. Если вы не знаете имя базы данных (внутри кластера, обслуживаемого почтовым мастером, к которому вы подключаетесь), вы можете найти список имен баз данных с помощью команды:

psql -l

Когда вы запустите эту команду, psql подключается к серверу и запрашивает pg_database для списка имен баз данных. Однако, поскольку psql является клиентским приложением Postgres, он не может подключиться к серверу, не зная имя хотя бы одной базы данных: Catch-22. Таким образом, psql жестко закодирован для подключения к базе данных с именем "postgres" при запуске "psql -l".

-- Korry

ответ дан user289919 09 марта '10 в 22:16

источник поделиться

Существует также шаблон базы данных0, ваша защитная сетка, когда вы испортите все остальные.

  • postgres - это ваша база данных по умолчанию для соединиться с.
  • template1 является вашим значением по умолчанию для создания новых баз данных, это созданный так же, как шаблон1
  • template0 полезен, когда template1 (неправильные настройки и т.д.) и вы не хотите тратить много время исправить это. Просто снижайтесь template1 и создать новый шаблон1 используя шаблон базы данных0.
источник поделиться

Если вы используете несколько подключений к базе данных при создании новых баз данных, все соединения не могут быть выполнены с помощью template1 или template0.

Postgresql выдает ошибку, если к исходной БД при создании нового БД обращаются другие соединения.

Итак, для создания новых БД лучше подключиться postgres.

источник поделиться

qaru.site

PostgreSQL : Документация: 9.6: createuser : Компания Postgres Professional

createuser

createuser — создать новую учётную запись PostgreSQL

Синтаксис

createuser [параметр-подключения...] [параметр...] [имя_пользователя]

Описание

createuser создаёт нового пользователя PostgreSQL, а если точнее — роль. Лишь суперпользователь и пользователи с привилегией CREATEROLE могут создавать новые роли, таким образом, createuser должна запускаться от их лица.

Чтобы создать дополнительного суперпользователя, необходимо подключиться от имени существующего, одного лишь права CREATEROLE недостаточно. Поскольку суперпользователи могут обходить все ограничения доступа в базе данных, к назначению этих полномочий не следует относиться легкомысленно.

createuser — это обёртка для SQL-команды CREATE ROLE. Создание пользователей с её помощью по сути не отличается от выполнения того же действия при обращении к серверу другими способами.

Параметры

createuser принимает следующие аргументы:

имя_пользователя

Задаёт имя создаваемого пользователя PostgreSQL. Это имя должно отличаться от имён всех существующих ролей в данной инсталляции PostgreSQL.

-c номер--connection-limit=номер

Устанавливает максимальное допустимое количество соединений для создаваемого пользователя. По умолчанию ограничение в количестве соединений отсутствует.

-d--createdb

Разрешает новому пользователю создавать базы данных.

-D--no-createdb

Запрещает новому пользователю создавать базы данных. Это поведение по умолчанию.

-e--echo

Вывести команды к серверу, генерируемые при выполнении createuser.

-E--encrypted

Шифровать пароль пользователя, хранимый в базе. Если флаг не указан, то для пароля используется поведение по умолчанию.

-g role--role=role

Указывает роль, к которой будет добавлена текущая роль в качестве члена группы. Допускается множественное использование флага -g.

-i--inherit

Создаваемая роль автоматически унаследует права ролей, в которые она включается. Это поведение по умолчанию.

-I--no-inherit

Роль не будет наследовать права ролей, в которые она включается.

--interactive

Запросить имя для создаваемого пользователя, а также значения для флагов -d/-D, -r/-R, -s/-S, если они явно не указаны в командной строке. До версии PostgreSQL 9.1 включительно это было поведением по умолчанию.

-l--login

Новый пользователь сможет подключаться к серверу (то есть его имя может быть идентификатором начального пользователя сеанса). Это свойство по умолчанию.

-L--no-login

Новый пользователь не сможет подключаться к серверу. (Роль без права входа на сервер тем не менее полезна для управления разрешениями в базе данных.)

-N--unencrypted

Не шифровать пароль, хранимый в базе. Если флаг не указан, то для пароля используется поведение по умолчанию.

-P--pwprompt

Если флаг указан, то createuser запросит пароль для создаваемого пользователя. Если не планируется аутентификация по паролю, то пароль можно не устанавливать.

-r--createrole

Разрешает новому пользователю создавать другие роли, что означает наделение привилегией CREATEROLE.

-R--no-createrole

Запрещает пользователю создавать новые роли. Это поведение по умолчанию.

-s--superuser

Создаваемая роль будет иметь права суперпользователя.

-S--no-superuser

Новый пользователь не будет суперпользователем. Это поведение по умолчанию.

-V--version

Вывести версию createuser и завершить выполнение.

--replication

Создаваемый пользователь будет наделён правом REPLICATION. Это рассмотрено подробнее в документации по CREATE ROLE.

--no-replication

Создаваемый пользователь не будет иметь привилегии REPLICATION. Это рассмотрено подробнее в документации по CREATE ROLE.

-?--help

Вывести помощь по команде createuser.

createuser также принимает из командной строки параметры подключения:

-h сервер--host=сервер

Указывает имя компьютера, на котором работает сервер. Если значение начинается с косой черты, оно определяет каталог Unix-сокета.

-p порт--port=порт

Указывает TCP-порт или расширение файла локального Unix-сокета, через который сервер принимает подключения.

-U имя_пользователя--username=имя_пользователя

Имя пользователя для подключения (не имя создаваемого пользователя).

-w--no-password

Не выдавать запрос на ввод пароля. Если сервер требует аутентификацию по паролю и пароль не доступен с помощью других средств, таких как файл .pgpass, попытка соединения не удастся. Этот параметр может быть полезен в пакетных заданиях и скриптах, где нет пользователя, который вводит пароль.

-W--password

Принудительно запрашивать пароль перед подключением к базе данных.

Это несущественный параметр, так как createuser запрашивает пароль автоматически, если сервер проверяет подлинность по паролю. Однако, чтобы понять это, createuser лишний раз подключается к серверу. Поэтому иногда имеет смысл ввести -W, чтобы исключить эту ненужную попытку подключения.

Переменные окружения

PGHOSTPGPORTPGUSER

Параметры подключения по умолчанию

Эта утилита, как и большинство других утилит PostgreSQL, также использует переменные среды, поддерживаемые libpq (см. Раздел 32.14).

Диагностика

В случае возникновения трудностей, обратитесь к CREATE ROLE и psql. Переменные окружения и параметры подключения по умолчанию libpq будут применены при запуске утилиты, это следует учитывать при диагностике.

Примеры

Чтобы создать роль joe на сервере, используемом по умолчанию:

$ createuser joe

Чтобы создать роль joe на сервере, используемом по умолчанию, с запросом дополнительных параметров:

$ createuser --interactive joe Назначить роль суперпользователем? (y/n) n Разрешить новой роли создавать базы данных? (y/n) n Разрешить новой роли создавать другие роли? (y/n) n

Чтобы создать того же пользователя joe с явно заданными атрибутами, подключившись к компьютеру eden, порту 5000:

$ createuser -h eden -p 5000 -S -D -R -e joe CREATE ROLE joe NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT LOGIN;

Чтобы создать роль joe с правами суперпользователя и предустановленным паролем:

$ createuser -P -s -e joe Введите пароль для новой роли: xyzzy Подтвердите ввод пароля: xyzzy CREATE ROLE joe PASSWORD 'md5b5f5ba1a423792b526f799ae4eb3d59e' SUPERUSER CREATEDB CREATEROLE INHERIT LOGIN;

В приведённом примере введённый пароль отображается лишь для отражения сути, на деле же он не выводится на экран. Как видно в выводе журнала команд, пароль зашифрован. Если же указан флаг --unencrypted, то он отобразиться в этом журнале неизменным, а также, возможно, и в других журналах сервера. По этой причине в этой ситуации стоит использовать флаг -e с особой осторожностью.

postgrespro.ru

Что такое имя пользователя /пароль суперпользователя по умолчанию для postgres после новой установки?

ПРЕДОСТЕРЕЖЕНИЕ Ответ на изменение пароля UNIX для «postgres» через «$ sudo passwd postgres» не является предпочтительным и даже может быть ОПАСНЫМ !

Вот почему: По умолчанию учетная запись «postgres» в UNIX заблокирована, а значит, она не может быть зарегистрирована с использованием пароля. Если вы используете «sudo passwd postgres», учетная запись немедленно разблокируется. Хуже того, если вы установите пароль на что-то слабое, например «postgres», тогда вы подвергаетесь большой опасности для безопасности. Например, существует несколько ботов, пытающихся использовать имя пользователя /пароль «postgres /postgres» для входа в вашу систему UNIX.

Что вы должны сделать, следуйте за ответом Криса Джеймса :

sudo -u postgres psql postgres # \password postgres Enter new password:

Объяснить это немного. Обычно для входа на сервер PostgreSQL обычно используются два способа по умолчанию:

  1. Запустив команду «psql» как пользователь UNIX (так называемая идентификация IDENT /PEER), например: sudo -u postgres psql. Обратите внимание, что sudo -u НЕ разблокирует пользователя UNIX.

  2. по TCP /IP-соединению, используя собственное управляемое имя пользователя /пароль PostgreSQL (так называемая аутентификация TCP) (т. е. НЕ пароль UNIX).

Итак, вы never хотите установить пароль для учетной записи UNIX «postgres». Оставьте его заблокированным по умолчанию.

Конечно, все может измениться, если вы настроите его иначе, чем значение по умолчанию. Например, можно синхронизировать пароль PostgreSQL с паролем UNIX и разрешать только локальные логины. Это выходит за рамки этого вопроса.

ответил user716468 28 +04002011-10-28T10:25:11+04:00312011bEurope/MoscowFri, 28 Oct 2011 10:25:11 +0400 2011, 10:25:11

sprosi.pro

postgresql - Запретить пользователям создавать таблицы в табличном пространстве по умолчанию

Если вы используете дисковое квотирование, вы даете себе очень много работы. Фактически, это приблизительное решение в PostgreSQL с небольшим мастерингом и не нужно создавать большое количество табличных пространств (схемы по-прежнему будут хорошей идеей дать каждому пользователю свое собственное пространство имен).

Функция pg_total_relation_size(regclass) дает общее пространство на диске, используемое для таблицы, включая ее индексы и таблицы TOAST. Поэтому сканируйте pg_class и подведите итог:

CREATE VIEW user_disk_usage AS SELECT r.rolname, SUM(pg_total_relation_size(c.oid)) AS total_disk_usage FROM pg_class c, pg_roles r WHERE c.relkind = 'r' AND c.relowner = r.oid GROUP BY c.relowner;

Это дает вам общее пространство на диске, используемое каждым владельцем, независимо от того, где находятся таблицы. Он представлен как определение определения здесь для использования ниже.

Чтобы сделать эту работу достаточно точной, вам необходимо регулярно VACUUM ANALYZE создавать базу данных. Если у вас низкие периоды трафика (например, 3 утра 5 утра в день или воскресенье), запустите его, используя запланированное задание с пользователем postgres. Создайте функцию для этого задания, которое выполняет VACUUM, а затем проверку квот:

CREATE FUNCTION user_quota_check() RETURNS void AS $$ DECLARE user_data record; BEGIN -- Vacuum the database to get accurate disk use data VACUUM FULL ANALYZE; -- Find users over disk quota FOR user_data IN SELECT * FROM user_disk_usage LOOP IF (user_data.total_disk_usage > <<your quota>>) THEN EXECUTE 'REVOKE CREATE ON SCHEMA ' || <<user' schema name>> || ', PUBLIC FROM ' || user_data.rolname; -- REVOKE INSERT privileges too, unless you work with BEFORE INSERT triggers on all tables END IF; END LOOP; END; $$ LANGUAGE plpgsql; REVOKE ALL ON FUNCTION user_quota_check() FROM PUBLIC;

Если владелец переходит к квоте, вы можете REVOKE CREATE на всех соответствующих схемах, как правило, только схему, назначаемую пользователю и общедоступной схеме, так что новые таблицы не могут быть созданы. Вы также должны REVOKE INSERT на всех таблицах, но это легко обойти, потому что владелец может GRANT INSERT вернуться назад. Это, однако, может быть причиной более радикальных действий против пользователя. Предпочтительно вы создадите триггер до вставки в каждой таблице в базе данных, используя ежедневную развертку, как и предыдущую.

Пользователь по-прежнему будет иметь привилегии SELECT, чтобы он/она мог получить доступ к данным. Более интересно, DELETE и TRUNCATE позволят пользователю освободить место на диске и устранить блокировку. Затем привилегии могут быть восстановлены с использованием чего-то похожего на вышеуказанную функцию:

CREATE FUNCTION reclaim_disk_space() RETURNS void AS $$ DECLARE disk_use bigint; BEGIN -- Vacuum current_user tables. -- Slow and therefore adequate punishment for going over quota. VACUUM FULL VERBOSE ANALYZE; -- Now re-instate privileges if enough space was reclaimed. SELECT total_disk_usage INTO disk_use FROM user_disk_usage WHERE rolname = session_user; IF (disk_use < <<your quota>>) THEN EXECUTE 'GRANT CREATE ON SCHEMA ' || <<user' schema name>> || ', PUBLIC TO ' || user_data.rolname; -- GRANT INSERT privileges too, unless you work with BEFORE INSERT triggers on all tables RAISE NOTICE 'Disk use under quota limit. Privileges restored.'; ELSE RAISE NOTICE 'Still using too much disk space. Free up more space.'; END IF; END; $$ LANGUAGE plpgsql;

Заблокированный пользователь может вызвать эту функцию сам после удаления достаточных данных, чтобы перейти под ограничение квоты.

Вы можете добавить более сложные функции, такие как наличие квот на список для каждого пользователя (вместо общей квоты) и сравнение фактического использования с этой квотой, выдача RAISE NOTICE на триггер вставки при переходе более 80% квоты (это требует, чтобы каждая таблица имела триггер до вставки, который может быть легко выполнен пользователем postgres при регулярной развертке новых таблиц, тот же триггер может использоваться для отказа в вставках, если над квотой), повторяя это уведомление каждый час (так запись, когда было отправлено последнее уведомление) и т.д.

Это решение является приблизительным, поскольку квота не проверяется в реальном времени. Это возможно (запустите user_quota_check() для каждой вставки, модифицированный для проверки только таблиц session_user), но, скорее всего, слишком много накладных расходов, чтобы сделать его интересным. Запустите user_quota_check() на ночь, чтобы иметь ежедневное управление квотами. И ругайте любого пользователя, используя слишком много места в течение дня.

qaru.site