Base de datos multiempresa

Tengo 1 empresa cliente que tiene una base de datos Access, en la cual las tablas están vinculadas a una base de datos mySQL que está alojada en un sitio web. La conexión Access-mySQL es vía ODBC.
Todo funciona sin problemas.
Ahora me surge otro cliente que necesita la misma base de datos. Tengo 2 opciones:
1. La fácil a corto plazo. Hago una copia de las 2 bases de datos (elimino los datos previamente) y al nuevo cliente le configuro otro ODBC para acceder a la segunda base mySQL.
Así, las bases Access son iguales, con tablas vinculadas a 2 mySQL distintas, con 2 ODBC distintos.
Esto ya lo he hecho y funciona sin problemas, pero no me gusta nada, porque si me surge un tercer, cuarto, ... Cliente similar, el mantenimiento se me complica. Tendría muchas bases de datos.
2. La más difícil de diseñar para mi, y sobre la que te pido ayuda. Quiero tener una sola base mySQL que sea multiempresa.
Para ello necesito que bien Access, bien mySQL distinga entre empresas al hacer login de modo que sólo presente los datos de la empresa correspondiente.
La pregunta es: ¿Es posible que en Access al logarse se muestren exclusivamente los datos relativos a una empresa y no a todas?
Ya sé que la respuesta es SI, salvo si accedo directamente a las tablas, que en ese caso se mostraría todo. He probado a ocultar las tablas de múltiples formas, pero siempre encuentro otra forma, como usuario, de desocultarlas, con lo cual podría seguir accediendo a todo.
La pregunta cambia a ¿Hay alguna forma 100% segura de ocultar las tablas en Access2007?
Si la respuesta es no, ¿cómo está haciendo la gente para tener una base de datos Access multiempresa sin que un usuario logado vea todos los datos?
Por ponerlo más simple. Si tengo una base de datos Access en un ordenador público de un colegio, ¿cómo hago para que un alumno que se loge con su DNI sólo vea sus notas?
Si no es posible en Access, ¿qué necesitaría para hacerlo posible?

4 Respuestas

Respuesta
Las aplicaciones web te dan la seguridad que quieres.
Pues sólo la persona logeada podrá ver sus datos correspondiente.
Por otro lado existe una manera de ocultar las tablas permanentemente incluso tal que ni siquiera tu podrías verlas.
Escríbeme
[email protected]
Respuesta
1
Caramba con la preguntita... je je
Para sistemas multiempresa existen distintos métodos.
1. Utilizar distintas BDD's
2. Utilizar una sola BDD pero identificando las tablas con un prefijo por empresa
3. Utilizar un solo conjunto de tablas identificando la empresa de cada registro mediante un campo Empresa.
Cada método tiene sus ventajas e inconvenientes y requiere unos métodos de programación distintos.
¿Cómo hacer que un usuario vea solo una empresa? Para empezar yo me decantaría por la opción 3 de las antes indicadas. Y, para que el usuario solo vea lo suyo, asociaría cada usuario con una empresa del sistema y, al abrir cada formulario, filtraría la información de empresa. Para ello yo utilizaría una variable global que almacenara la empresa y la utilizaría como uno de los criterios de la WHERE en toda la aplicación.
¿Cómo conseguir ocultar las tablas?
Mira este tip: http://www.llodax.com/smf/index.php?topic=49.0 
Espero que todo esto te sirva para empezar
Gracias Xavi.
Yo también usaría esa tercera opción. Lo que pasa es que hasta ahora no conocía ninguna forma real de ocultar las tablas. Los métodos que había visto podían anularse fácilmente.
Ahora, que dices en el blog:
"Si se ocultan mediante este método, la única forma de hacerlas visibles de nuevo es correr el código inverso."
Te pregunto una segunda cosa. Después de ocultar las tablas, ¿cómo puedo evitar que alguien pueda escribir un código para desocultarlas?
Muchas gracias de nuevo.
La seguridad total es una utopía. Así que solo puedes intentar ocultar al máximo posible los datos.
En la red existen numerosos métodos para proteger datos (passwords, encriptaciones, desconexión de datos, etc)
Respuesta
1
Sgeuro que tu planteamiento tiene solución, incluso varias soluciones.
Por la parte de MySQL no te puedo ayudar, ya que sólo controlo algo de SQL para realizar consultas en Access 2003. El Access 2007 tampoco lo he comenzado a utilizar, porque algunas cosas aún las veo algo complejas.
En Access 2003 (y seguro que en el 2007), se pueden separar las tablas de los formularios y códigos/macros, de manera que el usuario sólo pueda acceder a la información a través de la aplicación. Para ello hay un asistente que te guía en esta tarea.
Por otra parte, en la aplicación puedes evitar que el usuario acceda a los menús y herramientas de edición, en Access 2003, mediante variación de opciones en la barra de herramientas, menú inicio. Y finalmente, tienes la posibilidad de crear perfiles de usuarios con distintos privilegios, tanto desde la propia herramienta del Access, como a nivel de código.
Sólo te doy las ideas y no entro en detalles, porque veo que tienes buen nivel sobre el tema y no sé si alguna de las soluciones que te propongo te son suficientes. Si alguna de ellas te interesa en particular y la explicación de las ayudas no es suficiente me avisas, aunque tendré las limitaciones con el Access 2007.
Respuesta
1
Buf... je je
Vamos por partes ... lo primero es que los datos más importantes como contraseñas, usuarios, etc, etc.. estén encriptados en la base de datos. Luego te harían falta dos funciones, una para encriptar y otra para desencriptar, al entrar los datos de usuarios.
Para el tema de multiempresa... lo más factible a mi parecer ... bases de datos distintas.
Por que: Necesitarías un ID en cada una de las tablas de la base de datos, que determine que ID de empresa se esta vinculando con el dato de la tabla EN CUESTIÓN. Es decir, Tabla Pedidos, un IDEmpresa enlazado a una tabla Empresa con el mismo ID, la cual tiene todo los datos de empresa para no te ner que ir buscando quien es el que se conecta.
SI lo haces poer separado, el mantenimiento siempre sería por empresa, es decir, si una empresa la "pifia", no caerían todas, ya que una cosa es Multiempresa y otra es un Grupo de Empresas de la misma.
Imaginate por un momento que tenemos 3 empresas 'A','B' y 'C' y que la empresa 'A' inserta unos datos corruptos en la tabla... ende la 'B' y la 'C' sufrirían las consecuencias de ese error... el teléfono ardería.
A lo mejor piensas que poniendo unas siglas delante de las tablas podríamos solventar el problema, ejemplo: Tabla Clientes... AClientes, BClientes, CClientes.. cada una para cada empresa, pero... la base de datos se multiplicaría por 3 en el acceso, suponiendo un retardo en la presentación de datos.
Bueno, te he dado contras de lo que me has pedido, pero a la vez te he indicado más o menos por donde irían los tiros si quisieras hacerlo.
Si tienes más dudas, me lo dices.
Un saludete.
Gracias.
Me has dado una visión que no me había planteado, que es el tema de la corrupción de la base de datos.
En realidad creo que el planteamiento bueno es el multiempresa, con lo cual se trata de evitar la corrupción de la base. Como utilizo Access sólo como interfaz de usuario, y los datos realmente están en mySQL, creo que la probabilidad de corrupción es poca, aunque tendré que indagar un poco en el tema.
Gracias de nuevo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas