Definición de Trigger Un trigger es una clase que implementa una interfaz que dispone de un método Run (...), en el cual se implementa la tarea que debe ser llevada a cabo, y un método Error (...), en el cual se implementa la tarea que debe ser llevada a cabo en caso de Que se produzca algún problema, en la mayoría de casos debería deshacer las Acciones llevadas a cabo en el método run (). Un trigger (o disparador) en una Base de datos, es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación. Dependiendo de la base de datos, los triggers pueden ser de inserción (INSERT), actualización (UPDATE) o borrado (DELETE). Algunas bases de datos pueden ejecutar triggers al crear, borrar o editar usuarios, tablas, bases de datos u otros objetos. Activación de los triggers Dentro del fichero isum.xml se especifica si iSUM debe gestionar triggers. También puede cambiar el nombre del fichero donde se registran y definen los Triggers. ... <Trigger> <Enabled>false</enabled> <definition_file_name>triggers.xml</definition_file_n Ame> </Trigger> ... Tipos de evento Se entiende como evento la llamada a un método de un objeto de persistencia. Puede definir una tarea para que se lleve a cabo cuando se produzca un evento, pero La tarea asociada al evento puede ser ejecutada antes o después de que se produzca Dicho evento. • Insert: Se produce cuando se intenta guardar el objeto por primera vez. • Update: Se produce cuando se intenta modificar algún dato del objeto. • Remove: Se produce cuando se intenta eliminar el objeto. Características de un trigger Puesto que los trigger se establecen sobre objetos de persistencia, cada objeto de Persistencia que soporte la gestión de triggers tiene asociado un tipo de trigger. Cada trigger implementa una interfaz concreta, así pues para gestionar un trigger Sobre un objeto que implemente la interfaz Device dispone de una interfaz DeviceTrigger la cual define los siguientes métodos. • Public void run (Device device); • Public void error (Device device); Como puede observar los dos métodos proporcionan un objeto, este objeto es el Objeto sobre el cual se produjo el evento. No aceptan parámetros o argumentos (pero podrían almacenar los datos afectados en tablas temporales) No pueden ejecutar las operaciones COMMIT o ROLLBACK por que estas son parte de la sentencia SQL del disparador (únicamente a través de transacciones autónomas) Pueden causar errores de mutaciones en las tablas, si se han escrito de manera deficiente. DROP FUNCTION inc_aux (); EJEMPLOS: 1. Este es un ejercicio para realizar auditorías almacenando en una tabla los eventos de instrucciones DDL que se realicen en la base de datos: Create or replace trigger DDLTrigger AFTER DDL ON DATABASE BEGIN insert into ADM VALUES ( ora_login_user, sysdate, ora_sysevent, ora_dict_obj_type, ora_dict_obj_owner, ora_dict_obj_name ); END; / 2. En este ejercicio obtendremos la sumatoria y el promedio de los saldos de los artículos: SET SERVEROUTPUT ON; CREATE OR REPLACE TRIGGER ESTA_ARTICULO AFTER INSERT OR DELETE OR UPDATE ON ARTICULO DECLARE CURSOR C_ESTADISTICO IS SELECT CODTIPO, AVG(SALDO) PROMEDIO,SUM(SALDO) SUMATORIA FROM ARTICULO GROUP BY CODTIPO; BEGIN FOR V_ESTADISTICA IN C_ESTADISTICO LOOP UPDATE ESTA_ARTICULO SET PROM= V_ESTADISTICA.PROMEDIO, SUMATORIA=V_ESTADISTICA.SUMATORIA WHERE CODTIP=V_ESTADISTICA.CODTIPO; IF SQL%NOTFOUND THEN INSERT INTO ESTA_ARTICULO VALUES(V_ESTADISTICA.CODTIPO,V_ESTADISTICA.PROMEDIO, V_ESTADISTICA.SUMATORIA); END IF; END LOOP; END; / 3. En este ejercicio trabajamos con los disparadores de sustitucion que trabajan solamente con vistas y la instruccion instead of: CREATE VIEW V_CLIENTE AS SELECT CODCLI,NOMCLIEFROM CLIENTE; SET SERVEROUTPUT ON; CREATE OR REPLACE TRIGGER V_CLIENTE INSTEAD OF DELETE OR INSERT OR UPDATE ON V_CLIENTE FOR EACH ROW BEGIN IF DELETING THEN DELETE FROM CLIENTE WHERE CODCLI=:OLD.CODCLI; DBMS_OUTPUT.PUT_LINE('SE BORRO EL REGISTRO'); ELSIF INSERTING THEN DBMS_OUTPUT.PUT_LINE('SE INSERTO UN REGISTRO'); ELSE DBMS_OUTPUT.PUT_LINE('SE ACTUALIZO UN REGISTRO'); END IF; END; / 4. Ahora en el ejercicio que sigue trabajaremos con paquetes, y usaremos dos disparadores Para mane jar las inserciones y actualizaiones de la tabla venta, que esta relacionada con la tabla cliente: CREATE OR REPLACE PACKAGE PVENTA AS V_CODCLI VENTA.CODCLI%TYPE; V_FORMAPAGO VENTA.FORMADEPAGO%TYPE; END; / CREATE OR REPLACE TRIGGER C_VENTA BEFORE INSERT OR UPDATE ON VENTA FOR EACH ROW BEGIN PVENTA.V_CODCLI:=:NEW.CODCLI; PVENTA.V_FORMAPAGO:=:NEW.FORMADEPAGO; END; / SET SERVEROUTPUT ON; CREATE OR REPLACE TRIGGER D_VENTA BEFORE INSERT OR UPDATE ON VENTA FOR EACH ROW DECLARE CURSOR CLIEN IS SELECT *FROM CLIENTE; BEGIN IF INSERTING THEN IF PVENTA.V_FORMAPAGO='CREDITO' THEN FOR V_LOOP IN CLIEN LOOP IF V_LOOP.CODCLI = PVENTA.V_CODCLI THEN UPDATE CLIENTE SET SALDOCLIE=(SALDOCLIE*1.05) WHERE CODCLI= PVENTA.V_CODCLI; DBMS_OUTPUT.PUT_LINE('BIEN'); END IF; END LOOP; END IF; ELSE IF PVENTA.V_FORMAPAGO='EFECTIVO' THEN FOR V_LOOP IN CLIEN LOOP IF V_LOOP.CODCLI = PVENTA.V_CODCLI THEN UPDATE CLIENTE SET SALDOCLIE = 0 WHERE CODCLI= PVENTA.V_CODCLI; DBMS_OUTPUT.PUT_LINE('BIEN ACTUALIZADO'); END IF; END LOOP; END IF; END IF; PVENTA.V_CODCLI:=NULL; PVENTA.V_FORMAPAGO:=NULL; END; / Las ventajas de usar los Disparadores son: La entrada en vigor automática de restricciones de los datos, hace que los usuarios entren sólo valores válidos. El mantenimiento de la aplicación se reduce, los cambios a un disparador se refleja automáticamente en todas las aplicaciones que tienen que ver con la tabla sin la necesidad de recompilar o relinquear. Logs automáticos de cambios a las tablas. Una aplicación puede guardar un registro corriente de cambios, creando un disparador que se active siempre que una tabla se modifique. La notificación automática de cambios a la Base de Datos con alertas de evento en los disparadores. Las desventajas de usar los disparadores son: •Hay que definir con anticipación la tarea que realizara el trigger •Peligro de pérdida en Reorganizaciones •Hay que programarlos para cada DBMS •Un Trigger nunca se llama directamente . •Los triggers no se desarrollan pensando en un solo registro, los mismos deben funcionar en conjunto con los datos ya que se disparan por operación y no por registro . •Por funcionalidad, no hay que poner en uno solo las funciones de INSERT,UPDATE y DELETE . •Utilizar moderadamente los triggers . •No se pueden utilizar en tablas temporales USOS: •Registrar, auditar y monitorear la actividad de cambio de datos •Validar datos, cambiando o negando acciones como INSERT, UPDATE, DELETE en una tabla •Preservar la consistencia y claridad de los datos ejecutando acciones relacionadas con otras tablas. Se puede usar mediante scripts del desarrollador en situaciones Complejas y condicionales en las que los ficheros de disparadores, o la Declaración de la directiva actívate en el fichero de control, no son Suficientemente informativos. También se puede usar para comprobaciones y administradores de sistemas (pero tenga en cuenta que dpkg-trigger no Accionara los disparadores). La sintaxis no reconocida de nombres de disparadores son un error para Dpkg-trigger. 'ORDENES --check-supported Revisa si la versión de dpkg en ejecución es compatible con Disparadores (habitualmente invocados mediante una Post-instalación). Cierra con 0 si dpkg es compatible con los Disparadores, o 1 con un mensaje de error por la salida estándar En caso de fallo. Por otra parte, en general es mejor activar Solo el disparador deseado con dpkg-trigger. -h, --help Muestra el modo de uso y termina. --versión Muestra la versión y termina. OPCIONES --admindir=directorio Cambia el directorio con la base de datos de dpkg. Por omisión es /var/lib/dpkg. --by-package=paquete Invalida la espera al inicio del disparador (habitualmente definido con dpkg a través de la variable de entorno <<DPKG_MAINTSCRIPT_PACKAGE>> en los scripts del desarrollador, Nombrando el paquete al que el script pertenece. Este es el Comportamiento por omision.) --No-await Esta opción define que la invocación al paquete T (de existir) No necesita esperar al procesamiento de este disparador; el Paquete(s) interesado I no se añadirá a la lista de espera del Procesado del disparador, sin cambiar el estado de T. Puede que Se considere que T está instalado aunque no se haya procesado el Disparador. --no-act Realiza un simulacro sin cambios en el sistema. 5 BASES MAS USADAS 1. World Data Centre for Climate El WDCC (Centro Mundial de datos para el clima) es la base de datos más grande del mundo. Almacena unos 220 terabytes de información y 6 peta bytes de información adicional, incluyendo datos sobre el clima, predicciones y simulaciones. 2. National Energy Research Scientific Computing Center El NERSC se dedica a investigar sobre distintos tipos de energía. Su base de datos tiene 2.8 Peta bytes. 3. AT&T Se trata de una compañía de telecomunicaciones que almacena 323 terabytes de información. 4. Google Aunque se desconoce el verdadero tamaño de su base de datos, sí se puede estimar. La compañía recibe unos 91 millones de consultas al día, consultas que son almacenadas por la compañía. Se supone que almacena cientos de terabytes de información. 5. Sprint Con 53 millones de clientes, Sprint es una de las mayores compañías de telecomunicaciones del mundo. Guarda los detalles de 365 millones de llamadas al día. Procedimiento almacenado Un procedimiento almacenado (stored procedure en inglés) es un programa (o procedimiento) el cual es almacenado físicamente en una base de datos. Su implementación varía de un gestor de bases de datos a otro. La ventaja de un procedimiento almacenado es que al ser ejecutado, en respuesta a una petición de usuario, es ejecutado directamente en el motor de bases de datos, el cual usualmente corre en un servidor separado. Como tal, posee acceso directo a los datos que necesita manipular y sólo necesita enviar sus resultados de regreso al usuario, deshaciéndose de la sobrecarga resultante de comunicar grandes cantidades de datos salientes y entrantes. Usos típicos para procedimientos almacenados incluyen la validación de datos siendo integrados a la estructura de base de datos (los procedimientos almacenados utilizados para este propósito a menudo son llamados disparadores; triggers en inglés), o encapsular un proceso grande y complejo. El último ejemplo generalmente ejecutará más rápido como un procedimiento almacenado que de haber sido implementado como, por ejemplo, un programa corriendo en el sistema cliente y comunicándose con la base de datos mediante el envío de consultas SQL y recibiendo sus resultados. Los procedimientos pueden ser ventajosos: Cuando una base de datos es manipulada desde muchos programas externos. Al incluir la lógica de la aplicación en la base de datos utilizando procedimientos almacenados, la necesidad de embeber la misma lógica en todos los programas que acceden a los datos es reducida. Esto puede simplificar la creación y, particularmente, el mantenimiento de los programas involucrados. Podemos ver un claro ejemplo de estos procedimientos cuando requerimos realizar una misma operación en un servidor dentro de algunas o todas las bases de datos y a la vez dentro de todas o algunas de las tablas de las bases de datos del mismo. Para ello podemos utilizar a los Procedimientos almacenados auto creables que es una forma de generar ciclos redundantes a través de los procedimientos almacenados. Implementación Estos procedimientos, se usan a menudo, pero no siempre, para realizar consultas SQL sobre los objetos del banco de datos de una manera abstracta, desde el punto de vista del cliente de la aplicación. Un procedimiento almacenado permite agrupar en forma exclusiva parte de algo específico que se desee realizar o, mejor dicho, el SQL apropiado para dicha acción. CORRECTO Usos Los usos 'típicos' de los procedimientos almacenados se aplican en la validación de datos, integrados dentro de la estructura del banco de datos. Los procedimientos almacenados usados con tal propósito se llaman comúnmente disparadores, o triggers. Otro uso común es la 'encapsulación' de un API para un proceso complejo o grande que podría requerir la 'ejecución' de varias consultas SQL, tales como la manipulación de un 'data set' enorme para producir un resultado resumido. También pueden ser usados para el control de gestión de operaciones, y ejecutar procedimientos almacenados dentro de una transacción de tal manera que las transacciones sean efectivamente transparentes para ellos. El siguiente es un ejemplo de procedimiento almacenado en MySQL: DELIMITER | CREATE PROCEDURE autos (IN velocidad INT, IN marca VARCHAR (50)) BEGIN IF velocidad < 120 THEN INSERT INTO familiares VALUES (velocidad, marca); ELSE INSERT INTO deportivos VALUES (velocidad, marca); END IF; END;