PSQL命令行选项,用于要求事务

时间:2016-10-26 23:38:09

标签: psql

我想阻止自己做一些愚蠢的事情。我想告诉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的选项。

(是的,从正式意义上说,我可以“停止做蠢事”,但你知道,宝贝步骤。)

2 个答案:

答案 0 :(得分:0)

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

但是没有任何设施可以单独禁止或控制DML到DDL。致psql他们只是陈述。

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

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

答案 1 :(得分:0)

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

\set AUTOCOMMIT off

(首都,不像其他答案那样小写)

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