On 06/26/2012 02:39 PM, Felipe Montecino wrote:

Prueba el script y luego me confirmas. Al menos en mi caso particular no debo darle todos los permisos como tu. Asi que deberas cambiar SELECT por lo que te sirva.

El 26/06/2012 14:50, "Guillermo Villanueva" <[email protected] <mailto:[email protected]>> escribió:

    Muchas gracias Felipe!



    El día 25 de junio de 2012 16:23, Felipe Montecino <[email protected]
    <mailto:[email protected]>> escribió:
    > Como les mencione, hice un script para poder dar permisos a las
    bases de
    > datos si bien no es el mejor script del mundo pero como
    mencionaban mas
    > arriba me encontraba en la misma situacion.
    >
    > 1.- crear archivo pgpass para que el script no pregunte password
    1 millon de
    > veces (dependera de las tablas que hayan en la bd).
    >
    > cat > .pgpass << EOF
    > localhost:5432:somebd:someuser:somepasswd
    > EOF
    >
    > 1.1.- cambiar permisos de solo lectura y escritura para el usuario.
    >
    > chmod 600 .pgpass
    >
    > 2.- crear archivo bd.sql, este script listara las tablas,
    secuencias, etc.
    >
    > cat > bd.sql << EOF
    > \c somebd
    > \d
    > EOF
    >
    > 3.- script en bash que asigna permisos para que solamente pueda
    hacer
    > select's para mas informacion podrian visitar el siguiente enlace:
    > http://www.postgresql.org/docs/9.0/static/sql-grant.html
    >
    > Por command line:
    >
    > for table in $(psql -Usomeuser <  bd.sql | grep -r public | awk
    '{print
    > $3}'); do psql -Usomeuser -dsomebd -c "grant select on
    public.$table to
    > USERWITHGRANT with grant option"; done
    >
    > Donde USERWITHGRANT sera el otro usuario no owner con permisos
    de SELECT
    > sobre las tablas de la bd.
    >
    > La salida del comando deberia ser algo como ...
    >
    > GRANT
    > GRANT
    > GRANT
    > GRANT
    > GRANT
    > GRANT
    > GRANT
    > GRANT
    >
    > Dependera de los parametros que le pasemos al psql para poder
    mas detalle.
    >
    > Saludos.
    >
    > El 25 de junio de 2012 13:22, Felipe Montecino <[email protected]
    <mailto:[email protected]>> escribió:
    >
    >> Encontre la forma de hacerlo. En un rato mas les envio el
    script :).
    >>
    >> El 23/06/2012 23:09, "Alvaro Herrera" <[email protected]
    <mailto:[email protected]>> escribió:
    >>
    >>>
    >>> Excerpts from Guillermo Villanueva's message of sáb jun 23
    21:28:45 -0400
    >>> 2012:
    >>>
    >>> > El 22 de junio de 2012 19:31, Alvaro Herrera
    >>> > <[email protected]
    <mailto:[email protected]>>escribió:
    >>>
    >>> > > Podrías, por ejemplo, tener roles "dueno_dbprod" y
    >>> > > "dueno_dbpruebas", y que el rol que usas tú para
    conectarte tenga
    >>> > > acceso
    >>> > > a ambos; en cambio a tu cumpa le das acceso solamente a
    >>> > > dueno_dbpruebas.
    >>> > >
    >>> > la idea está buena, pero vuelvo a lo mismo: dueno_dbprod lo
    pongo como
    >>> > owner de dbprod pero para que pueda hacer de todo en la
    dbpruebas
    >>> > deberé
    >>> > darle acceso uno por uno a cada uno de los objetos, como te
    digo, es
    >>> > una
    >>> > buena idea pero perdón por insistir, no resuelve mi problema
    principal:
    >>> > dar
    >>> > acceso completo a la base sin hacerlo owner.
    >>>
    >>> Entiendo tu punto, pero ¿qué diferencia hay entre el dueño de
    la BD y
    >>> otro usuario que puede hacer cualquier cosa?
    >>>
    >>> --
    >>> Álvaro Herrera <[email protected]
    <mailto:[email protected]>>
    >>> -
    >>> Enviado a la lista de correo pgsql-es-ayuda
    >>> ([email protected]
    <mailto:[email protected]>)
    >>> Para cambiar tu suscripción:
    >>> http://www.postgresql.org/mailpref/pgsql-es-ayuda
    >
    >
    >
    >
    > --
    >
    > --
    > Correo no firmado o cifrado
    >

Hola, yo quiero contribuir también con mis dos centavos en este respecto, por ejemplo:

--copiar y pegar la salida de este query

SELECT 'GRANT SELECT ON '|| type || ' ' ||name ||' TO myUsuario; ' FROM
(SELECT n.nspname as "schema",
  c.relname as "name",
CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' 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','')
      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) as listaObjetos
;

O si disponemos de una versión reciente de postgresql (9.x)

GRANT SELECT ON ALL TABLES IN schema public TO miUsuario;
GRANT SELECT ON ALL SEQUENCES IN schema public TO miUsuario;
GRANT SELECT ON ALL FUNCTIONS IN schema public TO miUsuario;

Saludos!
--
pglearn.blogspot.mx <http://pglearn.blogspot.mx/>
*Twitter* *iCodeiExist*

Responder a