运行 postgres 事务中的代码块

Run code block in a transaction in postgres

我想 运行 事务中的以下代码块,这样如果任何 sql statements 失败,整个事务就会中止。如果我按原样 运行 下面的块,它是在交易中 运行 还是我需要 运行 它在 BEGIN; ... COMMIT;

DO $$
  DECLARE
    readonly_exists int;
BEGIN
  SELECT COUNT(*) INTO readonly_exists FROM information_schema.enabled_roles
    WHERE role_name = 'readonly';
  IF readonly_exists = 0 THEN
    <SQL STATEMENT 1>
    <SQL STATEMENT 2>
    <SQL STATEMENT 3>
  ELSE
    RAISE EXCEPTION 'readonly role already exists';
  END IF;
END$$;

任何 SQL 语句在单个事务中总是 运行s(此规则的例外是 CALL)。

因此您的 DO 语句将 运行 在单个事务中,并且所有三个 SQL 语句都成功,或者全部回滚。