如何在 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
我正尝试在如下事务中添加新角色并修改现有角色:
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