Re: GRANT SELECT para todas las tablas de una base

Lists: pgsql-es-ayuda
From: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: GRANT SELECT para todas las tablas de una base
Date: 2009-09-16 12:54:23
Message-ID: 15aa6b3e0909160554i18b804fbyd420efda021e0df1@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Hola lista, tengo la sgte. duda, en un servidor viejito corriendo Pg
7.4 necesito crear un usuario pero que sólo pueda realizar consultas
sobra una base de datos, creé el usuario y ahora necesito asignarle
los privilegios select pero necesito saber si hay alguna manera de
hacerlo automáticamente sin necesidad de asignarlos tabla por tabla.
Se me ocurrió escribir una función, pero si alguno conoce otra manera
rápido agradecido ;)

Sergio Gabriel Rodríguez
http://www.3trex.com.ar


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-16 13:16:21
Message-ID: 20090916131621.GD13076@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Sergio Gabriel Rodriguez escribió:
> Hola lista, tengo la sgte. duda, en un servidor viejito corriendo Pg
> 7.4 necesito crear un usuario pero que sólo pueda realizar consultas
> sobra una base de datos, creé el usuario y ahora necesito asignarle
> los privilegios select pero necesito saber si hay alguna manera de
> hacerlo automáticamente sin necesidad de asignarlos tabla por tabla.
> Se me ocurrió escribir una función, pero si alguno conoce otra manera
> rápido agradecido ;)

Creo que te toca escribir la función.

--
Alvaro Herrera http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"Linux transformó mi computadora, de una `máquina para hacer cosas',
en un aparato realmente entretenido, sobre el cual cada día aprendo
algo nuevo" (Jaime Salinas)


From: Edwin Quijada <listas_quijada(at)hotmail(dot)com>
To: <sgrodriguez(at)gmail(dot)com>, <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: RE: GRANT SELECT para todas las tablas de una base
Date: 2009-09-16 13:48:10
Message-ID: BLU137-W15354469FED941A646EB05E3E20@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda


No hay. Solo que hagas un script en algun lenguaje y lo corras sino sera tabla por tabla.

*-------------------------------------------------------*
*-Edwin Quijada
*-Developer DataBase
*-JQ Microsistemas

*-Soporte PostgreSQL

*-www.jqmicrosistemas.com
*-809-849-8087
*-------------------------------------------------------*

----------------------------------------
> Date: Wed, 16 Sep 2009 09:54:23 -0300
> Subject: [pgsql-es-ayuda] GRANT SELECT para todas las tablas de una base
> From: sgrodriguez(at)gmail(dot)com
> To: pgsql-es-ayuda(at)postgresql(dot)org
>
> Hola lista, tengo la sgte. duda, en un servidor viejito corriendo Pg
> 7.4 necesito crear un usuario pero que sólo pueda realizar consultas
> sobra una base de datos, creé el usuario y ahora necesito asignarle
> los privilegios select pero necesito saber si hay alguna manera de
> hacerlo automáticamente sin necesidad de asignarlos tabla por tabla.
> Se me ocurrió escribir una función, pero si alguno conoce otra manera
> rápido agradecido ;)
>
>
>
> Sergio Gabriel Rodríguez
> http://www.3trex.com.ar
> --
> TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envía "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
_________________________________________________________________


From: Lennin Caro <lennin(dot)caro(at)yahoo(dot)com>
To: sgrodriguez(at)gmail(dot)com, pgsql-es-ayuda(at)postgresql(dot)org, Edwin Quijada <listas_quijada(at)hotmail(dot)com>
Subject: RE: GRANT SELECT para todas las tablas de una base
Date: 2009-09-16 14:21:21
Message-ID: 318298.18055.qm@web59515.mail.ac4.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

--- On Wed, 9/16/09, Edwin Quijada <listas_quijada(at)hotmail(dot)com> wrote:

From: Edwin Quijada <listas_quijada(at)hotmail(dot)com>
Subject: RE: [pgsql-es-ayuda] GRANT SELECT para todas las tablas de una base
To: sgrodriguez(at)gmail(dot)com, pgsql-es-ayuda(at)postgresql(dot)org
Date: Wednesday, September 16, 2009, 1:48 PM

No hay. Solo que hagas un script en algun lenguaje y lo corras sino sera tabla por tabla.

*-------------------------------------------------------*
*-Edwin Quijada
*-Developer DataBase
*-JQ Microsistemas

*-Soporte PostgreSQL

*-www.jqmicrosistemas.com
*-809-849-8087
*-------------------------------------------------------*

----------------------------------------
> Date: Wed, 16 Sep 2009 09:54:23 -0300
> Subject: [pgsql-es-ayuda] GRANT SELECT para todas las tablas de una base
> From: sgrodriguez(at)gmail(dot)com
> To: pgsql-es-ayuda(at)postgresql(dot)org
>
> Hola lista, tengo la sgte. duda, en un servidor viejito corriendo Pg
> 7.4 necesito crear un usuario pero que sólo pueda realizar consultas
> sobra una base de datos, creé el usuario y ahora necesito asignarle
> los privilegios select pero necesito saber si hay alguna manera de
> hacerlo automáticamente sin necesidad de asignarlos tabla por tabla.
> Se me ocurrió escribir una función, pero si alguno conoce otra manera
> rápido agradecido ;)
>
>
>
> Sergio Gabriel Rodríguez
> http://www.3trex.com.ar
> --
> TIP 2: puedes desuscribirte de todas las listas simultáneamente
> (envía "unregister TuDirecciónDeCorreo" a majordomo(at)postgresql(dot)org)
_________________________________________________________________

--
TIP 8: explain analyze es tu amigo

por pgadmin puedes usar la opcion grant wizard y seleccionar todas las tablas y asignarle el privilegio y usuario deseado

Ing. Lennin Caro Pérez

Usuario:GNU/LINUX

PHP Developer

PostgreSQL DBA

Oracle DBA

Linux counter id 474393


From: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
To: Lennin Caro <lennin(dot)caro(at)yahoo(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org, Edwin Quijada <listas_quijada(at)hotmail(dot)com>, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-16 14:45:35
Message-ID: 15aa6b3e0909160745hd4a08a9tc462dce562baff11@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Gracias a todos por las respuestas, Lennin me llegó medio tarde tu consejo,
pero lo voy a tener en cuenta para la próxima, dejo mi precaria función para
el que la necesite o el que quiera corregirla:

CREATE OR REPLACE FUNCTION "public"."dar_permisos" (esquema varchar, usuario
varchar, privilegio varchar) RETURNS boolean AS
$BODY$
DECLARE
registro record;
BEGIN
FOR registro IN SELECT * FROM pg_tables WHERE schemaname= esquema LOOP
EXECUTE 'GRANT ' || privilegio || ' ON ' || esquema || '.' ||
registro.tablename || ' TO ' || usuario;
END LOOP;
RETURN TRUE;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE

Sergio Gabriel Rodríguez
http://www.3trex.com.ar


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
Cc: Lennin Caro <lennin(dot)caro(at)yahoo(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org, Edwin Quijada <listas_quijada(at)hotmail(dot)com>
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-17 03:59:15
Message-ID: 20090917035915.GH13076@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Sergio Gabriel Rodriguez escribió:
> Gracias a todos por las respuestas, Lennin me llegó medio tarde tu consejo,
> pero lo voy a tener en cuenta para la próxima, dejo mi precaria función para
> el que la necesite o el que quiera corregirla:
>
> CREATE OR REPLACE FUNCTION "public"."dar_permisos" (esquema varchar, usuario
> varchar, privilegio varchar) RETURNS boolean AS
> $BODY$
> DECLARE
> registro record;
> BEGIN
> FOR registro IN SELECT * FROM pg_tables WHERE schemaname= esquema LOOP
> EXECUTE 'GRANT ' || privilegio || ' ON ' || esquema || '.' ||
> registro.tablename || ' TO ' || usuario;
> END LOOP;
> RETURN TRUE;
> END;
> $body$
> LANGUAGE 'plpgsql' VOLATILE

Prueba esto:

create schema "mi esquema" create table "mi tabla" ();
select dar_permisos("mi esquema", current_user, 'all');

--
Alvaro Herrera http://www.flickr.com/photos/alvherre/
"No hay cielo posible sin hundir nuestras raíces
en la profundidad de la tierra" (Malucha Pinto)


From: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Lennin Caro <lennin(dot)caro(at)yahoo(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org, Edwin Quijada <listas_quijada(at)hotmail(dot)com>
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-17 10:49:58
Message-ID: 15aa6b3e0909170349p74c5231bj2c1b79f0a348dde3@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

>
>
> Prueba esto:
>
> create schema "mi esquema" create table "mi tabla" ();
> select dar_permisos("mi esquema", current_user, 'all');
>
>
Alvaro, cambié el type del parámetro usuario de varchar a name:

CREATE OR REPLACE FUNCTION "public"."dar_permisos" (esquema varchar, usuario
name, privilegio varchar)
....

no se si te referías a esto

Sergio Gabriel Rodríguez
http://www.3trex.com.ar


From: juan <juanramirez(at)cajazacate(dot)com(dot)sv>
To: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-17 14:07:06
Message-ID: 4AB2428A.20004@cajazacate.com.sv
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Sergio Gabriel Rodriguez escribió:
>> Prueba esto:
>> create schema "mi esquema" create table "mi tabla" ();
>> select dar_permisos("mi esquema", current_user, 'all');
>>
>>
> Alvaro, cambié el type del parámetro usuario de varchar a name:
> no se si te referías a esto

Para saber si se refería a eso, tendrías que haber echo la prueba tal
como el te sugirió.

--
Cordialmente,
Juan Ramírez Miranda
El Salvador


From: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
To: juan <juanramirez(at)cajazacate(dot)com(dot)sv>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-17 14:21:12
Message-ID: 15aa6b3e0909170721l135a3a5fo1bf590fe7d2afd35@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

2009/9/17 juan <juanramirez(at)cajazacate(dot)com(dot)sv>

> Sergio Gabriel Rodriguez escribió:
>
>> Prueba esto:
>>> create schema "mi esquema" create table "mi tabla" ();
>>> select dar_permisos("mi esquema", current_user, 'all');
>>>
>>>
>>> Alvaro, cambié el type del parámetro usuario de varchar a name:
>> no se si te referías a esto
>>
>
> Para saber si se refería a eso, tendrías que haber echo la prueba tal como
> el te sugirió.
>
>
> --
> Cordialmente,
> Juan Ramírez Miranda
> El Salvador
>

Juan, ya había hecho la prueba, sólo que no copié el resultado de la misma,
perdón:

ERROR: no existe la función public.dar_permisos("unknown", name,
"unknown")
HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede
desear agregar conversión explícita de tipos

current_user devuelve un tipo de dato name

Sergio Gabriel Rodríguez
http://www.3trex.com.ar


From: juan <juanramirez(at)cajazacate(dot)com(dot)sv>
To: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-17 15:11:57
Message-ID: 4AB251BD.6060309@cajazacate.com.sv
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Sergio Gabriel Rodriguez escribió:
> Juan, ya había hecho la prueba, sólo que no copié el resultado de la misma,
> perdón:
>
> ERROR: no existe la función public.dar_permisos("unknown", name,
> "unknown")
> HINT: Ninguna función coincide en el nombre y tipos de argumentos. Puede
> desear agregar conversión explícita de tipos

Luego de haber echo el cambio que dices, volviste a hacer la prueba que
sugiere Alvaro sin ningún problema?

>>>> create schema "mi esquema" create table "mi tabla" ();
>>>> select dar_permisos("mi esquema", current_user, 'all');

--
Cordialmente,
Juan Ramírez
El Salvador


From: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
To: juan <juanramirez(at)cajazacate(dot)com(dot)sv>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-17 15:44:39
Message-ID: 15aa6b3e0909170844x6922c301w98ed0f6cb68bd6e0@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

>
> Luego de haber echo el cambio que dices, volviste a hacer la prueba que
> sugiere Alvaro sin ningún problema?
>
>
> >>>> create schema "mi esquema" create table "mi tabla" ();
> >>>> select dar_permisos("mi esquema", current_user, 'all');
>

Si, anduvo bien, mi pregunta apunta a si hay algún otro error que no estoy
viendo

Sergio Gabriel Rodríguez
http://www.3trex.com.ar


From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
Cc: juan <juanramirez(at)cajazacate(dot)com(dot)sv>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-19 01:37:25
Message-ID: 20090919013725.GJ13076@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

Sergio Gabriel Rodriguez escribió:
> >
> > Luego de haber echo el cambio que dices, volviste a hacer la prueba que
> > sugiere Alvaro sin ningún problema?
> >
> >
> > >>>> create schema "mi esquema" create table "mi tabla" ();
> > >>>> select dar_permisos("mi esquema", current_user, 'all');
>
> Si, anduvo bien, mi pregunta apunta a si hay algún otro error que no estoy
> viendo

¿Funciona realmente? Lo que quería hacerte notar es que debes usar
quote_ident:

CREATE OR REPLACE FUNCTION "public"."dar_permisos" (esquema varchar, usuario varchar, privilegio varchar) RETURNS boolean AS
$BODY$
DECLARE
registro record;
BEGIN
FOR registro IN SELECT * FROM pg_tables WHERE schemaname= esquema LOOP
EXECUTE 'GRANT ' || privilegio || ' ON ' || quote_ident(esquema) || '.' ||
quote_ident(registro.tablename) || ' TO ' || quote_ident(usuario);
END LOOP;
RETURN TRUE;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE ;

--
Alvaro Herrera http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"In a specialized industrial society, it would be a disaster
to have kids running around loose." (Paul Graham)


From: Sergio Gabriel Rodriguez <sgrodriguez(at)gmail(dot)com>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: juan <juanramirez(at)cajazacate(dot)com(dot)sv>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: GRANT SELECT para todas las tablas de una base
Date: 2009-09-19 02:08:31
Message-ID: 15aa6b3e0909181908q7ab63224oa2faa65f72841add@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-es-ayuda

On Fri, Sep 18, 2009 at 10:37 PM, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>wrote:

> Sergio Gabriel Rodriguez escribió:
> > >
> > > Luego de haber echo el cambio que dices, volviste a hacer la prueba que
> > > sugiere Alvaro sin ningún problema?
> > >
> > >
> > > >>>> create schema "mi esquema" create table "mi tabla" ();
> > > >>>> select dar_permisos("mi esquema", current_user, 'all');
> >
> > Si, anduvo bien, mi pregunta apunta a si hay algún otro error que no
> estoy
> > viendo
>
> ¿Funciona realmente? Lo que quería hacerte notar es que debes usar
> quote_ident:
>
> CREATE OR REPLACE FUNCTION "public"."dar_permisos" (esquema varchar,
> usuario varchar, privilegio varchar) RETURNS boolean AS
> $BODY$
> DECLARE
> registro record;
> BEGIN
> FOR registro IN SELECT * FROM pg_tables WHERE schemaname= esquema LOOP
> EXECUTE 'GRANT ' || privilegio || ' ON ' || quote_ident(esquema)
> || '.' ||
> quote_ident(registro.tablename) || ' TO ' || quote_ident(usuario);
> END LOOP;
> RETURN TRUE;
> END;
> $BODY$
> LANGUAGE 'plpgsql' VOLATILE ;

Gracias Alvaro, si funcionó, pero pensé que apuntabas al tipo de dato de
current_user y cambié el parámetro usuario de varchar a name, no noté lo de
quote_indent lo voy a probar

Sergio Gabriel Rodríguez
http://www.3trex.com.ar