Esto se tambalea en la dirección de RBAC - control de acceso basado en roles. También podría preguntarse si usar LBAC - control de acceso basado en etiquetas. Y, dependiendo de su DBMS, podría haber otras formas de lograrlo (considere Oracle VPD - base de datos privada virtual, por ejemplo). Todo esto es más bien o muy específico de DBMS: diferentes soluciones para diferentes DBMS.
Parece que habla de control en el nivel de fila. Es decir, una fila en la tabla de contactos puede ser accesible para todos, mientras que otra solo es accesible para un conjunto de departamentos, otra solo es accesible para un grupo de personas, y así sucesivamente.
Recuerde que el DBMS relacional funciona mejor con conjuntos. Un solo grupo es un conjunto de grupos con un grupo de miembros; un solo usuario es un conjunto de grupos con un usuario miembro. Esto significa que tenemos menos casos para tratar.
Si desea implementarlo en SQL estándar, entonces creo que va a necesitar usar una combinación de vistas explotando combinaciones con tablas de control, etc. Las partes duras con tal sistema están ocupando las tablas de control y restricción los usuarios administrativos (en realidad, los administradores de restricción siempre son una de las partes difíciles).
La técnica básica sería:
- crear la tabla de base con una columna apropiada para identificar el conjunto de privilegios que se aplica a cada fila de la tabla.
- Revocar todo el acceso público a la tabla.
- Cree una vista en la tabla base que muestra todas las columnas de la tabla base que están permitidas. Será una vista conjunta con una tabla de control, que se definirá momentáneamente. Las condiciones de consulta de vista también estarán condicionadas por el usuario actual.
- Conceda acceso apropiado a la vista.
- Cree desencadenantes INSTEAD OF apropiados en la vista para manejar las operaciones de inserción, eliminación y actualización en la vista, retransmitiendo los cambios a la tabla base.
- Crea la tabla de control para unir con la tabla base.
- Rellene con los datos apropiados.
- Papel táctil azul claro y soporte bien atrás.
Ahora, acerca de que la columna de unión y la tabla de control ...
Alguien tiene que especificar lo que se aplican a las filas recién insertado en la tabla de permisos - ¿cuál es el acceso predeterminado proporcionado. Y alguien tiene que definir cómo se puede anular el acceso predeterminado. Ambos podrían ser desordenados.
Hay varias maneras de estructurar la tabla de control:
Un mecanismo se basa en una cada fila de la tabla base que tiene un identificador único (que podría ser un ID generado automática o simplemente el valor de la Clave primaria). La tabla de control incluye una copia de esa identificación única y define qué usuarios o grupos pueden acceder a ella. Esto significa que puede haber múltiples entradas en la tabla de control para una fila determinada, una para cada usuario o grupo que puede acceder a la fila. En este esquema, la tabla de control tiene una clave externa que hace referencia a la tabla base.
Otro mecanismo incorpora un número de ID en la tabla base que es una clave externa a la (s) mesa (s) de control. Básicamente identifica un conjunto de privilegios, y la referencia en la tabla base significa que la fila tiene el permiso de acceso asociado con la ID de control de acceso. La estructura detrás de la tabla de control podría ser que el ID 0 no tiene acceso para nadie (a través de la vista), el ID 1 tiene acceso para todos, y otros valores designan combinaciones de usuarios y grupos; cada combinación diferente tiene un ID diferente. Con esto, puede haber varias tablas en el conjunto de tablas de control, y también estamos discutiendo tener un conjunto de estas tablas de control para cada tabla que está protegida.
Claramente, el acceso a las tablas de control está estrictamente limitado, pero también es crucial para la gestión de quién puede ver qué.
Ambas son pesadillas administrativas, por lo que probablemente termines con un mecanismo de control de acceso proporcionado por DBMS en lugar de una solución SQL genérica.
Has solucionado este problema? Tengo un problema muy similar y sería bueno si puedes decir cómo lo resolviste. ¡Gracias! – Orbitum