2012-05-08 23 views
18

¿Cómo otorgas acceso de lectura/selección en todas las funciones y vistas a un usuario arbitrario?Cómo otorgar todos los privilegios en vistas a usuarios arbitrarios

utilizo psql --user=postgres -d mydb -f myview.sql para crear varias funciones y puntos de vista, y luego corro:

GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser; 

que se ha concedido todos los privilegios, yo esperaría myuser tener ahora acceso a las funciones y las vistas creadas por el usuario postgres . Sin embargo, cuando intento acceder a ellos con myuser, aparece un error de "permiso denegado por relación ...". ¿Por qué es esto?

Respuesta

25

La razón es que necesita privilegios adicionales para acceder a una vista o tabla. Los privilegios en la base de datos no cubren el acceso a todos los objetos en él.

Es diferente con funciones: EXECUTE se otorga privilegio a public de forma predeterminada. Pero la función se ejecuta con los privilegios del usuario actual. Puede estar interesado en el modificador SECURITY DEFINER para CREATE FUNCTION. Pero normalmente es suficiente para otorgar SELECT en las tablas involucradas.

Per documentation about default privileges:

Dependiendo del tipo de objeto, los privilegios por defecto inicial podría incluyen la concesión de algunos privilegios a PUBLIC. El valor predeterminado no es el acceso público para tablas, columnas, esquemas y espacios de tabla; CONNECT privilegio y TEMP privilegio de creación de tabla para bases de datos; EXECUTE privilegio para funciones; y privilegio USAGE para idiomas.

Usted puede estar interesado en este comando DDL (requiere Postgres 9,0 o posterior):

GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser; 

Mientras está conectado a la base de datos en cuestión, por supuesto (ver @marcel's comment más adelante), y como usuario con suficientes privilegios. Usted también podría estar interesado en el DEFAULT PRIVILEGES ajuste:

respuesta más detallada privilegios cómo gestionar:

pgAdmin tiene una característica F u operaciones a granel más sofisticados:

enter image description here

O puede consultar los catálogos del sistema para crear sentencias DDL para mayor concesión/revocación ...

+2

Me tomó una hora darme cuenta de que 'GRANT SELECT EN TODAS LAS TABLAS EN SCHEMA public TO myuser;' solo tiene sentido cuando este comando se ejecuta cuando el usuario que otorga está * CONNECTED * en esa base de datos. Si no, simplemente no hace nada (o al menos no da el permiso de selección para el usuario). En el shell del superusuario use \ c databasename. – marcel

+0

@marcel: Agregué una nota para recordarle a la gente. –

+0

Esto no otorga permiso al usuario para las secuencias. – Cerin

Cuestiones relacionadas