如何查询PostgreSQL物化视图的列级SELECT权限?
查询PostgreSQL物化视图的列级SELECT权限
要查看用户alice对物化视图recent_sales_mv的列级SELECT权限,可通过PostgreSQL系统目录表组合查询,以下是两种实用方案:
方式一:精准筛选目标用户的列权限
SELECT n.nspname AS 模式名称, c.relname AS 对象名称, a.attname AS 列名称, r.rolname AS 被授权用户, 'SELECT' AS 权限类型 FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_attribute a ON c.oid = a.attrelid JOIN pg_roles r ON a.attacl @> ARRAY[r.rolname || '=r/' || current_user::text]::aclitem[] WHERE c.relname = 'recent_sales_mv' AND c.relkind = 'm' -- 筛选物化视图 AND r.rolname = 'alice' AND a.attnum > 0 -- 排除系统列 AND NOT a.attisdropped; -- 排除已删除列
方式二:查看所有列的权限明细
如果需要查看该物化视图所有列的完整权限记录(含其他用户权限),可使用:
SELECT n.nspname AS 模式名称, c.relname AS 对象名称, a.attname AS 列名称, unnest(a.attacl) AS 权限详情 FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_attribute a ON c.oid = a.attrelid WHERE c.relname = 'recent_sales_mv' AND c.relkind = 'm' AND a.attnum > 0 AND NOT a.attisdropped AND a.attacl IS NOT NULL;
关键系统表说明
pg_class:存储数据库对象(表、视图、物化视图等)元数据,relkind = 'm'用于定位物化视图。pg_namespace:关联获取对象所属的模式。pg_attribute:存储列信息,通过attnum > 0和NOT a.attisdropped过滤无效列。pg_roles:记录数据库用户/角色信息,attacl是存储列权限的数组,其中=r/代表SELECT权限(r为read的缩写)。
内容的提问来源于stack exchange,提问作者bertday
相关产品推荐
相关产品推荐

