1

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

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

4

1 回答 1

1

您可以在一个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 页,但我们已经确认您正在运行 11,因此您在这里有一些选择。

  • 单独运行上述内容,它将以原子方式运行,要么全部成功,要么不改变数据库
  • 您可以将上述内容包装在 a 中BEGIN ... COMMIT/ROLLBACK,并使其与上下文中的任何周围逻辑一起自动运行。
  • 如果您转换为按照plpgsql 事务使用过程,您还可以选择更多粒度事务。鉴于您的问题,我认为此时您不需要这样做。

高温高压

于 2020-02-20T20:09:50.630 回答