如何在 postgres 中创建条件事务?

How to create a conditional transaction in postgres?

我正尝试在如下事务中添加新角色并修改现有角色:

BEGIN;

-- readonly role
CREATE ROLE readonly;
REVOKE CREATE ON SCHEMA public FROM readonly;
REVOKE ALL PRIVILEGES ON DATABASE some_database FROM readonly;

...
...
...

COMMIT;

但是我想 运行 只有当 readonly 角色不存在时才进行此交易。如何将此交易放入 if condition 中?

您可以在 plpgsql 函数中执行此操作,该函数会在交易中自动 运行。我认为以下内容大致符合您在上面的示例中所拥有的内容:

DO $$
  DECLARE
    role_count int;
BEGIN
  SELECT COUNT(*) INTO role_count FROM information_schema.enabled_roles
    WHERE role_name = 'readonly';
  IF role_count = 0 THEN
    CREATE ROLE readonly;
    REVOKE CREATE ON SCHEMA public FROM readonly;
    REVOKE ALL PRIVILEGES ON DATABASE some_database FROM readonly;
    ...
    ...
    ...
  ELSE
    RAISE NOTICE 'readonly role already exists';
  END IF;
END$$;

至于交易语义...虽然您将问题标记为第 10 页,但我们已经确认您是 运行ning 11,因此您在这里有一些选择。

  • 运行 以上是孤立的,它将 运行 原子地,要么全部成功,要么不改变 db
  • 您可以将上面的内容包装在 BEGIN ... COMMIT/ROLLBACK 中,并使其 运行 与上下文中的任何周围逻辑原子地结合在一起。
  • 如果您转换为使用 plpgsql transactions 中的程序,您还可以选择更精细的交易。鉴于您的问题,我认为目前您不需要这样做。

HTH