jueves, 15 de mayo de 2008

SEGURIDAD CON RESTRICCIÓN CHECK


No, esta vez no voy a tratar el tema de la seguridad por usuarios, sino de un método alternativo que surgió a raíz de una pregunta en el 'Foro de Access y vba' : http://www.mvp-access.com/foro/default.asp el día 07/05/2008. Se trata de impedir que nadie pueda insertar nuevos registros, o modificar los existentes, al margen de los formularios y herramientas que hayamos previsto para ello. En otras palabras, asegurarnos que no se pueda acceder directamente a las tablas de la base de datos.
Para conseguir este objetivo obligaremos a los usuarios a entrar en nuestra aplicación con un acceso directo, que abra el programa en modo Runtime.
Configuración del acceso directo : Escribir la propiedad 'Destino', del acceso directo según este esquema :

"C:\Archivos de programa\Microsoft Office\OFFICE11\MSACCESS.EXE"
"C:\MiAplicación.mdb" /Runtime

Es decir, la ruta de la versión de Access que tengamos instalada (en este ejemplo Access 2003) y la ruta de la base de datos, seguida de la opción /Runtime.
Bien, ¿ pero cómo impedir que alguien abra la aplicación en modo normal ? : no podemos. Pero sí que es posible crear una restricción check sobre la tabla/s que deseemos controlar, de tal manera que impida insertar nuevos registros o editarlos si no hemos abierto la aplicación en modo Runtime.

Un ejemplo sobre una tabla llamada MiTabla :

Alter Table MiTabla Add Constraint Regla1 Check
((Select Top 1 (SysCmd(6) = True) As Regla From MSysObjects)=True);

Para ejecutar esta instrucción, lee el artículo anterior (Limitar nº registros en Tabla) o también puedes ejecutarla directamente mediante el Editor Sql 1.1 :
http://groups.google.com/group/raipon?hl=es

Es de destacar, que dado el comportamiento de Access (ejecutarse siempre en el 'lado cliente'), si tenemos nuestra aplicación dividida entre Front End y Back End (Objetos <=> Datos), aún cuando la restricción check se guarde con los datos (ya que depende de la tabla), la función SysCmd(6) evaluará el modo de apertura desde la base de datos activa. Por tanto, este método también funciona correctamente si desde el Front End empleamos tablas vinculadas, o accedemos a los datos a través de Dao o Ado.

Ramon Poch. Terrassa a 09/05/2008.