需要事务的 PSQL 命令行选项

PSQL command-line option to require transactions

我想阻止自己做一些愚蠢的事情。我想告诉 psql 拒绝任何未明确包含在事务中的 DML(更新、插入)。

postgres=# update  "employees" set salary = salary * 1.5;
ERROR:  cannot update outside of a transaction 
postgres=# start transaction;
START TRANSACTION
postgres=# update  "employees" set salary = salary * 1.5;
UPDATE 331805
postgres=# rollback;
ROLLBACK
postgres=# 

实际上,对我来说几乎一样好(在某些情况下更好)的选项是禁止 psql 执行任何 DML。

(是的,在正式意义上,我可以 "stop doing stupid things",但你知道,婴儿步骤。)

\set autocommit off 如果您 运行 独立语句,则自动打开一个新事务并且不立即提交它。这适用于所有语句类型。

虽然没有工具可以单独禁止或控制 DML 到 DDL。对于 psql 它们只是声明。

对于脚本,您还应该使用 -v ON_ERROR_STOP=1

如果你热衷于编写一个 ExecutorStart_hook 作为通过 session_preload_libraries 加载的 C 扩展,它检查由 psql 会话设置的配置变量 (GUC) 并使用它到 ERROR 如果在仍然允许 DDL 的情况下尝试 DML(改为 运行 到 ProcessUtility_hook)。您将需要基本的 C 编程知识并阅读有关扩展的 PostgreSQL 手册以及一些示例扩展。

在 psql 中手动执行此操作的正确答案是:

\set AUTOCOMMIT off

(大写,不像其他答案中的小写)

注意:autocommit-on 模式是 PostgreSQL 的传统行为,但 autocommit-off 更接近 SQL 规范。如果您更喜欢自动提交关闭,您可能希望在系统范围的 psqlrc 文件或您的 ~/.psqlrc 文件中设置它。