2010-06-11 783 views
77

Estoy tratando de hacer usuarios de bases de datos restringidas para la aplicación en la que estoy trabajando, y quiero eliminar el usuario de la base de datos de Postgres que estoy usando para experimentar. ¿Hay alguna manera de dejar al usuario sin tener que revocar todos sus derechos manualmente o revocar todas las concesiones que tiene un usuario?PostgreSQL - cómo colocar rápidamente un usuario con privilegios existentes

Respuesta

84

¿Qué tal

DROP USER <username> 

Esto es en realidad un alias para DROP ROLE.

Tiene que explicity colocar cualquier privilegio asociado con ese usuario, también para mover su propiedad a otros roles (o soltar el objeto).

Esto se logra mejor mediante

REASSIGN OWNED BY <olduser> TO <newuser> 

y

DROP OWNED BY <olduser> 

Este último se eliminarán todos los privilegios concedidos al usuario.

Consulte los documentos de postgres para DROP ROLE y the more detailed description de esto.


Adición:

Al parecer, tratando de dejar caer un usuario mediante el uso de los comandos mencionados aquí sólo funcionará si se está ejecutando mientras están conectados a la misma base de datos que las subvenciones originales fueron hechos de, como se discute aquí:

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local

+9

Haciendo: 'CREATE TABLE foo (bar SERIAL); ALTER TABLE foo DUEÑO PARA postgres; CREAR USUARIO usuario de prueba; OTORGAR TODO EN foo TO testuser; DROP USER testuser' dio los mensajes de error: 'ERROR: role" testuser "no puede descartarse porque algunos objetos dependen de él DETALLE: acceso a la tabla foo'. Sin embargo, 'DROP OWNED BY testuser' hizo el truco, aparentemente Postgres considera que las subvenciones son objetos que se pueden soltar. – millimoose

+1

Aclare, @Tim Kane y milimoose: Realmente no quiero que se eliminen las tablas originales si OTORGO SELECT EN FOO AL TESTUSER y luego SACA DE PROPIEDAD DE TESTUSER. Creo que está diciendo que DROP OWNED BY solo está retirando las subvenciones, pero no abandonará el objeto para el que se realizó la concesión. ¿Correcto? –

+1

Andrew, es mejor leer la documentación para aclararla. DROP OWNED BY * will * drop tables propiedad de ese usuario. REASIGN OWNED BY reasignará esas tablas a un usuario diferente. Elige uno. –

8

también tenga en cuenta, si ha otorgado explícitamente:

CONNECT ON DATABASE xxx TO GROUP,

tendrá que revocar esta separado de GOTA PROPIEDAD, usando:

REVOKE CONNECT ON DATABASE xxx FROM GROUP

-9

que enfrentan el mismo problema y ahora encontró una manera de solucionarla. Primero debe eliminar la base de datos del usuario que desea eliminar. Entonces el usuario puede ser eliminado fácilmente.

Creé un usuario llamado "msf" y tuve problemas para eliminar al usuario y recrearlo. Seguí los pasos a continuación y tuve éxito.

1) La caída de la base de datos de

dropdb msf 

2) dejar que el usuario

dropuser msf 

Ahora tengo el usuario eliminado satisfactoriamente.

+1

Este es un enfoque increíblemente radical, ya que me habría requerido recrear el esquema de base de datos para cada iteración de mi trabajo. (Lo que implicaba tener permisos precisos en un esquema de base de datos existente; es decir, es mejor si el esquema de la base de datos permanece intacto). – millimoose

1

La respuesta aceptada resultó en errores para mí al intentar REASIGNAR POR O DEJAR DE PROPIEDAD.Los siguientes trabajado para mí:

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username; 
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username; 
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username; 
DROP USER username; 

El usuario puede tener privilegios de otros esquemas, en cuyo caso se tendrá que ejecutar la línea REVOKE apropiado con "público" reemplazado por el esquema correcto. Para mostrar todos los esquemas y tipos de privilegios para un usuario, edité el comando \ dp para hacer esta consulta:

SELECT 
    n.nspname as "Schema", 
    CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
    END as "Type" 
FROM pg_catalog.pg_class c 
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%'; 

No estoy seguro de qué tipos de privilegios corresponden a revocar en las mesas, las secuencias o funciones, pero creo que todos caen bajo uno de los tres.

Cuestiones relacionadas