как очистить базу данных PostgreSQL программно с помощью libpqxx - PullRequest
0 голосов
/ 06 апреля 2020

Для проекта HelpCovid GPLv3 + (C ++ 17, Linux / x86-64, Debian / Buster, PostgreSQL 11 или 12) и выпуск # 27 , мы хотим очистить все данные в данной PostgreSQL 11 (или 12) базе данных. Сегодня у нас (6 апреля 2020 года, git commit 2843184d9f589d51bd9) есть только таблицы и индексы (см. Нашу документацию в DATABASE.md и наш файл C ++ hcv_database.cc для подробной информации).

Мы просто хотим удалить каждую таблицу и индекс (то есть «все данные») из данной базы данных (инициализируется нашим generate-config.py python сценарием ).

Мы попробовали несколько подходов :

Но пока что каждая попытка не удалась.

В commit cb982e1a57c9de81d наблюдается следующий отладочный вывод (вывод отладочных сообщений с макросом HCV_DEBUGOUT в C ++ содержит ΔBG!). Запуск ./helpcovid --clear-database -D -T 2 после ./generate-config.py:

./helpcovid[1393556]: HelpCovid cb982e1a57c9 start adding <?hcv confmsg, but --clear-database still does not work (issue#27) program arguments:
... ./helpcovid --clear-database -D -T 2
./helpcovid[1393556]: hcv_main.cc:573 -  !! parsed 5 program arguments
./helpcovid[1393556]: hcv_main.cc:884 -  !! start of ./helpcovid
 version:github.com/bstarynk/helpcovid built Mon 06 Apr 2020 08:35:00 AM MEST
... gitcommit cb982e1a57c9 start adding <?hcv confmsg, but --clear-database still does not work (issue#27)
... md5sum 7f39a5002c3afc4a6b242015a9f856bb on rimski
 at Mon Apr  6 08:35:15 2020 MEST on rimski
./helpcovid[1393556]: hcv_main.cc:626 -  !! loading configuration file /home/basile/.helpcovidrc
./helpcovid[1393556]: hcv_main.cc:632 -  !! helpcovid loaded configuration file /home/basile/.helpcovidrc
./helpcovid[1393556]: hcv_web.cc:76 -  !! hcv_initialize_web: weburl='http://localhost:8089/', webroot='/home/basile/helpcovid/webroot/', opensslcert='', opensslkey=''
./helpcovid[1393556]: hcv_web.cc:114 -  !! starting plain HTTP server using weburl http://localhost:8089/ and webroot /home/basile/helpcovid/webroot/ hcv_webserver@0x5622aefcb0d0
./helpcovid[1393556]: hcv_main.cc:964 -  !! helpcovid debugging enabled
./helpcovid[1393556]: ΔBG!hcv_main.cc:965▪ 00.00 s‣  helpcovid is debugging
./helpcovid[1393556]: hcv_main.cc:1026 -  !! helpcovid unable to write builtin pidfile /var/run/helpcovid.pid
-: Permission denied
./helpcovid[1393556]: hcv_database.cc:114 -  !! using 'dbname=helpcovid_db user=helpcovid_usr password=passwd1234 hostaddr=127.0.0.1 port=5432' as PostGreSQL connection string.
./helpcovid[1393556]: hcv_database.cc:129 -  !! hcv_initialize_database connstr=dbname=helpcovid_db user=helpcovid_usr password=passwd1234 hostaddr=127.0.0.1 port=5432
./helpcovid[1393556]: hcv_database.cc:133 -  !! hcv_initialize_database for connstr=dbname=helpcovid_db user=helpcovid_usr password=passwd1234 hostaddr=127.0.0.1 port=5432 hcv_dbconn is 0x5622aefcb810
terminate called after throwing an instance of 'pqxx::insufficient_privilege'
  what():  ERROR:  must be owner of database helpcovid_db

zsh: abort (core dumped)  ./helpcovid --clear-database -D -T 2

Эта программа HelpCovid должна быть развернута с использованием методов setuid . Я недоволен по соображениям кибербезопасности идеей запуска любой внешней команды (используя system (3) , popen (3) или fork (2) + execve (2) + waitpid (2) ..) на этом этапе для очистки базы данных.

Конечно, я PostgreSQL новичок ie.

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Владельцем базы данных является пользователь, запустивший CREATE DATABASE: https://www.postgresql.org/docs/12/manage-ag-createdb.html

Владельцем схемы является пользователь, запустивший CREATE SCHEMA: https://www.postgresql.org/docs/12/ddl-schemas.html#DDL -SCHEMAS -CREATE

База данных имеет разные учетные записи пользователей (так же, как у вас разные пользователи на Linux): https://www.postgresql.org/docs/12/sql-createrole.html

Пользователь, подключающийся с приложение к базе данных обычно отличается от владельца базы данных и от владельца схемы (точно так же, как на Linux root - пользователь с правами администратора, но вы не используете его большую часть времени, если не являетесь системным администратором).

1 голос
/ 06 апреля 2020

У вас есть два варианта:

drop schema

Если все хранится в одной схеме и эта схема принадлежит вашему пользователю, используйте drop schema ... cascade. Подробнее см. руководство .

Обратите внимание, что схема public обычно принадлежит суперпользователю postgres. Для этого вам необходимо передать право собственности , прежде чем вы сможете это сделать.

drop owned

Если все (!), Которое вы хотите удалить, принадлежит текущему пользователю, вы можете использовать drop owned ...

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

Обычно вы подключаетесь как владелец, а затем запускаете drop owned by current_user;.

См. руководство для получения подробной информации

...