Hologres ofrece un conjunto de tablas del sistema para consultar metadatos, estadísticas, información de bloqueos y permisos de acceso. Este tema describe las columnas de cada tabla del sistema y las consultas SQL comunes que puede ejecutar sobre ellas.
Descripción general
Hologres expone dos categorías de tablas del sistema:
Tablas nativas de Hologres (con el prefijo
hg): diseñadas específicamente para Hologres; abarcan propiedades y estadísticas específicas de Hologres compartidas en todos los nodos.Tablas compatibles con PostgreSQL (con el prefijo
pgo bajoinformation_schema): heredadas de PostgreSQL. Algunas columnas de estas tablas no aplican en Hologres porque es un sistema distribuido y no una instancia independiente de PostgreSQL.
|
Tabla |
Origen |
Descripción |
|
|
Nativa de Hologres |
Propiedades e índices de todas las tablas en la base de datos actual. |
|
|
Nativa de Hologres |
Estadísticas de tablas compartidas en todos los nodos. |
|
|
Compatible con PostgreSQL |
Metadatos de tablas, incluidos esquema, propietario e información de índices. |
|
|
Compatible con PostgreSQL |
Información de bloqueos en tiempo de ejecución. Utilice esta tabla para diagnosticar sentencias DDL o consultas bloqueadas. |
|
|
Compatible con PostgreSQL |
Tabla de catálogo de PostgreSQL que contiene metadatos de relaciones. Se usa normalmente junto con otras tablas de |
|
|
Compatible con PostgreSQL |
Estadísticas a nivel de columna que utiliza el planificador de PostgreSQL en un solo nodo. |
|
|
Compatible con PostgreSQL |
Roles y sus permisos en una instancia de Hologres. |
|
|
Compatible con PostgreSQL |
Permisos otorgados a roles sobre tablas y vistas. |
Cómo identificar una tabla del sistema
Las tablas de Hologres se dividen en dos categorías: tablas del sistema y tablas creadas por el usuario. Utilice los siguientes métodos para distinguirlas:
Convención de nombres: Una tabla cuyo nombre tiene el prefijo
hges una tabla del sistema nativa de Hologres (por ejemplo,hologres.hg_table_properties). Una tabla con el prefijopges una tabla del sistema compatible con PostgreSQL (por ejemplo,pg_catalog.pg_tables). Las tablas cuyos nombres no tienen el prefijohgnipgson tablas creadas por el usuario.Esquema: Las tablas del sistema residen en esquemas como
hologresypg_catalog. Las tablas creadas por el usuario residen de forma predeterminada en el esquemapublic.Propietario: Ejecute
hg_dump_scriptpara ver el DDL de una tabla. Si el campoownercorresponde a una cuenta del sistema, se trata de una tabla del sistema. Si el campoownercorresponde a una cuenta de usuario regular, es una tabla creada por el usuario.
-- View the DDL of a system table. The owner is a system account.
SELECT hg_dump_script('hologres.hg_table_properties');
-- View the DDL of a user-created table. The owner is the current user account.
SELECT hg_dump_script('public.my_table');
Las tablas del sistema bajo el esquema hologres (por ejemplo, hologres.hg_table_properties) no se pueden consultar directamente con SELECT. Use hg_dump_script para ver sus metadatos.
Limitaciones
Las tablas con el prefijo
hgson tablas del sistema de Hologres. Las tablas con el prefijopgson tablas del sistema de PostgreSQL. En versiones de Hologres anteriores a V1.3.22, no es posible unir tablas del sistema de PostgreSQL con tablas internas de Hologres, ni importar datos desde tablas del sistema de PostgreSQL hacia tablas internas de Hologres. Actualice a la versión V1.3.22 o posterior para eliminar esta restricción.En Hologres, el campo de identificador de objeto (OID) en una tabla del sistema identifica de forma única relaciones como tablas, índices y vistas. Dado que Hologres es un sistema distribuido con varios nodos frontend (FE), los valores de OID pueden diferir entre nodos. Los resultados de consulta que incluyen valores de OID podrían ser inconsistentes entre nodos.
hologres.hg_table_properties
Esta tabla contiene información y propiedades de todas las tablas en la base de datos actual.
|
Columna |
Descripción |
|
|
El esquema que contiene la tabla. Hologres proporciona tres esquemas del sistema: |
|
|
El nombre de la tabla. Las tablas del sistema incluyen: |
|
|
El nombre de la propiedad. Valores válidos: |
|
|
El valor de la propiedad. |
pg_catalog.pg_tables
Esta tabla contiene metadatos de todas las tablas, incluidas las tablas creadas por el usuario y las tablas del sistema.
| Columna | Descripción |
|---|---|
schemaname | El esquema que contiene la tabla. Hologres proporciona tres esquemas del sistema: hologres, pg_catalog y information_schema. |
tablename | El nombre de la tabla. |
tableowner | El propietario de la tabla. holo_admin posee las tablas del sistema y este valor no se puede modificar. Las cuentas con el modelo de permisos simple (SPM) o el modelo de permisos a nivel de esquema (SLPM) habilitado aparecen como developer. |
tablespace | No aplica en Hologres. |
hasindexes | true si la tabla tiene o tuvo un índice. |
hasrules | true si la tabla tiene o tuvo una regla de reescritura. |
hastriggers | true si la tabla tiene o tuvo un trigger. |
rowsecurity | No aplica en Hologres. |
pg_catalog.pg_locks
Esta tabla muestra información de bloqueos en tiempo de ejecución. Consulte esta tabla para determinar si un bloqueo está obstaculizando una sentencia DDL o una consulta.
|
Columna |
Descripción |
|
|
El tipo de objeto bloqueable. Valores válidos: |
|
|
El OID de la base de datos que contiene el objeto bloqueado. |
|
|
El OID de la tabla bloqueada. Es nulo si el objeto no es una tabla ni parte de una tabla. |
|
|
El ID de transacción virtual del bloqueo. Es nulo si el objeto no es un ID de transacción virtual. |
|
|
El ID de transacción. Es nulo si el objeto no es un ID de transacción. |
|
|
El ID de proceso (PID) del proceso del servidor que mantiene o espera el bloqueo. Utilice este PID para buscar el proceso en |
|
|
El modo de bloqueo: bloqueo compartido o bloqueo exclusivo. |
|
|
|
Columns not applicable in Hologres: page, tuple, classid, objid, objsubid, virtualtransaction, fastpath.
pg_catalog.pg_class
Esta tabla contiene información del catálogo de PostgreSQL para todas las relaciones (tablas, índices, vistas, entre otros). Normalmente se consulta junto con otras tablas de pg_catalog.
Dado que Hologres es un sistema distribuido con varios nodos FE, los valores de OID suelen ser diferentes entre nodos. Los resultados de consulta que contienen OID pueden ser inconsistentes.
|
Columna |
Descripción |
|
|
El OID único de la relación. |
|
|
El nombre de la relación. |
|
|
El OID del esquema que contiene la relación. |
|
|
El propietario de la relación. |
|
|
El recuento estimado de filas que utiliza el planificador. Se actualiza mediante |
|
|
El número estimado de páginas totalmente visibles que utiliza el planificador. Se actualiza mediante |
|
|
|
|
|
|
|
|
Persistencia de la tabla: |
|
|
Tipo de relación: |
|
|
El número de columnas de usuario, excluyendo las columnas del sistema. |
|
|
|
|
|
|
|
|
Permisos de acceso para la relación. |
|
|
Propiedades de la tabla. Por ejemplo, |
Columnas que no aplican en Hologres: reltype, reloftype, relam, relfilenode, reltablespace, relpages, reltoastrelid, relchecks, relhasoids, relhasrules, relhastriggers, relispopulated, relreplident, relfrozenxid, relminmxid.
hologres_statistic.hg_table_statistic
Esta tabla contiene estadísticas nativas de Hologres compartidas en todos los nodos. Se actualiza cuando ejecuta ANALYZE o cuando se ejecuta la función de análisis automático.
|
Columna |
Descripción |
|
|
El identificador único de la tabla. |
|
|
La versión del esquema de la tabla. |
|
|
La versión de las estadísticas. |
|
|
El contenido de las estadísticas, codificado en Base64. |
|
|
El esquema que contiene la tabla. |
|
|
El nombre de la tabla. |
|
|
El número total de filas en la tabla. |
|
|
El número de filas muestreadas para la recopilación de estadísticas. |
|
|
El número de columnas en la tabla. |
|
|
Las columnas analizadas por la sentencia |
|
|
Las columnas para las cuales se recopilan estadísticas de histograma. |
|
|
Las columnas para las cuales se recopilan estadísticas de valores distintos (NDV). |
|
|
El usuario que ejecutó |
|
|
La hora en que se ejecutó |
|
|
El tiempo que tardó en completarse |
|
|
El número de veces que se ha ejecutado |
pg_catalog.pg_stats
Esta tabla contiene estadísticas a nivel de columna de PostgreSQL que utiliza el planificador de PostgreSQL de nodo único.
|
Columna |
Descripción |
|
|
El nombre del esquema. |
|
|
El nombre de la tabla. |
|
|
El nombre de la columna. |
|
|
|
|
|
La fracción de filas con valores nulos en esta columna. |
|
|
El ancho promedio (en bytes) de las entradas de la columna. |
|
|
El número estimado de valores distintos si es positivo. Si es negativo, el valor absoluto representa la proporción de valores distintos respecto al total de filas (se usa cuando se espera que el número de valores distintos crezca con la tabla). Por ejemplo, |
|
|
Una lista de los valores más comunes en la columna. Es nulo si ningún valor es lo suficientemente común. |
|
|
Las frecuencias de los valores más comunes, calculadas como ocurrencias divididas entre el total de filas. Es nulo si |
|
|
Valores que dividen el rango de valores de la columna en grupos de tamaño aproximadamente igual. Los valores en |
|
|
Los valores de elementos no nulos más comunes dentro de los valores de columnas de tipo arreglo. |
|
|
Las frecuencias de los valores de elementos más comunes: la fracción de filas que contienen al menos una instancia de cada valor. Es nulo si |
Columnas que no aplican en Hologres: correlation, elem_count_histogram.
pg_catalog.pg_roles
Esta tabla enumera todos los roles en una instancia de Hologres y sus permisos.
|
Columna |
Descripción |
|
|
El nombre del rol. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
El número máximo de conexiones simultáneas que el rol puede establecer. Si el valor es |
|
|
El OID único del rol. |
Columnas que no aplican en Hologres: rolreplication, rolpassword, rolvaliduntil, rolbypassrls, rolconfig.
information_schema.role_table_grants
Esta tabla enumera los permisos otorgados a roles sobre tablas y vistas en una instancia de Hologres.
|
Columna |
Descripción |
|
|
El rol que otorgó el permiso. |
|
|
El rol que recibió el permiso. |
|
|
El nombre de la base de datos. |
|
|
El nombre del esquema. |
|
|
El nombre de la tabla. |
|
|
El tipo de permiso otorgado. Valores válidos: |
|
|
|
|
|
|
Consultas SQL comunes
Todas las consultas de esta sección se pueden ejecutar mediante psql o cualquier cliente compatible con PostgreSQL.
Consultar propiedades e índices de tablas
SELECT * FROM hologres.hg_table_properties WHERE table_name = '<table_name>';
Obtener el DDL de una tabla o vista
-- Retrieve the DDL for a table
SELECT hg_dump_script('<table_name>');
-- Retrieve the DDL for a view
SELECT hg_dump_script('<view_name>');
Si la consulta falla, instale primero la extensión hg_toolkit:
CREATE EXTENSION hg_toolkit;
Consultar el endpoint de la instancia
SHOW hg_frontend_endpoints;
Listar todas las bases de datos en la instancia actual
SELECT
d.datname AS "Name",
pg_catalog.pg_get_userbyid(d.datdba) AS "Owner",
pg_catalog.pg_encoding_to_char(d.encoding) AS "Encoding",
d.datcollate AS "Collate",
d.datctype AS "Ctype",
pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
WHERE d.datname != 'postgres'
AND d.datname != 'template0'
AND d.datname != 'template1'
ORDER BY 1;
Listar todas las asignaciones de usuarios en la base de datos actual
SELECT
um.srvname AS "Server",
um.usename AS "User name"
FROM pg_catalog.pg_user_mappings um
WHERE um.srvname != 'query_log_store_server'
ORDER BY 1, 2;
Listar todos los esquemas en la base de datos actual
SELECT
n.nspname AS "Name",
pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_'
AND n.nspname <> 'information_schema'
AND n.nspname != 'hologres'
AND n.nspname != 'hologres_sample'
AND n.nspname != 'hologres_statistic'
AND n.nspname !~ '^hg_'
AND n.nspname !~ '^holo_'
ORDER BY 1;
Listar todas las tablas, tablas externas y vistas en la base de datos actual
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'partitioned table'
WHEN 'I' THEN 'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;
Listar todas las tablas y propietarios en el esquema actual (excluyendo tablas del sistema)
-- Include system tables
SELECT * FROM pg_tables;
-- Exclude system tables
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'partitioned table'
WHEN 'I' THEN 'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;
Listar tablas hijas de una tabla padre
-- With partition key values
SELECT
c.oid::pg_catalog.regclass,
c.relkind,
pg_catalog.pg_get_expr(c.relpartbound, c.oid)
FROM pg_catalog.pg_class c, pg_catalog.pg_inherits i
WHERE c.oid = i.inhrelid
AND i.inhparent::pg_catalog.regclass = '<parent_table_name>'::pg_catalog.regclass
ORDER BY pg_catalog.pg_get_expr(c.relpartbound, c.oid) = 'DEFAULT';
-- Without partition key values
SELECT
nmsp_parent.nspname AS parent_schema,
parent.relname AS parent,
nmsp_child.nspname AS child_schema,
child.relname AS child
FROM pg_inherits
JOIN pg_class parent ON pg_inherits.inhparent = parent.oid
JOIN pg_class child ON pg_inherits.inhrelid = child.oid
JOIN pg_namespace nmsp_parent ON nmsp_parent.oid = parent.relnamespace
JOIN pg_namespace nmsp_child ON nmsp_child.oid = child.relnamespace
WHERE parent.relname = '<parent_table_name>';
Listar tablas hijas con fecha de creación y tabla padre
SELECT
cn.nspname AS child_schema_name,
c.relname AS child_table_name,
pn.nspname AS parent_schema_name,
p.relname AS parent_table_name,
to_timestamp(cp.property_value::bigint) AS create_time
FROM pg_inherits i
LEFT JOIN pg_class p ON p.oid = i.inhparent
LEFT JOIN pg_namespace pn ON pn.oid = p.relnamespace
LEFT JOIN pg_class c ON c.oid = i.inhrelid
LEFT JOIN pg_namespace cn ON cn.oid = c.relnamespace
LEFT JOIN hologres.hg_table_properties cp
ON cp.property_key = 'create_time'
AND cp.table_namespace = pn.nspname
AND cp.table_name = c.relname;
Listar todas las tablas externas y sus tablas correspondientes de MaxCompute
SELECT
n.nspname,
c.relname,
s.srvname,
pg_catalog.array_to_string(
ARRAY(
SELECT pg_catalog.quote_ident(option_name) || ' ' || pg_catalog.quote_literal(option_value)
FROM pg_catalog.pg_options_to_table(ftoptions)
),
', '
)
FROM pg_catalog.pg_foreign_table f,
pg_catalog.pg_foreign_server s,
pg_catalog.pg_class c,
pg_catalog.pg_namespace n
WHERE s.oid = f.ftserver
AND c.oid = f.ftrelid
AND c.relnamespace = n.oid
AND n.nspname NOT IN ('hologres', 'hologres_statistic', 'pg_catalog', 'pg_toast');
Listar todas las vistas en la base de datos actual
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'partitioned table'
WHEN 'I' THEN 'partitioned index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('v', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;
Buscar vistas que dependen de una tabla
SELECT * FROM information_schema.view_table_usage WHERE table_name = '<table_name>';
Consultar comentarios de columnas y comentarios de tablas
-- Query column comments for a table
SELECT
a.attname AS "Column",
pg_catalog.format_type(a.atttypid, a.atttypmod) AS "Type",
a.attnotnull AS "Nullable",
pg_catalog.col_description(a.attrelid, a.attnum) AS "Description"
FROM pg_catalog.pg_attribute a
WHERE a.attnum > 0
AND NOT a.attisdropped
AND a.attrelid = '<schema_name>.<table_name>'::regclass::oid
ORDER BY a.attnum;
Reemplace <schema_name>.<table_name> con el nombre real del esquema y de la tabla.
-- Query table comments and related metadata (owner, size)
SELECT
n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'table'
WHEN 'I' THEN 'index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner",
pg_catalog.pg_size_pretty(pg_catalog.pg_table_size(c.oid)) AS "Size",
pg_catalog.obj_description(c.oid, 'pg_class') AS "Description"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r', 'p', 'v', 'm', 'S', 'f', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;
-- Query the comment on a specific table
SELECT pg_catalog.obj_description('<table_name>'::regclass::oid, 'pg_class') AS "Description";
Listar todos los usuarios y roles en una base de datos
SELECT
r.rolname,
r.rolsuper,
r.rolinherit,
r.rolcreaterole,
r.rolcreatedb,
r.rolcanlogin,
r.rolconnlimit,
r.rolvaliduntil,
ARRAY(
SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid
) AS memberof,
r.rolreplication,
r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
AND r.rolname != 'holo_admin'
ORDER BY 1;
Listar todas las extensiones en una base de datos
SELECT
e.extname AS "Name",
e.extversion AS "Version",
n.nspname AS "Schema",
c.description AS "Description"
FROM pg_catalog.pg_extension e
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace
LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid
AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass
WHERE e.extname != 'hg_admin_cmd'
AND e.extname != 'holo_dump_stat'
AND e.extname != 'holo_funcs'
AND e.extname != 'holo_link'
AND e.extname != 'holo_system_admin'
AND e.extname != 'query_log'
AND e.extname != 'plpgsql'
ORDER BY 1;
Comprobar los permisos de una cuenta
SELECT * FROM pg_roles WHERE rolname = '<uid>';
Listar todos los usuarios de una instancia y sus permisos
SELECT
r.rolname,
r.rolsuper,
r.rolinherit,
r.rolcreaterole,
r.rolcreatedb,
r.rolcanlogin,
r.rolconnlimit,
r.rolvaliduntil,
ARRAY(
SELECT b.rolname
FROM pg_catalog.pg_auth_members m
JOIN pg_catalog.pg_roles b ON (m.roleid = b.oid)
WHERE m.member = r.oid
) AS memberof,
r.rolreplication,
r.rolbypassrls
FROM pg_catalog.pg_roles r
WHERE r.rolname !~ '^pg_'
ORDER BY 1;
Listar todas las tablas sobre las que un usuario tiene permisos
SELECT
current_database()::information_schema.sql_identifier AS table_catalog,
nc.nspname::information_schema.sql_identifier AS table_schema,
c.relname::information_schema.sql_identifier AS table_name,
CASE
WHEN nc.oid = pg_my_temp_schema() THEN 'LOCAL TEMPORARY'::text
WHEN c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"]) THEN 'BASE TABLE'::text
WHEN c.relkind = 'v'::"char" THEN 'VIEW'::text
WHEN c.relkind = 'f'::"char" THEN 'FOREIGN'::text
ELSE NULL::text
END::information_schema.character_data AS table_type,
CASE
WHEN (c.relkind = ANY (ARRAY['r'::"char", 'p'::"char"]))
OR (c.relkind = ANY (ARRAY['v'::"char", 'f'::"char"])
AND (pg_relation_is_updatable(c.oid::regclass, false) & 8) = 8)
THEN 'YES'::text
ELSE 'NO'::text
END::information_schema.yes_or_no AS is_insertable_into,
CASE
WHEN t.typname IS NOT NULL THEN 'YES'::text
ELSE 'NO'::text
END::information_schema.yes_or_no AS is_typed,
NULL::character varying::information_schema.character_data AS commit_action
FROM pg_namespace nc
JOIN pg_class c ON nc.oid = c.relnamespace
LEFT JOIN (pg_type t JOIN pg_namespace nt ON t.typnamespace = nt.oid) ON c.reloftype = t.oid
WHERE (c.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'f'::"char", 'p'::"char"]))
AND NOT pg_is_other_temp_schema(nc.oid)
AND (
pg_has_role('<user_id>', c.relowner, 'USAGE'::text)
OR has_table_privilege('<user_id>', c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER'::text)
OR has_any_column_privilege('<user_id>', c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'::text)
);
Reemplace <user_id> con el ID de usuario real.
Listar todos los usuarios que tienen permisos sobre una tabla
SELECT rolname
FROM pg_roles
WHERE has_table_privilege(rolname, '<schema_name>.<table_name>',
'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER');
Reemplace <schema_name>.<table_name> con el nombre real del esquema y de la tabla.