SQL> @&1 SQL> /* @ej1a_trigger.sql */ SQL> /* Este ejemplo pretende ilustrar las diferencias entre los diferentes modos de especificar SQL> los eventos en disparadores (a nivel de sentencia o a nivel de tupla y BEFORE o AFTER) y SQL> mostrar el orden en que se ejecutan. Para ello se ha implementado un disparador de cada SQL> tipo que sólo muestra un mensaje al ejecutarse una sentencia de eliminar un suministro. SQL> S.V. Univ. Zaragoza, 10 mayo 2015 SQL> */ SQL> SET ECHO ON SQL> SET SERVEROUTPUT ON SQL> SET linesize 132 SQL> SET pagesize 100 SQL> SQL> -- modificar el ancho para columnas de tipo LONG (p.e. el cuerpo de un trigger) SQL> SET LONG 255 SQL> SQL> -- mostrar las tuplas de suministrar SQL> SELECT * FROM Suministrar; CLVPROV CLVPIEZA ---------- ---------- 1 91 1 92 2 92 2 93 2 94 1 95 2 95 7 filas seleccionadas. SQL> SQL> /*-------------------------------------------------------------------------- > Crear un disparador para ilustrar BEFORE a nivel de sentencia SQL> */ SQL> CREATE OR REPLACE TRIGGER tr_BefDel_Sum 2 BEFORE DELETE ON Suministrar 3 BEGIN 4 DBMS_OUTPUT.PUT_LINE('accion BEFORE DELETE en tabla Suministrar'); 5 -- raise_application_error( -20501, 'error antes de iniciar el borrado en Suministrar'); 6 END tr_BefDel_Sum; 7 / Disparador creado. SQL> SHOW ERRORS TRIGGER tr_BefDel_Sum No hay errores. SQL> SQL> /*-------------------------------------------------------------------------- > Crear un disparador para ilustrar BEFORE a nivel de tupla SQL> */ SQL> CREATE OR REPLACE TRIGGER tr_BefDelRow_Sum 2 BEFORE DELETE ON Suministrar 3 FOR EACH ROW 4 BEGIN 5 DBMS_OUTPUT.PUT_LINE('accion BEFORE DELETE el suministro (' || :OLD.clvProv || ', ' || :OLD.clvPieza || ')'); 6 -- raise_application_error( -20501, 'error antes de borrar tupla en Suministrar'); 7 END tr_BefDelRow_Sum; 8 / Disparador creado. SQL> SHOW ERRORS TRIGGER tr_BefDelRow_Sum No hay errores. SQL> SQL> /*-------------------------------------------------------------------------- > Crear un disparador para ilustrar AFTER a nivel de tupla SQL> */ SQL> CREATE OR REPLACE TRIGGER tr_AftDelRow_Sum 2 AFTER DELETE ON Suministrar 3 FOR EACH ROW 4 BEGIN 5 DBMS_OUTPUT.PUT_LINE('accion AFTER DELETE el suministro (' || :OLD.clvProv || ', ' || :OLD.clvPieza || ')'); 6 -- raise_application_error( -20501, 'error despues de borrar tupla en Suministrar'); 7 END tr_AftDelRow_Sum; 8 / Disparador creado. SQL> SHOW ERRORS TRIGGER tr_AftDelRow_Sum No hay errores. SQL> SQL> /*-------------------------------------------------------------------------- > Crear un disparador para ilustrar AFTER a nivel de sentencia SQL> */ SQL> CREATE OR REPLACE TRIGGER tr_AftDel_Sum 2 AFTER DELETE ON Suministrar 3 BEGIN 4 DBMS_OUTPUT.PUT_LINE('accion AFTER DELETE en tabla Suministrar'); 5 -- raise_application_error( -20501, 'error despues de borrar en Suministrar'); 6 END tr_AftDel_Sum; 7 / Disparador creado. SQL> SHOW ERRORS TRIGGER tr_AftDel_Sum No hay errores. SQL> SQL> SQL> column TRIGGER_NAME heading "nombre" format a20; SQL> column TRIGGER_TYPE heading "tipo" format a20; SQL> column TRIGGERING_EVENT heading "evento" format a60; SQL> SQL> /* mostrar todos los disparadores del usuario */ SQL> -- select * from USER_TRIGGERS; SQL> SELECT TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT FROM USER_TRIGGERS; nombre tipo evento -------------------- -------------------- ------------------------------------------------------------ ACCESOSERVICIO AFTER EACH ROW INSERT GANARETAPA AFTER EACH ROW INSERT OR UPDATE OR DELETE NUEVATARJETA BEFORE EACH ROW INSERT TR_AFTDELROW_SUM AFTER EACH ROW DELETE TR_AFTDEL_SUM AFTER STATEMENT DELETE TR_BEFDELROW_SUM BEFORE EACH ROW DELETE TR_BEFDEL_SUM BEFORE STATEMENT DELETE UPDATE_MATRDXT AFTER STATEMENT INSERT OR UPDATE OR DELETE 8 filas seleccionadas. SQL> SQL> column OBJECT_NAME heading "nombre" format a18; SQL> column DATA_OBJECT_ID heading "id" format a2; SQL> column SUBOBJECT_NAME heading "subobjeto" format a9; SQL> SQL> /* mostrar todos los disparadores del usuario */ SQL> SELECT * FROM user_objects WHERE object_type='TRIGGER'; nombre subobjeto OBJECT_ID id OBJECT_TYPE CREATED LAST_DDL TIMESTAMP STATUS T G S ------------------ --------- ---------- ---------- ------------------ -------- -------- ------------------- ------- - - - ACCESOSERVICIO 2325415 TRIGGER 15/07/14 15/07/14 2014-07-15:19:00:59 VALID N N N GANARETAPA 2307442 TRIGGER 23/05/14 23/05/14 2014-05-23:12:23:16 VALID N N N NUEVATARJETA 2325414 TRIGGER 15/07/14 15/07/14 2014-07-15:19:00:59 VALID N N N TR_AFTDELROW_SUM 2376942 TRIGGER 11/05/15 11/05/15 2015-05-11:22:28:42 VALID N N N TR_AFTDEL_SUM 2376943 TRIGGER 11/05/15 11/05/15 2015-05-11:22:28:42 VALID N N N TR_BEFDELROW_SUM 2376941 TRIGGER 11/05/15 11/05/15 2015-05-11:22:28:41 VALID N N N TR_BEFDEL_SUM 2376940 TRIGGER 11/05/15 11/05/15 2015-05-11:22:28:41 VALID N N N UPDATE_MATRDXT 2311698 TRIGGER 03/06/14 03/06/14 2014-06-03:02:55:24 VALID N N N 8 filas seleccionadas. SQL> SQL> /* mostrar todos los disparadores sobre la tabla Suministrar */ SQL> SELECT TRIGGER_NAME, TABLE_OWNER FROM USER_TRIGGERS WHERE TABLE_NAME = 'SUMINISTRAR'; nombre TABLE_OWNER -------------------- ------------------------------ TR_AFTDELROW_SUM ASIGBD TR_AFTDEL_SUM ASIGBD TR_BEFDELROW_SUM ASIGBD TR_BEFDEL_SUM ASIGBD SQL> SQL> -- insertar algunas tuplas en suministrar SQL> INSERT INTO suministrar VALUES (1, 96); 1 fila creada. SQL> INSERT INTO suministrar VALUES (1, 97); 1 fila creada. SQL> INSERT INTO suministrar VALUES (3, 97); 1 fila creada. SQL> SQL> SELECT * FROM Suministrar ORDER BY clvPieza; CLVPROV CLVPIEZA ---------- ---------- 1 91 1 92 2 92 2 93 2 94 1 95 2 95 1 96 1 97 3 97 10 filas seleccionadas. SQL> SQL> -- eliminar una única tupla SQL> DELETE FROM suministrar WHERE clvPieza=96; accion BEFORE DELETE en tabla Suministrar accion BEFORE DELETE el suministro (1, 96) accion AFTER DELETE el suministro (1, 96) accion AFTER DELETE en tabla Suministrar 1 fila suprimida. SQL> SQL> -- eliminar dos tuplas en una única sentencia SQL> DELETE FROM suministrar WHERE clvPieza=97; accion BEFORE DELETE en tabla Suministrar accion BEFORE DELETE el suministro (1, 97) accion AFTER DELETE el suministro (1, 97) accion BEFORE DELETE el suministro (3, 97) accion AFTER DELETE el suministro (3, 97) accion AFTER DELETE en tabla Suministrar 2 filas suprimidas. SQL> SQL> -- FINAL DEL TEST. Eliminar de la BD los elementos añadidos. SQL> SQL> -- eliminar los disparadores creados en este ejemplo SQL> DROP TRIGGER tr_BefDel_Sum; Disparador borrado. SQL> DROP TRIGGER tr_BefDelRow_Sum; Disparador borrado. SQL> DROP TRIGGER tr_AftDel_Sum; Disparador borrado. SQL> DROP TRIGGER tr_AftDelRow_Sum; Disparador borrado. SQL> SQL> -- eliminar las tuplas añadidas a suministrar (sólo para el caso en que los disparadores no lo hubieran permitido) SQL> SQL> DELETE FROM suministrar WHERE clvPieza=96; 0 filas suprimidas. SQL> DELETE FROM suministrar WHERE clvPieza=97; 0 filas suprimidas. SQL> set echo off fin de la ejecucion de K:\BD_2015\pruebas_ORACLE\ej_clase\ej1_trigger\ej1a_trigger.sql inicio de sesión interactiva ASIGBD vicious.hendrix-oracle.cps.unizar.es fecha: 11/05/15 SQL> exit