Recabamos en todo el mundo on line y de esta manera mostrarte la solución para tu inquietud, si continúas con alguna inquietud puedes dejar la inquietud y contestaremos con gusto.
Solución:
en consola util psql:
dn+
te mostrará
Name | Owner | Access privileges | Description
Enumere todos los esquemas con sus privilegios para el usuario actual:
WITH "names"("name") AS (
SELECT n.nspname AS "name"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_'
AND n.nspname <> 'information_schema'
) SELECT "name",
pg_catalog.has_schema_privilege(current_user, "name", 'CREATE') AS "create",
pg_catalog.has_schema_privilege(current_user, "name", 'USAGE') AS "usage"
FROM "names";
La respuesta será por ejemplo:
name | create | usage
---------+--------+-------
public | t | t
test | t | t
awesome | f | f
(3 rows)
En este ejemplo, el usuario actual no es propietario de la awesome
esquema.
Como puede adivinar, una solicitud similar para un esquema particular:
SELECT
pg_catalog.has_schema_privilege(
current_user, 'awesome', 'CREATE') AS "create",
pg_catalog.has_schema_privilege(
current_user, 'awesome', 'USAGE') AS "usage";
y respuesta:
create | usage
--------+-------
f | f
Como sabes, es posible usar pg_catalog.current_schema()
para el esquema actual.
De todos los privilegios posibles
-- SELECT
-- INSERT
-- UPDATE
-- DELETE
-- TRUNCATE
-- REFERENCES
-- TRIGGER
-- CREATE
-- CONNECT
-- TEMP
-- EXECUTE
-- USAGE
lo único CREATE
y USAGE
permitido para los esquemas.
Como el current_schema()
la current_user
puede ser reemplazado con un rol particular.
PRIMA con current
columna
WITH "names"("name") AS (
SELECT n.nspname AS "name"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_'
AND n.nspname <> 'information_schema'
) SELECT "name",
pg_catalog.has_schema_privilege(current_user, "name", 'CREATE') AS "create",
pg_catalog.has_schema_privilege(current_user, "name", 'USAGE') AS "usage",
"name" = pg_catalog.current_schema() AS "current"
FROM "names";
-- name | create | usage | current
-- ---------+--------+-------+---------
-- public | t | t | t
-- test | t | t | f
-- awesome | f | f | f
-- (3 rows)
CON | Funciones de información del sistema | CONCESIÓN (privilegios)
Los privilegios se almacenan en el campo nspacl de pg_namespace. Ya que es un array campo, tienes que hacer un poco de codificación elegante para analizarlo. Esta consulta le dará las declaraciones de concesión utilizadas para usuarios y grupos:
select
'grant ' || substring(
case when charindex('U',split_part(split_part(array_to_string(nspacl, '|'),pu.usename,2 ) ,'/',1)) > 0 then ',usage ' else '' end
||case when charindex('C',split_part(split_part(array_to_string(nspacl, '|'),pu.usename,2 ) ,'/',1)) > 0 then ',create ' else '' end
, 2,10000)
|| ' on schema '||nspname||' to "'||pu.usename||'";'
from pg_namespace pn,pg_user pu
where array_to_string(nspacl,',') like '%'||pu.usename||'%' --and pu.usename=''
and nspowner > 1
union
select
'grant ' || substring(
case when charindex('U',split_part(split_part(array_to_string(nspacl, '|'),pg.groname,2 ) ,'/',1)) > 0 then ',usage ' else '' end
||case when charindex('C',split_part(split_part(array_to_string(nspacl, '|'),pg.groname,2 ) ,'/',1)) > 0 then ',create ' else '' end
, 2,10000)
|| ' on schema '||nspname||' to group "'||pg.groname||'";'
from pg_namespace pn,pg_group pg
where array_to_string(nspacl,',') like '%'||pg.groname||'%' --and pg.groname=''
and nspowner > 1
Si te sientes motivado, tienes la habilidad dejar una noticia acerca de qué te ha impresionado de este artículo.