Conceder acceso a todas las tablas a un usuario


151

Soy nuevo en Postgres e intento migrar nuestras bases de datos MySQL. En MySQL puedo conceder SELECT, UPDATE, INSERT, y DELETEprivilegios de un usuario con privilegios bajos y permitir que esas subvenciones a aplicarse a todas las tablas de una base de datos especificada. Debo perder algo en Postgres porque parece que tengo que otorgar esos privilegios para cada tabla de uno en uno. Con muchas bases de datos y cientos de tablas por base de datos que parece una tarea desalentadora solo para despegar. Además, una vez que una base de datos está en funcionamiento, la adición de tablas ocurre con la frecuencia suficiente para que no quiera tener que otorgar permisos cada vez, a menos que sea absolutamente necesario.

¿Cómo se logra esto mejor?

Respuestas:


175

Primero, debe poder conectarse a la base de datos para ejecutar consultas. Esto se puede lograr mediante

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
ON DATABASE database_name 
TO user_name;

El REVOKEes necesario porque

La palabra clave PUBLIC indica que los privilegios se otorgarán a todos los roles, incluidos los que se puedan crear más adelante. PÚBLICO puede considerarse como un grupo definido implícitamente que siempre incluye todos los roles. Cualquier rol en particular tendrá la suma de privilegios otorgados directamente, privilegios otorgados a cualquier rol del que actualmente sea miembro y privilegios otorgados a PUBLIC.

Si realmente desea restringir a su usuario a las declaraciones DML, entonces tiene un poco más que hacer:

REVOKE ALL
ON ALL TABLES IN SCHEMA public 
FROM PUBLIC;

GRANT SELECT, INSERT, UPDATE, DELETE
ON ALL TABLES IN SCHEMA public 
TO user_name;

Estos suponen que solo tendrá un esquema (que se denomina 'público' por defecto).

Como Jack Douglas señaló, lo anterior solo otorga los privilegios para las tablas ya existentes . Para lograr lo mismo para las tablas futuras, debe definir los privilegios predeterminados :

ALTER DEFAULT PRIVILEGES 
    FOR ROLE some_role   -- Alternatively "FOR USER"
    IN SCHEMA public
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO user_name;

Aquí, some_rolees un rol que crea las tablas, mientras que user_namees el que obtiene los privilegios. Para definir esto, debe iniciar sesión como some_rolemiembro de este.

Y, finalmente, debe hacer lo mismo para las secuencias (gracias a PlaidFan por señalarlo): aquí es el USAGEprivilegio que necesita.


1
Gracias, FOR some_rolefue la parte clave que me faltaba para que funcione para mis tablas creadas más tarde. Pero no tuve que iniciar sesión como some_role, también funcionó si ejecuté la consulta como el postgresusuario administrador predeterminado .
JustAMartin

54

suponiendo que desea darles todos los privilegios, haga esto:

grant all privileges on database dbname to dbuser;

donde dbnameestá el nombre de su base de datos y dbuseres el nombre del usuario.


44
Esto añadirá los siguientes privilegios en la base de datos : CREATE, CONNECT, TEMPORARY. Sin privilegios en las mesas.
dezso

13
Un comando similar para todas las tablas sería,GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO dbuser;
Dolan Antenucci

55
También me pareció útil:GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO dbuser;
Paolo

18

La concesión de todos los privilegios a todas las tablas dentro de la base de datos se logra con

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema_name> TO <username>;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA <schema_name> TO <username>;

15

Puede ser que estaba haciendo algo mal aquí, ya que soy muy nuevo en PostgreSQL. Pero esto solo resolvió la primera parte del problema para mí: establecer los privilegios en todas las tablas existentes.

Para que los permisos se configuren correctamente para mi usuario en las tablas nuevas, que se crean, tengo que establecer permisos predeterminados para el usuario:

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO user_name;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, USAGE ON sequences TO user_name;

2
--Create User

CREATE USER my_user_test WITH LOGIN NOSUPERUSER NOCREATEDB  NOCREATEROLE    INHERIT NOREPLICATION   CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

-- Grant connect to my data base

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

-- Grant usage the schema

GRANT USAGE ON SCHEMA my_sch_test TO my_user_test ;

-- Grant all table for SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA my_sch_test TO my_user_test;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.