如何使用 libpqxx 以编程方式清除 PostgreSQL 数据库

how to clear a PostgreSQL database programmatically with libpqxx

关于HelpCovid GPLv3+ project (C++17, Linux/x86-64, Debian/Buster, PostgreSQL 11 or 12) and its issue #27, we want to clear all the data in a given PostgreSQL 11 (or 12) database. We have today (April 6, 2020, git commit 2843184d9f589d51bd9) only tables and indexes there (see our documentation in DATABASE.md and our C++ file hcv_database.cc的详情)。

我们只想从给定数据库(由我们的 generate-config.py python script 初始化)中删除每个 table 和索引(即 "every data")。

我们尝试了 several approaches:

但到目前为止每次尝试都失败了。

commit cb982e1a57c9de81d 中观察到以下调试输出(在 C++ 中使用 HCV_DEBUGOUT 宏输出的调试消息包含 Δ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 techniques. I am unhappy, for cybersecurity reasons, with the idea of running any external command (using system(3), popen(3), or fork(2) + execve(2) + waitpid(2) ..) 部署以清除数据库。

我当然是PostgreSQL新手

您有两个选择:

drop schema

如果所有内容都存储在单个架构中并且该架构归您的用户所有,则使用 drop schema ... cascade。有关详细信息,请参阅 the manual

请注意,public 模式通常由超级用户 postgres 所有。在执行此操作之前,您需要 transfer the ownership

drop owned

如果您要删除的所有内容(!) 都属于当前用户,您可以使用drop owned ..

这将真正删除 一切(包括视图、函数、触发器、模式、类型,实际上:一切)您指定的用户。

通常您会以所有者身份连接,然后 运行 drop owned by current_user;

详情见the manual

数据库所有者是具有 运行 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 是管理员用户,但大多数情况下您不会使用它时间,除非你是系统管理员)。