PDA

Ver la Versión Completa : un temita con los permisos


mamaro
02-02-2007, 14:07:16
Hola.

Tengo Firebird 1.5 Classic corriendo sobre Red Hat 9, tengo una aplicación desarrollada en Delphi 7, los usuarios se logean en la aplicación con el usuario y contraseña de firebird.

El problema se da cuando tengo que modificar unos datos, para lo cual previamnte tengo que desactivar un disparador ... debido a que se debe modificar la metadata, por el momento sólo puede realizar esta acción el SYSDBA ... por el momento no tengo problemas ya que la acción ésta la hago yo, pero pronto la deberá hacer otra persona que tiene su usuario propio.

El tema es ¿que es más conveniente?:
1) Crear un procedimiento almacenado que desactive el disparador, modifique el dato, y vuelva a activarlo (y darle permisos al "usuario" que corresponda de ejecución del procedimiento).
2) Darle permisos a el "usuario" a desactivar el disparador.

Estube pensándolo un poco y me parece que la primer opción es más "limpia", pero me gustaría su opinión.:)

TJose
03-02-2007, 16:02:20
Hola mamaro

Yo entiendo que cuando modificas un dato en cierta tabla, también debes modificar la estructura de tu base de datos. Si es así, me parece que habría que revisar el diseño de la base de datos. Según mi experiencia (y es sólo una opinión) el aplicativo no debería cambiar la estructura de la base de datos, salvo el caso de una actualización porque las reglas de negocio cambiaron, o porque se optimizó algún procedimiento o por alguna otra razón.

Saludos
TJose

lbuelvas
05-02-2007, 03:43:47
Cordial saludo,

Siendo directo a responder tu pregunta la primera opcion me parece la mas "sana", en el sentido que si al usuario se le olvida vover a activar el trigger pueden presentarse problemas, cierto ?.

La primera opción te da la ventaja de no tener que darle explicaciones al usuario sobre el funcionamiento interno de la tarea que va a realizar.

La pregutna que te haria es porque tienes que desactivar el trigger ?, es algo que es rutinario ?, de ser asi tal vez el diseño de tu sistema necesita una revision.

mamaro
05-02-2007, 15:09:09
Hola !

Les explico porqué tengo que desactivar los disparadores:
Es un sistema de stock, tengo dos tablas para las salidas (cabezal y detalle), dos de entrada (cabezal y detalle), dos de remitos (entró la mercadería pero no se conoce el precio aún), una tabla de artículos, y muy importante tengo una tabla de existencias (aquí almaceno lo relativo a una entrada específica -lote, fecha de vencimiento, precio de compra, cantidad, etc-) ... digo muy importante porque estoy trabajando con medicamentos y por lo tanto los datos que aquí almaceno pueden ser de importancia vital.

Quiero aclarar que el artículo tiene un stock (que debería coincidir con la suma de las existencias).

Bueno esto funciona así:
1) Hago una entrada (entrada o remito), ésto acciona un disparador que crea lo que corresponda en la tabla de existencias, suma la cantidad al stock de la tabla artículo, etc.
2) Hago una salida, ésto acciona otro disparador que reduce la existencia
y el stock del artículo. Se accionan además otros disparadores por ejemplo uno que obtiene el precio de compra.

Bueno hasta aquí todo bien, el problema se dá cuando la existencia corresponde a un remito, en este caso no hay un precio de compra que traer.
Los empleados revisan todo antes de hacer el cierre y encuentran estos problemas (son usuarios con formación alta), por lo que solicitan a las empresas que les envíen los documentos definitivos (con precios) ... la mayoría de las veces los proveedores envían los documentos ... pero (siempre hay un pero) existen ocaciones en que nó. Al no tener un documento que abale el precio de compra que figurará en el cierre, le preguntan a la empresa o lo estiman (depende el caso)
...
cuando van a ingresar el precio "a mano", yo lo que hago desde mi programa delphi es:
1) Desactivo el disparador "obtiene precio de compra" de la tabla de salidas. Si lo dejo activado va a buscar el precio de la existencia, o sea cero.
2) Ejecuto un procedimiento almacenado que actualiza el precio de esa salida en particular.
3) Activo el disparador "obtiene precio de compra" de la tabla de salidas.

Bueno espero haber aclarado un poco las cosas, saludos a todos.

lbuelvas
05-02-2007, 16:53:17
Bueno, en estos casos lo que he hecho es crear los triggers separados dependiendo del tipo de documento, por ejemplo para documentos de compra de productos puede llamarse documento_cp_bi_01 (tabla documento, tipo documento compra de producto before insert secuencia 01), en ese orden de ideas puedes tener un trigger para esas entradas especiales, indicando que si la linea de detalle es 0.0 no actualice nada de los promedios de productos, cierto ?.

Puedes entonces en el trigger before update cuando se vaya a cambiar de valor 0.0 a uno diferente (mayor de cero por suspueto) lanzar tu procedimento almacenado.

Vas a tener un poco mas de trabajo, pero separarias el comportamiento en los triggers dependiendo de los tipos de documento.

rastafarey
12-02-2007, 18:14:58
Te recomiendo nop laterar metadata no desactivar disparadores.

Te puedo dar una solucion pero es valida solo pra firebird 2.0 incluye una variable en el deposito de variables y dependiendo del valor haces que el dispardor trabajo o no.