我正在尝试添加新角色并修改事务中的现有角色,如下所示:
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
内?
答案 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
中,并使其与上下文中存在的所有周围逻辑自动运行。HTH