Você está na página 1de 9

Triggers y Stored Procedures En esta introduccin veremos que son estas rutinas que se ejecutan en el servidor mediante un lenguaje

que es una mezcla entre el declarativo y el procedural. Trigger Como lo dice su nombre, un trigger es un evento que se dispara y que se ejecuta dadas ciertas condiciones. Un trigger debe estar asociado a una tabla o vista, y debe asignarse el momento y el tipo de evento en el cual dispararse. Los diferentes eventos posibles son INSERT, UPDATE y DELETE. El trigger se ejecuta cuando el servidor ejecuta alguna de estas instrucciones sobre la tabla o vista a la cual pertenece el trigger (y el trigger se fija como ACTIVE). Adems puede configurarse el trigger para ser ejecutado a partir de varios tipos de eventos (ejemplo: INSERT OR UPDATE). Tambin puede especificarse el momento en el cual disparar la ejecucin, existen dos posibilidades: antes (BEFORE) que se lleve a cabo la instruccin o despus (AFTER). Dependiendo del momento de disparo, existen variables especiales (NEW y OLD) que nos permiten acceder a los datos de la tupla en cuestin antes y luego de la ejecucin de la instruccin. Es muy importante aclarar que estas variables NEW y OLD no estn disponibles en todos los momentos ni tipos de eventos. La variable NEW existe solo para un trigger del tipo INSERT/UPDATE, accediendo a NEW.columna, accedemos al valor. Si es un trigger de tipo BEFORE se puede utilizar para asignar un valor nuevo a la columna, si es de tipo AFTER solo podemos leer el valor. Y la variable OLD existe solo para un trigger del tipo AFTER UPDATE/DELETE pero solo para lectura. Dentro del trigger podremos saber que tipo de evento dispar la ejecucin mediante la lectura de INSERTING, UPDATING y DELETING. Esto es especialmente til cuando se definen condiciones de ejecucin para varios tipos de eventos, por ejemplo UPDATE OR DELETE.

Este es el esqueleto de la sintaxis para la creacin de triggers:

01 02 03 04 05 06 07 08 09 10 11 12 13

SET TERM ^ ;

CREATE TRIGGER name [FOR table/view] [IN]ACTIVE [ON {[DIS]CONNECT | TRANSACTION {START | COMMIT | ROLLBACK}} ] [{BEFORE | AFTER} INSERT OR UPDATE OR DELETE] POSITION number AS BEGIN /* enter trigger code here */ END^

SET TERM ; ^

Utilizamos SET TERM para cambiar temporalmente el separador de intrucciones ya que dentro del cuerpo del trigger (lo que colocaremos entre BEGIN y END) ser necesario utilizar varios separados. Veamos un ejemplo. Aqui tenemos un trigger para la tabla TBLPERSONAS, que se ejecuta (ACTIVE) antes de una insercin o una actualizacin (BEFORE INSERT OR UPDATE) y ser el primer trigger que se ejecutar bajo estas condiciones (POSITION 0). Antes no lo aclar y parece un buen momento, POSITION representa el orden de ejecucin del trigger, el valor ms bajo se ejecuta primero. Siguiendo con el cdigo vemos que dentro del cuerpo del trigger asignamos a la columna usuario el valor USER, que es una variable del servidor que nos permite conocer cual es el nombre de usuario logueado, es un varchar. Luego verificamos el dni, si no ha sido incluido en la sentencia INSERT o UPDATE, entonces lo generamos nosotros utilizando el generador gen_persona y la funcin GEN_ID.

01 02 03 04 05 06 07 08 09 10

SET TERM ^ ; CREATE TRIGGER TRI_PERSONA FOR TBLPERSONAS ACTIVE BEFORE INSERT OR UPDATE POSITION 0 AS begin new.usuario = USER; if( new.dni is null ) then new.dni = GEN_ID(gen_persona, -1); end^ SET TERM ; ^

La utilidad de este trigger en particular es la de "preparar" los datos de la tupla con valores vlidos antes de ejecutar un INSERT o un UPDATE. Tome en cuenta que

el dni est definido en la tabla como NOT NULL por lo tanto, le damos un valor vlido y requerido. Los triggers pueden incluso acceder a datos en otras tablas, realizar selects y modificaciones, pero a eso lo describir en otro artculo sobre sql procedural. Se utilizan mucho para validar los datos que se quieren escribir en la tabla y generar excepciones en caso de error. Por ahora con saber que son y como es el uso basico de los triggers alcanza para empezar a practicar. Y algo muy importante que acabo de recordar y casi omito: Cmo ejecuto el trigger? La respuesta es simple, no se puede ejecutar directamente. Los trigger se disparan automticamente cuando ejecutamos intrucciones INSERT, UPDATE y DELETE sobre la tabla en cuestin, el trigger es del tipo de la instruccin ejecutada y est ACTIVE. Por lo que no debemos preocuparnos por ello, y lo mejor: usando triggers centralizamos muchas reglas de negocios en la propia base de datos, en la capa de datos. Esto nos permite crear clientes ms livianos y mucho ms simples de mantener.

Stored Procedures La misma palabra lo dice, son procedimientos almacenados... en la base de datos! La sintaxis es muy parecida a la de los triggers, algunas cuestiones ya no nos interesan como el momento y tipo de eventos. Un procedimiento es ejecutado a peticin directa a diferencia de los triggers.

He aqu la sintaxis:

01 02 03 04 05 06 07 08 09 10 11 12 13

SET TERM ^ ;

CREATE PROCEDURE name ( input_parameter_name < datatype>, ... ) RETURNS ( output_parameter_name < datatype>, ... ) AS DECLARE VARIABLE variable_name < datatype>; BEGIN /* write your code here */ END^

SET TERM ; ^

Lo nuevo aqu es la posibilidad de incluir parmetros y devolver datos. Conceptualmente es muy similar a una funcin en un lenguaje funcional como pascal o php.

Nada mejor que ir directo al ejemplo en este caso. Este procedimiento se encarga de eliminar los acentos y caracteres considerados "raros". Para ello solicita un varchar de 100 caracteres (ORIGEN) y retorna un varchar de 100 caracteres sin estos caracteres raros. Cabe aclarar que el uso de parametros y de valores de retorno es opcional. Tambin vemos por primera vez el uso de variables locales del stored procedure (DECLARE VARIABLE CAR VARCHAR(1);), un simple varchar de 1. En los triggers tambien podemos declarar variables locales.

El cuerpo es muy facil de leer, note el uso de las variables dentro del cuerpo y como funcionan las condiciones del WHILE.

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

SET TERM ^ ; CREATE PROCEDURE "AX_EliminarAcentos" ( ORIGEN Varchar(100) ) RETURNS ( RESULTADO Varchar(100) ) AS DECLARE VARIABLE CAR VARCHAR(1); begin CAR = ''; RESULTADO = ''; ORIGEN = ORIGEN || '#'; /* Valor Frontera */ while (:ORIGEN is not null and :ORIGEN <> '') do begin if (:CAR = '') then CAR = 'a'; if (:CAR = '') then CAR = 'a'; if (:CAR = '') then CAR = 'a'; if (:CAR = '') then CAR = 'a'; if (:CAR = '') then CAR = 'e'; if (:CAR = '') then CAR = 'e'; if (:CAR = '') then CAR = 'e'; if (:CAR = '') then CAR = 'e'; if (:CAR = '') then CAR = 'i'; if (:CAR = '') then CAR = 'i';

23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47

if (:CAR = '') then CAR = 'i'; if (:CAR = '') then CAR = 'i'; if (:CAR = '') then CAR = 'o'; if (:CAR = '') then CAR = 'o'; if (:CAR = '') then CAR = 'o'; if (:CAR = '') then CAR = 'o'; if (:CAR = '') then CAR = 'u'; if (:CAR = '') then CAR = 'u'; if (:CAR = '') then CAR = 'u'; if (:CAR = '') then CAR = 'u'; if (:CAR = '') then CAR = 'A'; if (:CAR = '') then CAR = 'A'; if (:CAR = '') then CAR = 'A'; if (:CAR = '') then CAR = 'A'; if (:CAR = '') then CAR = 'E'; if (:CAR = '') then CAR = 'E'; if (:CAR = '') then CAR = 'E'; if (:CAR = '') then CAR = 'E'; if (:CAR = '') then CAR = 'I'; if (:CAR = '') then CAR = 'I'; if (:CAR = '') then CAR = 'I'; if (:CAR = '') then CAR = 'I'; if (:CAR = '') then CAR = 'O'; if (:CAR = '') then CAR = 'O'; if (:CAR = '') then CAR = 'O';

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

if (:CAR = '') then CAR = 'O'; if (:CAR = '') then CAR = 'U'; if (:CAR = '') then CAR = 'U'; if (:CAR = '') then CAR = 'U'; if (:CAR = '') then CAR = 'U'; if (:CAR = '') then CAR = 'c'; if (:CAR = '') then CAR = 'C'; if (:CAR = '') then CAR = 'n'; if (:CAR = '') then CAR = 'N'; if (:CAR = '') then CAR = ''; if (:CAR = '') then CAR = ''; if (:CAR = '.') then CAR = ''; RESULTADO = RESULTADO || CAR; CAR = substring(ORIGEN from 1 for 1); ORIGEN = substring(ORIGEN from 2 for 100); end end^ SET TERM ; ^

Sintaxis de START TRANSACTION. Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto significa que en cuanto ejecute un comando que actualice (modifique) una tabla, MySQL almacena la actualizacin en disco. Si usa tablas transaccionales (como InnoDB o BDB), puede desactivar el modo autocommit con el siguiente comando: SET AUTOCOMMIT=0;

Tras deshabilitar el modo autocommit poniendo la variable AUTOCOMMIT a cero, debe usar COMMIT para almacenar los cambios en disco o ROLLBACK si quiere ignorar los cambios hechos desde el comienzo de la transaccin. Si quiere deshabilitar el modo autocommit para una serie nica de comandos, puede usar el comando START TRANSACTION: START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT; Con START TRANSACTION, autocommit permanece deshabilitado hasta el final de la transaccin con COMMIT o ROLLBACK. El modo autocommit vuelve a su estado prvio. BEGIN y BEGIN WORK se soportan como alias para START TRANSACTION para iniciar una transaccin. START TRANSACTION es sintaxis SQL estndar y es la forma recomendada para iniciar una transaccin ad-hoc . El comando BEGIN difiere del uso de la palabra clave BEGIN que comienza un comando compuesto BEGIN ... END. Puede comenzar una transaccin as: START TRANSACTION WITH CONSISTENT SNAPSHOT; La clusula WITH CONSISTENT SNAPSHOT comienza una lectura consistente para motores de almacenamiento capaces de ello. Actualmente, esto se aplica slo a InnoDB. El efecto es el mismo que realizar un START TRANSACTION seguido por un SELECT desde cualquier tabla InnoDB . Comenzar una transaccin provoca que se realice un UNLOCK TABLES implcito. Tenga en cuenta que si no usa tablas transaccionales, cualquier cambio se almacena de golpe, a pesar del estado del modo autocommit .

Você também pode gostar