我想阻止自己做一些愚蠢的事情。我想告诉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的选项。
(是的,从正式意义上说,我可以“停止做蠢事”,但你知道,宝贝步骤。)
答案 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文件中设置它。