Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   trigger y ¿Quien los dispara? (https://www.clubdelphi.com/foros/showthread.php?t=90736)

ronalg 23-08-2016 22:08:38

trigger y ¿Quien los dispara?
 
Buenas amigos del Foro; aquí les traigo una consulta sobre Disparadores en Firebird.

De antemano decirles gracias pues siempre se toman la molestia de ayudar.

El asunto es: ¿Es posible saber QUIEN inicio la jecucion de un trigger?

¿Es posible saber desde que procedimeinto almacenado se ha disparado un trigger?

ADVERTENCIA SI NO ERES AFECTO A CUENTOS LARGOS NO CONTINUES.........:D

Mi problema: En si podría hacerlo con un Procedimiento almacenado, pero contar con las variables de entorno OLD y NEW para los campos es algo fantástico para hacer cálculos cuando se trata de ventas, compras, devoluciones etc etc.

Vuelvo al tema, estoy implementando una bitácora para almacén (Entre otras cosas) los cambios en los "precios de venta" que se realizan de los ítems de una tienda, la tabla tiene esta estructura:

Código SQL [-]
create table tb_bitacora_precios_items(
codigo tcod not null primary key, 
old_precio_compra tmoneda,
new_precio_compra  tmoneda,
old_porcentaje_utilidad tmoneda,
new_porcentaje_utilidad tmoneda,
old_precio_venta tmoneda,
new_precio_venta tmoneda,
old_cantidad tcod,
new_cantidad tcod,
ref_item tcod, 
foreign key (ref_item) references tb_items (codigo) on delete no action on update cascade, 
fecha_hora tfechahora default 'now',
observaciones varchar(30))

La TB_ITEMS almacena los todos estos campos excepto OBSERVACIONES y FECHA.

Como es obvio usar un trigger afteredit en la TB_ITEMS puede extraerme todos los valores para los campos, pero el campo observaciones (o incluso podría usar un campo de otro tipo como ser char ['A','M'] donde A=cambio automático M=cambio manual),
como decía, el campo OBSERVACIONES solo debe guardar si el cambio de PRECIOS se hizo automáticamente (desde un procedimiento almacenado llamado por ejemplo 1) o se hizo manualmente (desde otro procedimiento almacenado)

newtron 24-08-2016 09:19:22

Hola.

Que yo sepa los triggers se ejecutan de forma automática cuando hay un cambio en la base de datos, es decir, no puedes llamarlos ni desde el código ni desde un procedimiento almacenado. Cuando se inserta, edita o anula un registro se dispara el trigger correspondiente pero no de otra manera.

Si quieres que se ejecute algo cuando se inserta, edita o anula un registro desde un procedimiento almacenado lo que se me ocurre es marcar ese registro para que el trigger pueda detectarlo y actuar en consecuencia.

Saludos

mamcx 24-08-2016 16:00:47

No veo para que quieres hacer esa distincion. Podrias explicar?

ronalg 24-08-2016 21:16:45

Gracias por su apoyo
 
Cuando registro la compra de un producto con un precio diferente al actual el usuario tiene las opciones de recalcular el nuevo precio de venta con prorrateo, pero también el administrador puede cambiar los precios de venta directamente (sin realizar una compra) cada uno de estos posibles cambios de precio se hacen desde dos procedimientos almacenados; para insertar los campos de la tabla me gustaría a aprovechar NEW y OLD de mi tabla items para capturar en una sola vez los campos que van a la bitácora para esto sería necesario saber cual de los dos procedimientos almacenados "disparó" el trigger (alfter edit o before edit) y así poder registrar en el campo observaciones de la tabla bitácora si el cambio se hizo por una compra o lo hicieron manualmente.

SI NO existe forma de saber que procedimiento almacenado "disparo" el trigger deberé modificar ambos procedimientos para que registren en la bitácora el cambio realizado.

Espero haberme explicado.

Gracias de antemano.

mamcx 24-08-2016 21:56:00

Presta atencion a tu propia descripcion. La regla de negocio que indicas no es lo que estas tratando de programar.

Entonces no necesitas diferenciar entre el codigo que invoca. Sino entre QUE usuario lo invoca.

En ese caso o agregas un campo indicando quien invoca, o usas los login de la BD para diferencia entre conexion por admin y por otro usuario.

ronalg 24-08-2016 22:43:54

Solucionado
 
Bueno aumente un campo TIPO_ULTIMO_CAMBIO VARCHAR(1) a mi tb_items, el valor de este campo cambia, según desde que procedimiento almacenado sea llamada la actualización del precio, así en el trigger AfterEdit de la misma tabla puedo saber quien modificó el precio y almacenar en la bitácora aprovechando OLD y NEW y con un simple "if" puedo saber desde que procedimiento se hizo el cambio y colocar en las observaciones de la bitácora.

Gracias (talvez me este enredando mucho pero PARCHAR un sistema que no diseñaste es un poco complicado)

ronalg 24-08-2016 22:52:23

Gracias mamcx
 
Bueno la compra de ítems y la modificación de precios solo pueden hacerlos los administradores pero el punto era que necesitaba registrar en la bitácora si el cambio de precio era porque se lo hizo "manualmente" desde la ventana de edición del ítem (cosa que solo puede hacer el administrador) o desde el registro de una compra de ítem (con nuevo precio usando uno de dos métodos que me indicó el contador de la tienda – solo lo puede hacer el administrador). Mil Gracias, estoy empolvado en la programación y cuesta un poco analizar, gracias por la paciencia ......:D.

rastafarey 09-09-2016 14:42:34

Automatico o manual
 
Que es para ti automatico o manual?.
Manual una vez entrea la trigger o desde uan aplaicaion?.
O simplemente que usuario lo hizo?.
O sis fue desde una palaicacion para la que fue diseñada?
O unaplicaicon tipo ib expert?.

Bueno a mi me toco alago asi, pero mi aplicacion usaba plugin, y mantenia registro de lso cambio echos en l abase de datos y y para protegerme, por eso registraba si los cambio se habian echo desde un plugin, desde la aplicacion o algun f¿gestor externo. Eso lo hacia registrnado una variable, y cada tabla le ponia un tio para ver desde donde se hacia el cambio.

espero eso sea lo que quieres, aunque de verdad lo deseche mas adelante por que aunque tenias control, es preferible controlar a los usuaris, esn mi caso.


La franja horaria es GMT +2. Ahora son las 02:37:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi