如何使用 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:
using DROP DATABASE
with a pqxx::nontransaction
使用动态 SQL 建议 here.
但到目前为止每次尝试都失败了。
在 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 是管理员用户,但大多数情况下您不会使用它时间,除非你是系统管理员)。
关于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:
using
DROP DATABASE
with apqxx::nontransaction
使用动态 SQL 建议 here.
但到目前为止每次尝试都失败了。
在 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 是管理员用户,但大多数情况下您不会使用它时间,除非你是系统管理员)。