如何在postgres中创建条件交易?

时间:2020-02-20 19:54:23

标签: postgresql postgresql-11 postgres-10

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

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内?

1 个答案:

答案 0 :(得分: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,所以这里有一些选择。

  • 单独运行上述内容,它将自动运行,要么全部成功,要么不更改数据库。
  • 您可以将以上内容包装在BEGIN ... COMMIT/ROLLBACK中,并使其与上下文中存在的所有周围逻辑自动运行。
  • 如果您转换为使用plpgsql transactions的程序,还可以选择更多的交易。鉴于您的问题,我认为目前您不需要这样做。

HTH