【问题标题】:How to create a conditional transaction in postgres?如何在 postgres 中创建条件事务?
【发布时间】:2020-06-05 05:30:56
【问题描述】:

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

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

【问题讨论】:

    标签: postgresql postgresql-11 postgres-10


    【解决方案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

    【讨论】:

    • 您的声望超过1500,所以我的理解是您应该可以添加标签。我只有 700 个,所以离这样的辉煌岁月还有很长的路要走。
    猜你喜欢
    • 2013-03-24
    • 2017-09-26
    • 2018-07-17
    • 2023-03-15
    • 2022-08-19
    • 2021-10-13
    • 1970-01-01
    • 2019-06-13
    • 2013-04-04
    相关资源
    最近更新 更多