PostgreSQL:具有赠款/掉落角色的可序列化交易



我已经阅读了很多有关Postgres中可序列交易的信息,但是遇到了一个我无法解决的问题。假设我有两个来自不同PSQL过程的Postgres会话A和B,并且在开始任何交易之前,我创建角色role1role2

myuser=# CREATE ROLE role1 ;
CREATE ROLE
myuser=# CREATE ROLE role2 ;
CREATE ROLE

在这一点上,我可以通过myuser=# BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE ;在两个会话中启动交易,并通过SELECT * FROM pg_catalog.pg_roles;

验证两个会话都可以看到两个角色

让我们假设我从会话B中删除role2的角色,请验证它未显示和提交:

myuser=# DROP ROLE role2 ;
DROP ROLE
myuser=# SELECT * FROM pg_catalog.pg_roles;
                    rolname                    | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig |  oid
-----------------------------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+-------
 role1                                         | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |           | 16563
myuser=# commit ;
COMMIT

现在,让我们回到会议A:

即使在删除role2并在会话B内进行了投入后,我们仍然可以看到会话中的交易仍然可以看到两个角色(如预期的那样,因为这是可序列化的):

myuser=# SELECT * FROM pg_catalog.pg_roles;
                    rolname                    | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolconnlimit | rolpassword | rolvaliduntil | rolbypassrls | rolconfig |  oid
-----------------------------------------------+----------+------------+---------------+-------------+-------------+----------------+--------------+-------------+---------------+--------------+-----------+------
 role1                                         | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |           | 16563
 role2                                         | f        | t          | f             | f           | f           | f              |           -1 | ********    |               | f            |           | 16564

现在,让我们尝试GRANT命令。这是奇怪的部分:

myuser=# GRANT role2 TO role1 ;
ERROR:  role "role2" does not exist

在运行GRANT之前,我们可以看到两个角色role1role2都存在,但是现在我们看到了这样的错误。为什么是?

谢谢!

with“(即非电视)表冲突的操作将导致序列化错误。虽然可序列化的交易 See 修改的任何尝试 自那以来已更改的值都会导致这样的错误。

使这种情况与众不同的是,存储角色和角色成员资格的表(pg_authidpg_auth_members)是目录表(甚至共享目录,因为角色适用于所有数据库),对于这些处理和错误消息,略有不同。

即使错误消息令人惊讶,操作失败是很好的。

最新更新