Conceder permisos en vistas, denegar seleccionar en tablas

9

Tengo un usuario de MySQL y quiero que vea SOLO las vistas que quiero y no cualquier otra tabla en la base de datos. Otorgué permisos a este usuario solo en ciertas vistas de la siguiente manera:

GRANT SHOW VIEW ON `myDatabase`.`awesome_view` TO 'thisUser'@'%'

Si hago una show grants;declaración, solo puedo ver estos permisos como se esperaba. Sin embargo, me gustaría que este usuario consulte SOLO las vistas y no las tablas relacionadas con estas vistas, pero no puedo encontrar la manera de hacerlo. Parece ser que si quiero que el usuario haga una selección en la vista, la selección también debe otorgarse para la tabla, ¿o me equivoco?

Si niego la selectdeclaración en el resto de las tablas, y en la línea de comando trato de hacer una selección, obtengo lo siguiente:

SELECT * FROM myDatabase.fordibenForYouTable;
ERROR 1142 (42000): SELECT command denied to user 'thisUser'@'localhost' for table 'fordibenForYouTable'

De hecho, eso es lo que quiero, pero también se me niega si selecciono los datos de la vista.

¿Hay alguna manera de poner a disposición del usuario solo las vistas y no las tablas?

Metafaniel
fuente

Respuestas:

6

Deberá tratar la vista como una tabla. La información_esquema ya lo hace

Si tu corres

SELECT table_name FROM information_schema.tables
WHERE engine IS NULL;

obtienes todas las vistas.

Simplemente otorgue SELECT en la vista al usuario de la siguiente manera

GRANT SELECT ON `myDatabase`.`fordibenForYouTable` TO 'thisUser'@'localhost' ;

Una vez que haga esto, debe tener acceso SELECCIONAR a la tabla.

Para asegurarte, corre SHOW GRANTS FOR 'thisUser'@'localhost';

También debería poder ver a qué acceso de nivel de tabla se le otorga 'thisUser'@'localhost'

SELECT * FROM mysql.tables_priv
WHERE user='thisUser' and host='localhost'\G

También puede ver a qué usuario tiene acceso a nivel de tabla myDatabase.fordibenForYouTable

SELECT * FROM mysql.tables_priv
WHERE db='myDatabase' and table_name='fordibenForYouTable'\G

DARLE UNA OPORTUNIDAD !!!

RolandoMySQLDBA
fuente
Oye, lo hiciste! ¡Gracias! ¡No pude encontrar la solución por mi cuenta! ¡Muchas gracias!
Metafaniel
5

Sé que esto es viejo ahora, pero esto es lo que resolvió este problema para mí ...

La respuesta fue con la sintaxis "SEGURIDAD SQL".

mi definición de vista original tenía la SEGURIDAD de SQL configurada para ser "INVOKER". Esto significaba que el usuario se vio obligado a tener permiso de selección tanto en la vista como en la tabla.

Cuando cambié la SEGURIDAD de SQL para que sea "DEFINER", puedo otorgarle al usuario permiso de selección solo en la vista.

Juan
fuente