Cita: ¿ Y no se podria solucionar simplemente creando una tabla para guardar las relaciones de los roles con los privilegios a las tablas/columnas ?
Se puede hacer, pero con eso lograrás complicar mucho la construcción de las sentencias.
Es decir. Si las sentencias se deben construir de acuerdo al permiso de acceso a nivel programa, tendrás que generar en cada caso la sintaxis dinámicamente para cada usuario en curso. No es que no se pueda, yo lo he hecho en algunas aplicaciones, pero termina siendo excesivamente costoso en tiempo de desarrollo y pruebas.
En realidad en esos contextos lo que te conviene es establecer un conjunto muy bien definido de perfiles, y crear VIEWs en la base para cada perfil, en cada caso que se acceda a ciertas tablas. Como los permisos de lectura como usuario de BBDD se pueden dar para las vistas, podrías de ese modo restringirle también de ese modo la visualización de los datos.
A nivel de administracion de privilegios, al menos en MySQL, no puedes restringir el acceso a columnas específicas de una tabla. Si tienes permisos de SELECT sobre una tabla es sobre
toda la tabla. De allí que sea mejor crear una vista por cada perfil en cada tabla que ese perfil use, donde sólo invoques las columnas que el perfil puede ver.
¿Se entiende el problema?
Por eso es más sencillo manejarlo por SP o VIEWs.
Además, los SP son invulnerables al sql-injection, en cambio las vistas no, porque operan del mismo modo que acceder a la tabla, y es allí donde se produce la vulnerabilidad.
Todo sistema con cierto nivel de seguridad, implementa los accesos a la base por SP.