/* @ej_trigg_1.sql */
-- este ejemplo pretende ilustrar las diferencias entre los diferentes modos de especificar
-- los eventos en disparadores (a nivel de sentencia o a nivel de tupla y BEFORE o AFTER)
SET ECHO ON
SET SERVEROUTPUT ON
SET linesize 132
SET pagesize 100

-- modificar el ancho para columnas de tipo LONG (p.e. el cuerpo de un trigger)
SET LONG 255

SELECT * FROM Suministrar;

/* Crear un disparador para ilustrar BEFORE a nivel de sentencia
*/
CREATE OR REPLACE TRIGGER DEL_TR_BD
BEFORE DELETE ON Suministrar
BEGIN
  DBMS_OUTPUT.PUT_LINE('accion BEFORE DELETE en tabla Suministrar');
  INSERT INTO suministrar VALUES (2, 96);
--  raise_application_error( -20501, 'error antes de iniciar el borrado en Suministrar');
END DEL_TR_BD;
/
SHOW ERRORS TRIGGER DEL_TR_BD

/* Crear un disparador para ilustrar BEFORE a nivel de tupla
*/
CREATE OR REPLACE TRIGGER DEL_TR_BDR
BEFORE DELETE ON Suministrar
FOR EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('accion BEFORE DELETE el suministro (' || :OLD.clvProv || ', ' || :OLD.clvPieza || ')');
--  raise_application_error( -20501, 'error antes de borrar tupla en Suministrar');
END DEL_TR_BDR;
/
SHOW ERRORS TRIGGER DEL_TR_BDR

/* Crear un disparador para ilustrar AFTER a nivel de tupla
*/
CREATE OR REPLACE TRIGGER DEL_TR_ADR
AFTER DELETE ON Suministrar
FOR EACH ROW
BEGIN
  DBMS_OUTPUT.PUT_LINE('accion AFTER DELETE el suministro (' || :OLD.clvProv || ', ' || :OLD.clvPieza || ')');
--  raise_application_error( -20501, 'error despues de borrar tupla en Suministrar');
END DEL_TR_ADR;
/
SHOW ERRORS TRIGGER DEL_TR_ADR

/* Crear un disparador para ilustrar AFTER a nivel de sentencia
*/
CREATE OR REPLACE TRIGGER DEL_TR_AD
AFTER DELETE ON Suministrar
BEGIN
  DBMS_OUTPUT.PUT_LINE('accion AFTER DELETE en tabla Suministrar');
  raise_application_error( -20501, 'error despues de borrar en Suministrar');
END DEL_TR_AD;
/
SHOW ERRORS TRIGGER DEL_TR_AD

INSERT INTO suministrar VALUES (1, 97);
INSERT INTO suministrar VALUES (3, 97);

SELECT * FROM Suministrar ORDER BY clvPieza;

-- eliminar tuplas en suministrar
DELETE FROM suministrar WHERE clvPieza=97;

SELECT * FROM Suministrar ORDER BY clvPieza;

DELETE FROM suministrar WHERE clvPieza=96;

DROP TRIGGER DEL_TR_BD;
DROP TRIGGER DEL_TR_BDR;
DROP TRIGGER DEL_TR_AD;
DROP TRIGGER DEL_TR_ADR;

DELETE FROM suministrar WHERE clvPieza=96;
DELETE FROM suministrar WHERE clvPieza=97;
