C 我能';t从PSQL中的身份验证挂钩读取pg_auth_members表

C 我能';t从PSQL中的身份验证挂钩读取pg_auth_members表,c,postgresql,psql,C,Postgresql,Psql,在身份验证阶段,我尝试获取与登录用户属于同一组的角色列表。为此,我使用了系统缓存搜索功能,但由于某种原因,使用authmemorlememsyscache id,我得到了错误“如果不选择数据库(relcache.c:320),就无法读取pg_类”。如果我使用authmemrole,搜索将正常执行。根据代码,两个ID必须引用相同的表,为其设置了relisshare标志,并且它们必须在身份验证之前可用 例如,钩子中会导致错误的代码: HeapTuple role_tup; role_tu

在身份验证阶段,我尝试获取与登录用户属于同一组的角色列表。为此,我使用了系统缓存搜索功能,但由于某种原因,使用
authmemorlemem
syscache id,我得到了错误
“如果不选择数据库(relcache.c:320),就无法读取pg_类”
。如果我使用
authmemrole
,搜索将正常执行。根据代码,两个ID必须引用相同的表,为其设置了relisshare标志,并且它们必须在身份验证之前可用

例如,钩子中会导致错误的代码:

HeapTuple       role_tup;
role_tup =  SearchSysCache2(AUTHMEMROLEMEM, ObjectIdGetDatum(user_oid), ObjectIdGetDatum(search_oid));
并且不会导致:

HeapTuple       role_tup;
role_tup =  SearchSysCache2(AUTHMEMMEMROLE,ObjectIdGetDatum(user_oid), ObjectIdGetDatum(search_oid));

我是遗漏了什么还是一个bug?

此索引对于身份验证来说并不重要。请参见
关系缓存初始值设置框3
中的以下代码:

/*
*还要处理关键的共享索引。
*
*DatabaseNameIndexId对于重新缓存加载并不重要,而是对于
*MyDatabaseId的初始查找,没有它我们将永远找不到任何
*非共享目录。Autovacuum使用
*数据库OID,因此它依赖于DatabaseOidIndexId。我们也
*需要在pg_authid和pg_auth_成员上建立一些索引以供使用
*在客户端身份验证期间。SharedSeLabelObjectIndexId不是
*对于核心系统来说至关重要,但身份验证挂钩可能是
*对它感兴趣。
*/
如果(!CriticalSharedRecachesBuilt)
{
加载关键索引(DatabaseNameIndexId,
数据库关系;
加载关键索引(DatabaseOidIndexId,
数据库关系;
加载临界索引(AuthIdRolnameIndexId,
AuthIdRelationId);
加载临界索引(authidoidIndex,
AuthIdRelationId);
加载临界索引(AuthMemroleIndexid,
AuthMemRelationId);
加载临界索引(SharedSecLabelObjectIndexId,
SharedSeLabelRelationId);