Inicio › Foros › Bases de datos › MySQL › Asignar permisos a un usuario solo a tablas concretas en MySQL
Etiquetado: acceso, base de datos, granular, mysql, permiso, permisos, solo lectura, tabla, usuario
- Este debate tiene 5 respuestas, 1 mensaje y ha sido actualizado por última vez el hace 2 años, 8 meses por MarioG.
-
AutorEntradas
-
03/01/2019 a las 08:42 #3458VariosModerador
Hola, tengo una base de datos MySQL montada en un servidor Linux CentOS 7. Tiene bastantes tablas y quiero darle a un usuario permisos de lectura (select) solo a unas tablas concretas, no a todas.
Lo he intentado desde MySQL Workbench pero solo me deja establecer los permisos a nivel de catálogo (base de datos) y no de tabla:
¿Es que MySQL no permite establecer permisos a un usuario por tabla?
03/01/2019 a las 09:12 #3460alonsojpdSuperadministradorTe indicamos los pasos para crear un usuario y establecerle permisos a nivel de tabla en MySQL. Puedes hacerlo desde la línea de comandos de tu servidor Linux CentOS con MySQL:
1. Conéctate a MySQL con el comando:
Shell1mysql --user="root" --password="contraseña"2. Crea el usuario con el comando:
MySQL1create user 'nombre_usuario'@'localhost' identified by 'contraseña';3. Con esta consulta puedes comprobar que el usuario se ha creado correctamente:
MySQL1select user, host from mysql.user;4. Para establecer permisos para una tabla concreta, por ejemplo el permiso de solo lectura (select) e incluso desde un equipo concreto de la red (por ejemplo desde todos los que tengan IP 192.168.1.*):
MySQL1grant select on nombre_bd.nombre_tabla to 'nombre_usuario'@'192.168.1.%';Donde:
- nombre_usuario: nombre que quieras darle al usuario con el que accederás a MySQL. Si queremos dar acceso para todos los usuarios (no es recomendable) colocaremos un *.
- nombre_bd: nombre de la base de datos (catálogo) que contiene las tablas a las que le darás acceso. Si queremos dar acceso a todas las bases de datos (no es recomendable) colocaremos un *.
- nombre_tabla: nombre de la tabla a la que le darás acceso. Si queremos dar acceso a todas las bases de datos (no es recomendable) colocaremos un *.
- select: indica el tipo de permiso que le darás para la tabla, hay varias opciones y se pueden añadir juntas (separadas por comas): insert, select, update, delete, drop,… Si queremos todos los permisos (no suele ser recomendable) se pone un ALL.
- 192.168.1.%: en este valor estableceremos desde que IP o rango de IP queremos que se acceda a MySQL con el usuario. Si queremos todos (no suele ser recomendable) se pone un %.
Para comprobar que se han asignado correctamente los permisos puedes ejecutar este otro comando:
MySQL1show grants for 'nombre_usuario'@'192.168.1.%';Por último ejecuta esta otra consulta para hacer efectivos permisos creados:
MySQL1flush privileges;A partir de este momento el usuario tendrá acceso de lectura (select) para la tabla indicada en la base de datos MySQL indicada y desde el equipo o equipos indicados.
03/01/2019 a las 09:35 #3461VariosModeradorGenial, lo he probado y me funciona perfecto.
Otra cuestión ¿hay algún listado de esos permisos que se le pueden asignar select, insert, update, …?
03/01/2019 a las 09:42 #3462alonsojpdSuperadministradorAquí tienes un listado con su descripción (en inglés):
- ALL [PRIVILEGES] Grant all privileges at specified access level except GRANT OPTION and PROXY.
- ALTER Enable use of ALTER TABLE. Levels: Global, database, table.
- ALTER ROUTINE Enable stored routines to be altered or dropped. Levels: Global, database, routine.
CREATE Enable database and table creation. Levels: Global, database, table. - CREATE ROLE Enable role creation. Level: Global.
- CREATE ROUTINE Enable stored routine creation. Levels: Global, database.
- CREATE TABLESPACE Enable tablespaces and log file groups to be created, altered, or dropped. Level: Global.
- CREATE TEMPORARY TABLES Enable use of CREATE TEMPORARY TABLE. Levels: Global, database.
- CREATE USER Enable use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES. Level: Global.
- CREATE VIEW Enable views to be created or altered. Levels: Global, database, table.
DELETE Enable use of DELETE. Level: Global, database, table. - DROP Enable databases, tables, and views to be dropped. Levels: Global, database, table.
- DROP ROLE Enable roles to be dropped. Level: Global.
- EVENT Enable use of events for the Event Scheduler. Levels: Global, database.
- EXECUTE Enable the user to execute stored routines. Levels: Global, database, routine.
- FILE Enable the user to cause the server to read or write files. Level: Global.
- GRANT OPTION Enable privileges to be granted to or removed from other accounts. Levels: Global, database, table, routine, proxy.
- INDEX Enable indexes to be created or dropped. Levels: Global, database, table.
- INSERT Enable use of INSERT. Levels: Global, database, table, column.
- LOCK TABLES Enable use of LOCK TABLES on tables for which you have the SELECT privilege. Levels: Global, database.
- PROCESS Enable the user to see all processes with SHOW PROCESSLIST. Level: Global.
- PROXY Enable user proxying. Level: From user to user.
- REFERENCES Enable foreign key creation. Levels: Global, database, table, column.
- RELOAD Enable use of FLUSH operations. Level: Global.
- REPLICATION CLIENT Enable the user to ask where master or slave servers are. Level: Global.
- REPLICATION SLAVE Enable replication slaves to read binary log events from the master. Level: Global.
- SELECT Enable use of SELECT. Levels: Global, database, table, column.
- SHOW DATABASES Enable SHOW DATABASES to show all databases. Level: Global.
- SHOW VIEW Enable use of SHOW CREATE VIEW. Levels: Global, database, table.
- SHUTDOWN Enable use of mysqladmin shutdown. Level: Global.
- SUPER Enable use of other administrative operations such as CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin debug command. Level: Global.
- TRIGGER Enable trigger operations. Levels: Global, database, table.
- UPDATE Enable use of UPDATE. Levels: Global, database, table, column.
- USAGE Synonym for “no privileges”
04/03/2021 a las 16:00 #41685MarioGParticipanteHola!
Tengo desconocimeinto, de algo similar al caso aqui comentado.
Mi caso es querer que un usuario (o varios segun se incluyan) se conecten a dos bases de datos.
Lo he hecho así (desde codigo):
GRANT ALL PRIVILEGES ON db1.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION
GRANT ALL PRIVILEGES ON db1.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION
FLUSH PRIVILEGESLa consulta es si en una sola expresión se pueden incluir ambas DB.
He probado (por desconocimiento) asi:
GRANT ALL PRIVILEGES ON db1.*,db2.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION
Y obviamente no es l forma.
Se puede?; como?muchas gracias
04/03/2021 a las 16:01 #41686MarioGParticipanteCorrijo; corresponde:
GRANT ALL PRIVILEGES ON db2.* TO mariog@’%’ IDENTIFIED BY ‘mipasw’ WITH GRANT OPTION -
AutorEntradas
- Debes estar registrado para responder a este debate.