Pregunta

Estoy trabajando en una aplicación que utiliza Oracle construido en mecanismos de autenticación para administrar cuentas de usuario y contraseñas. La aplicación también utiliza la seguridad de nivel de fila. En principio, cada usuario que se registre a través de la aplicación obtiene un nombre de usuario y la contraseña de Oracle en lugar de la típica entrada en una tabla "usuarios". Los usuarios también reciben etiquetas en ciertas tablas. Este tipo de funcionalidad requiere que la ejecución de las sentencias DML y DDL combinarse en muchos casos, pero esto plantea un problema porque las sentencias DDL realizará confirmaciones implícitas. Si se produce un error después de una sentencia DDL ha ejecutado, la gestión de transacciones no ruede todo de nuevo. Por ejemplo, cuando un nuevo usuario se registra con el sistema de la siguiente podría tener lugar:

  1. Iniciar transacción
  2. Insertar datos de la persona en una tabla. (Es decir, primero nombre, apellido, etc.) -DML
  3. Crea una cuenta de Oracle (crear usuarioprueba usuario identificado por contraseña;) -DDL cometer implícita. Transacción termina.
  4. comienza nueva transacción.
  5. Realice más statments DML (inserciones, actualizaciones, etc.).
  6. se produce un error, la transacción únicamente rollos de nuevo al paso 4.

Yo entiendo que la lógica anterior está funcionando como fue diseñado, pero me resulta difícil de probar la unidad este tipo de funcionalidad y gestionarla de capa de acceso a datos. He tenido la base de datos descienden o se producen errores durante las pruebas unitarias que causaron que el esquema de prueba para estar contaminada con datos de prueba que debería haber sido retrotraído. Es bastante fácil para limpiar el esquema de prueba cuando esto sucede, pero estoy preocupado por los fallos de bases de datos en un entorno de producción. Estoy buscando estrategias para manejar esto.

Esta es una aplicación / primavera de programación Java. El resorte está proporcionando la gestión de transacciones.

¿Fue útil?

Solución

Se debe utilizar la autenticación de proxy de Oracle en combinación con la seguridad a nivel de fila.

Lea esto: http://www.oracle. com / tecnología / pub / articulos / Dikmans-vínculo superior-security.html

Otros consejos

En primer lugar tengo que decir: mala idea hacerlo de esta manera. Por dos razones:

  1. Las conexiones se basan en el usuario. Eso significa que se pierde gran parte de los beneficios de la agrupación de conexiones. También no se adapta demasiado bien. Si usted tiene 10.000 usuarios en una sola vez, que va a estar abriendo y cerrando continuamente conexiones duros (en lugar de agrupaciones de conexiones suaves); y
  2. Como se ha descubierto, crear y eliminar usuarios es DDL no LMD y por lo tanto se pierde "transaccionalidad".

No sé por qué has elegido hacerlo de esta, pero lo haría fuertemente recomienda que implemente los usuarios en la aplicación y no la capa de base de datos.

En cuanto a la forma de resolver su problema, básicamente, no se puede. Lo mismo que si estuviera creando una tabla o un índice en el centro de su secuencia.

Yo discrepo con algunos de los comentarios anteriores y decir que hay una gran cantidad de ventajas para el uso de la seguridad de la cuenta incorporada en Oracle. Si usted tiene que aumentar esta con algún tipo de mesa de sombra de los usuarios información adicional, ¿qué hay de envolver la creación de cuentas de Oracle en un paquete separado que se declara PRAGMA AUTONOMOUS_TRANSACTION y devuelve un estado de éxito / fracaso en el paquete que está haciendo la inserción en la tabla sombra? Creo que esto sería aislar la creación de cuentas de Oracle de la transacción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top