Otorgar privilegios al usuario en PostgreSQL

Bilal Shahid 15 febrero 2024
  1. Breve introducción de privilegios en PostgreSQL
  2. Uso de la palabra clave GRANT en PostgreSQL
Otorgar privilegios al usuario en PostgreSQL

En PostgreSQL, todos los objetos de la base de datos, como una tabla o una vista, tienen un propietario. El propietario suele ser el usuario que creó el objeto.

En consecuencia, solo el propietario tiene derecho a modificar o eliminar los objetos creados por él, y ningún otro usuario puede hacerlo por defecto. Si el propietario desea permitir que otro usuario realice acciones específicas en su objeto, debe otorgarle los privilegios.

En este tutorial, demostramos cómo un propietario puede otorgar todos los privilegios a otro usuario en PostgreSQL. Comencemos con lo básico y aprendamos qué son los privilegios.

Breve introducción de privilegios en PostgreSQL

Los privilegios son permisos relacionados con objetos de base de datos particulares. En PostgreSQL, tenemos los siguientes tipos de privilegios:

Nombre de privilegio Descripción del privilegio
SELECT Permitir la selección de cualquier valor de las columnas de un objeto similar a una tabla
INSERT Permitir la inserción de una fila de datos en la tabla
UPDATE Permite modificar datos preexistentes en la tabla
DELETE Permite la eliminación de datos preexistentes en la tabla
TRUNCATE Permite agregar/agregar una fila a la tabla
REFERENCES Permite hacer referencia a claves foráneas en la tabla
TRIGGER Permite crear disparadores para un evento.
CREATE Permite la creación de diferentes objetos dentro de una base de datos.
CONNECT Permite establecer conexiones con los servidores de la base de datos
TEMPORARY Permite la declaración de objetos temporales.
EXECUTE Permite la ejecución de consultas dentro de una base de datos.
USAGE Definición del uso de objetos dentro de la base de datos

Nota: Es imposible otorgar a un usuario el privilegio de SOLTAR un objeto o cambiar su definición.

Todos estos privilegios representan diferentes acciones que un usuario puede realizar en una base de datos. Por ejemplo, un usuario no puede CREAR una tabla en una base de datos en particular si no se le ha otorgado el privilegio CREAR.

Entonces, ¿cómo se otorgan todos los privilegios a un usuario? Por ejemplo, creemos un usuario temporal ejecutando el siguiente comando:

CREATE USER myuser WITH PASSWORD 'password';

A continuación, creamos una tabla de muestra y la llenamos con algunos datos:

create table person(
    name varchar(30) not null,
    age int not null
);

insert into person values ('Ali', 20), ('Fatima', 19), ('Hassan', 22);

otorgar privilegios al usuario en postgresql - salida uno

Todos los privilegios se otorgan a un usuario mediante la palabra clave GRANT, que se explica a continuación.

Uso de la palabra clave GRANT en PostgreSQL

La sintaxis básica de la palabra clave GRANT es la siguiente:

GRANT privilege
ON object
TO {PUBLIC | GROUP group | username}

Veamos cada componente de la sintaxis uno por uno:

  • privilegio - Aquí, escribimos el(los) privilegio(s) que queremos otorgar al usuario. En nuestro caso escribiremos TODOS LOS PRIVILEGIOS ya que estamos aprendiendo a otorgar todos los privilegios.
  • objeto: un objeto de base de datos incluye, entre otros, una tabla, vista, secuencia, base de datos, función, procedimiento o esquema.
  • PÚBLICO: si escribimos esta palabra clave, otorgaremos los privilegios a todos los usuarios en todos los roles y grupos.
  • GRUPO - Un grupo es un tipo de rol en PostgreSQL. Un rol puede ser un grupo o un usuario individual que posee un objeto de base de datos. Podemos otorgar todos los privilegios a un grupo en PostgreSQL especificando su nombre.
  • nombre de usuario - Si queremos otorgar todos los privilegios a un usuario individual, escribimos aquí su nombre de usuario.

Ahora demostraremos el uso de esta sintaxis con un ejemplo. Supongamos que queremos otorgar todos los privilegios a miusuario creado anteriormente en nuestra tabla definida persona.

Para ello, podemos ejecutar la siguiente consulta:

GRANT ALL PRIVILEGES ON person TO myuser;

La salida muestra el siguiente texto:

otorgar privilegios al usuario en postgresql - salida dos

Significa que los privilegios especificados se han otorgado con éxito. En PostgreSQL, es opcional escribir PRIVILEGIOS como está escrito en la consulta anterior. Por lo tanto una alternativa es:

GRANT ALL ON person TO myuser;

También funciona de la misma manera. Del mismo modo, también podemos crear otros objetos de base de datos y otorgar todos los privilegios sobre ellos a un usuario. Vamos a crear un procedimiento de ejemplo como ejemplo:

create procedure just_an_example()
language plpgsql
as $$
begin
select * from person;
end; $$

Ahora, podemos ejecutar la consulta que se proporciona a continuación para otorgar todos los privilegios a miusuario:

GRANT ALL PRIVILEGES ON PROCEDURE just_an_example() TO myuser;

Se otorgará con éxito:

otorgar privilegios al usuario en postgresql - salida dos

También podemos agregar la opción CON GRANT OPTION al otorgar todos los privilegios. Significará que ahora el usuario también tiene permiso para otorgar privilegios a otros usuarios. Por ejemplo:

GRANT ALL PRIVILEGES ON PROCEDURE just_an_example() TO myuser WITH GRANT OPTION;

Después de ejecutar esta consulta, myuser puede otorgar más privilegios a cualquier usuario que desee, inicialmente solo autorizado al propietario de just_an_example().

El método que hemos explicado anteriormente incluye otorgar todos los privilegios al usuario directamente. Sin embargo, un mejor enfoque es otorgar todos los privilegios a un grupo y convertir al usuario en miembro.

Esta técnica es mejor porque ayuda a organizar los privilegios o incluso a revocarlos cuando se trata de varios usuarios. Veamos cómo se hace esto.

En primer lugar, crearemos un grupo de la siguiente manera:

CREATE GROUP mygroup;

Se creará con éxito como se muestra en el siguiente resultado:

otorgar privilegios al usuario en postgresql - salida tres

Ahora, otorgaremos todos los privilegios sobre nuestra tabla persona al grupo migrupo mediante la siguiente consulta:

GRANT ALL PRIVILEGES ON person TO mygroup;

El resultado muestra que hemos otorgado correctamente los privilegios:

otorgar privilegios al usuario en postgresql - salida dos

A continuación, añadiremos miusuario como miembro de migrupo usando la siguiente sintaxis:

GRANT mygroup TO myuser;

Da el siguiente resultado, confirmando la membresía:

otorgar privilegios al usuario en postgresql - salida cuatro

De esta forma, hemos otorgado todos los privilegios sobre la tabla persona al grupo migrupo, y dado que miusuario forma parte de migrupo, también tienen todos los privilegios sobre persona.

Resume nuestra discusión sobre cómo otorgar todos los privilegios en un objeto de base de datos a un usuario en PostgreSQL. Esperamos que haya aprendido el uso y la sintaxis de la palabra clave GRANT y los diferentes métodos que podemos usar para otorgar todos los privilegios a un usuario.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub