Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PSUMA_TOTALES(
PCVE_V => PCVE_V,
OTOTAL => OTOTAL
);
DBMS_OUTPUT.PUT_LINE(ototal);
END;
Triggers
Row Triggers
"BEFORE triggers“
Se ejecuta el trigger antes de ejecutarse la operación de insert, update, delete.
“AFTER triggers“
Se ejecuta el trigger despúes de ejecutarse la operación de insert,update o delete
AFTER triggers pueden modificar la misma tabla, otra tabla.
La diferencia en la activación entre ambos tipos de trigger refleja el propósito del
trigger.
BEFORE triggers en general son una extensión de las validaciones del DBMS por
lo tanto:
Se pueden ejecutar validaciones en los datos de entrada.
Generar nuevos valores para nuevos registros.
Leer otras tablas para obtener valores de referencia.
BEFORE triggers no son usados para modificar valores de la base de datos
debido a que el trigger es ejecutado antes de que los datos queden guardados en
la Base de datos.
AFTER triggers siempre ven la base de datos en un estado consistente, ya que
se ejecutan despúes de haberse ejecutado las validaciones de integridad.
Ejecución Triggers
Ejecución Triggers
Para una tabla dada con triggers de BEFORE y AFTER asociados el evento de
UPDATE, todos los triggers de BEFORE se ejecutan primero.
Si los triggers de UPDATE tienen lógica de actualización, se ejecutan las
actualizaciones las cuales quedan integradas como un resultado intermedio que
va pasando de un trigger a otro para tratar de mantener la consistencia de
valores.
Cuando todos los triggers de BEFORE han sido activados por el evento que lo
disparó, el resultado intermedio viaja como entrada a los triggers de AFTER.
Triggers
Los triggers se usan generalmente en:
INSERT event (as a new record is being inserted into the database).
UPDATE event (as a record is being changed).
DELETE event (as a record is being deleted).
Triggers
create table v_demotrig as select * from jsilva.v v;
CREATE SEQUENCE TSTAT_SEQ INCREMENT BY 1 START WITH 1
MAXVALUE 99999999999999999999 MINVALUE 1 NOCACHE ORDER;
CREATE TABLE TSTAT (
CVE_STAT INTEGER NOT NULL,
DESCRIPCION VARCHAR(100) NOT NULL,
CONSTRAINT "PK_TSTAT" PRIMARY KEY ("CVE_STAT")
);
CREATE OR REPLACE TRIGGER TIB_TSTAT
BEFORE INSERT ON TSTAT
FOR EACH ROW
DECLARE
BEGIN
SELECT TSTAT_SEQ.NEXTVAL INTO :NEW.CVE_STAT FROM DUAL;
END;
/
insert into tstat(descripcion) values ('ACTIVO');
insert into tstat(descripcion) values ('BORRADO');
commit;
select * from tstat;
Triggers Valida Inserción e inserta en histórica
alter table v_demotrig add cve_stat integer null;
update V_DEMOTRIG set cve_stat = 1 ;
commit;
alter table v_demotrig MODIFY cve_stat integer not null;
alter table v_demotrig add constraint fk_stat_demotrig
foreign key (cve_stat) references tstat (cve_stat);
Triggers Valida Inserción e inserta en histórica
CREATE TABLE V_DEMOTRIG_H
(
CVE_DEMOTRG_H integer not null,
CVE_V VARCHAR2(3) NOT NULL,
PROVEEDOR VARCHAR2(50),
STATUS NUMBER,
CIUDAD VARCHAR2(50),
CVE_STAT NUMBER NOT NULL,
modificado_por varchar(100) not null,
modificado_en date,
creado_por varchar(100) not null,
creado_en date,
ACCION VARCHAR(100) not null,
CONSTRAINT "PK_CVE_H" PRIMARY KEY ("CVE_DEMOTRG_H")
);
CREATE SEQUENCE V_DEMOTRIG_H_SEQ INCREMENT BY 1 START WITH 1 MAXVALUE
99999999999999999999 MINVALUE 1 NOCACHE ORDER;
BEGIN
SELECT V_DEMOTRIG_H_SEQ.NEXTVAL INTO :NEW.CVE_DEMOTRG_H FROM DUAL;
END;
/
Triggers Valida Inserción e inserta en histórica
CREATE OR REPLACE TRIGGER TIB_DEMOTRIG
BEFORE INSERT ON V_DEMOTRIG
FOR EACH ROW
DECLARE
ltot number;
luser V_DEMOTRIG_H.MODIFICADO_POR%TYPE;
CURSOR cnombre IS
SELECT count(1) FROM v_demotrig v
WHERE UPPER(v.PROVEEDOR) = UPPER(:NEW.proveedor);
BEGIN
ltot := 0;
OPEN cnombre;
FETCH cnombre INTO ltot;
CLOSE cnombre;
BEGIN
IF :NEW.PROVEEDOR <> :OLD.PROVEEDOR OR
:NEW.STATUS <> :OLD.STATUS OR
:NEW.CIUDAD <> :OLD.CIUDAD OR
:NEW.CVE_STAT <> :OLD.CVE_STAT
THEN
END IF;
END;
/
Triggers
END;
/
Triggers
DELETE event (as a record is being deleted).
Fires Trigger
Table Inserts
Trigger Trigger
‘ A’ ‘B’