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);
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 escribiremosTODOS 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í sunombre 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:
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:
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:
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:
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:
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.
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