Ir al contenido


Foto

[RESUELTO] Ingresar registro deshabilitando los triggers


  • Por favor identifícate para responder
12 respuestas en este tema

#1 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 12 enero 2010 - 04:29

Saludos, estoy trabajando con firebird 2.0

Necesito insertar un registro pero sin que se disparen los triggers de la BD, hay alguna forma fácil de hacer esto???
  • 0

#2 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 12 enero 2010 - 05:01

pues la única forma que yo conozco es desactivando los triggers, insertanto y volviendo a activar
  • 0

#3 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 12 enero 2010 - 05:50

Perdón si hablo a lo tonto, ¿ no se puede crear un trigger que tenga validación y se dispare dependiendo de un valor ?

Con eso podrías realizar lo que deseas, pero como digo, yo no soy muy ducho para los triggers, pero si tengo buena imaginación :D :D :D

Salud OS
  • 0

#4 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 12 enero 2010 - 07:03

Saludos.

Egostar los triggers siempre se disparan atendiendo su origen, pero bien se puede poner cierta validación que si se da, entonces realice el cuerpo del trigger.

Bueno la manera fácil sería tener un SP que se llame antes y después de la inserción con la sentencia DDL y que dicha sentencia este dentro de un EXECUTE STATEMENT.
  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 13 enero 2010 - 03:07

poliburro + 1 y Rolphy + 1.

Puedes utilizar ambas técnicas.

O bien desactivas primero el trigger antes de hacer tus inserciones :

ALTER TRIGGER MI_NOMBRE_DE_TRIGGER INACTIVE;

Y cuando hayas terminado lo vuelves a activar.

O bien haces una validación al principio del Trigger. Yo tengo bastantes triggers que tienen todo su código englobado en un condicional para que solo se ejecute bajo determinadas condiciones :

IF (condicion) THEN BEGIN

  cuerpo_del_trigger;
  ...
  ...

END


  • 0

#6 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 13 enero 2010 - 07:50

Hola, el asunto es que son 21 base de datos en producción que debo modificar, y no quiero alterar su estructura por esto ya que es un proceso especial, no es algo que se repita.

Por lo tanto creo que esta es la instrucción que estaba buscando:

ALTER TRIGGER MI_NOMBRE_DE_TRIGGER INACTIVE;

me imagino que para revertirla seria

ALTER TRIGGER MI_NOMBRE_DE_TRIGGER ACTIVE;

por ejemplo podría ejecutar esto desde un script?



sql
  1. ALTER TRIGGER MI_NOMBRE_DE_TRIGGER INACTIVE;
  2. commit;
  3.  
  4. START TRANSACTION;
  5.   INSERT INTO;
  6. commit;
  7.  
  8. START TRANSACTION;
  9. ALTER TRIGGER MI_NOMBRE_DE_TRIGGER ACTIVE;
  10. commit;



que dicen de la idea?
  • 0

#7 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 13 enero 2010 - 07:58

Saludos.

Bueno como es algo especial y es solo cuestión de segundos antes de dicha ejecución debes sacar a todos los usuarios para mantener la congruencia de la data y demás.

Desde un Script es posible hacerlo de esa manera que indicas, claro que debes de utilizar un programa (IbExpert) o un componente (IBScript) que soporte esta funcionalidad.

Salvo que no necesitas esos Start Transaction, solo usar Commit después de la inserción, con eso es suficiente.
  • 0

#8 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 13 enero 2010 - 08:37

ok, gracias Rolphy.

Tengo planeado hacerlo en la noche, digo si el racionamiento eléctrico lo permite.

Planeo hacerlos con el zeos, el componente Script  gracias por todo.
  • 0

#9 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 13 enero 2010 - 09:33

Hola, el asunto es que son 21 base de datos en producción que debo modificar, y no quiero alterar su estructura por esto ya que es un proceso especial, no es algo que se repita.

Por lo tanto creo que esta es la instrucción que estaba buscando:

ALTER TRIGGER MI_NOMBRE_DE_TRIGGER INACTIVE;

me imagino que para revertirla seria

ALTER TRIGGER MI_NOMBRE_DE_TRIGGER ACTIVE;

por ejemplo podría ejecutar esto desde un script?



sql
  1. ALTER TRIGGER MI_NOMBRE_DE_TRIGGER INACTIVE;
  2. commit;
  3.  
  4. START TRANSACTION;
  5.   INSERT INTO;
  6. commit;
  7.  
  8. START TRANSACTION;
  9. ALTER TRIGGER MI_NOMBRE_DE_TRIGGER ACTIVE;
  10. commit;



que dicen de la idea?



Así es como yo lo haría. Ahora bien. como comentas que son n cantidad de tablas debes considerar si el motor de firebird las bloquea cuando las pones dentro de la transacción pues de no hacerlo deberas bloquearlas a mano para evitar problemas si otros usuarios están escribiendo en esas tablas.

En Ado existe un componente llamado ADO command que es el utilizado para este tipo de operaciones. No se que control uses pero en principio creo que podrás usar los query sin mayor problema.

saludos amigo.


Edito: Me he fijado mejor en tu código amigo y no sería mejor que toda la operación fuera dentro de un solo bloque transaccional?. Así de fallar una operación se deshacen todos los movimientos y no solo donde ocurra el error
  • 0

#10 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 13 enero 2010 - 09:38

Eso pensé, pero luego dude porque no sabia si los alter trigger funcionarían sin darle commit.
  • 0

#11 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 13 enero 2010 - 09:43

Eso pensé, pero luego dude porque no sabia si los alter trigger funcionarían sin darle commit.


Se supone que el motor debe ser capaz de ejecutar la operación en los triggers dentro o fuera del bloque. Mis conocimientos sobre firebird son demasiado escasos para poder afirmar o negar que pueda hacerlo. Pero en principio se supone que debe.

Saludos
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 enero 2010 - 09:48

ok, gracias Rolphy.

Tengo planeado hacerlo en la noche, digo si el racionamiento eléctrico lo permite.

Planeo hacerlos con el zeos, el componente Script  gracias por todo.


De cualquier forma crea un respaldo antes no vaya a ser el diablo :)

Salud OS
  • 0

#13 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 13 enero 2010 - 09:50

ok Gracias por la info, voy a hacer unas pruebas a ver :D:D  :cool:

Y el respaldo si va :D:D
  • 0




IP.Board spam blocked by CleanTalk.