pgAdmin 4执行脚本遇CREATE DATABASE事务块错误,求修改方案
解决pgAdmin 4中执行CREATE DATABASE时的事务块错误
这个问题我之前也碰到过,根源在于pgAdmin的默认执行模式——它会把整个脚本包裹在一个事务里运行,但PostgreSQL的CREATE DATABASE、CREATE ROLE(CREATE USER是它的别名)这类命令不允许在事务块中执行,这就是你看到报错的原因。
为什么SET AUTOCOMMIT = ON没用?
你试的这个命令是MySQL里的用法,PostgreSQL根本没有autocommit这个服务器配置参数。这个选项是客户端工具(比如psql)的本地设置,pgAdmin的查询工具不支持用SQL语句来开启它,得通过界面操作调整。
两种可行的解决方案:
方法一:开启pgAdmin查询工具的自动提交模式
这是最省心的办法:
- 打开pgAdmin的查询工具,找到顶部工具栏的Auto-commit按钮(通常是一个带对勾的数据库图标,或者直接标注了文字)。
- 点击这个按钮开启自动提交模式——这样每个SQL语句执行后会自动提交,不会被包裹在一个大事务里。
- 现在再运行你原来的完整脚本,就能顺利执行了。
方法二:分批次手动提交命令
如果你不想开启自动提交,可以把脚本拆成几个部分,手动控制提交:
- 先执行所有创建用户和角色注释的代码,执行完后点击工具栏的Commit按钮提交:
CREATE USER ky_auth WITH PASSWORD 'ky_auth'; COMMENT ON ROLE ky_auth IS 'KnowYourself Auth Database User'; CREATE USER ky_pers WITH PASSWORD 'ky_pers'; COMMENT ON ROLE ky_pers IS 'KnowYourself Personal Database User'; CREATE USER ky_oper WITH PASSWORD 'ky_oper'; COMMENT ON ROLE ky_oper IS 'KnowYourself Operational Database User'; CREATE USER knowyourself_tests WITH PASSWORD 'ky_tests' CREATEDB; COMMENT ON ROLE knowyourself_tests IS 'KnowYourself Integration Tests Database User'; - 然后逐个执行创建数据库和注释的命令,每执行完一组就提交一次:
提交后再执行下一个数据库的创建代码,直到全部完成。CREATE DATABASE ky_auth WITH OWNER = ky_auth; COMMENT ON DATABASE ky_auth IS 'KnowYourself Auth Database';
补充说明
你的脚本本身没有语法问题,只是执行环境的事务模式不对。开启自动提交后,PostgreSQL会为每个不支持事务的命令自动单独执行并提交,完美适配你的需求。
内容的提问来源于stack exchange,提问作者user12911826
相关产品推荐
相关产品推荐

