SlideShare ist ein Scribd-Unternehmen logo
1 von 10
/*
Sesión12 – Disparadores
Estudiante: José Luis Toro Alcarraz
Curso: Base de Datos Avanzado II
Correo:i201010865@cibertec.edu.pe
*/
Objetivos de la sesión.




Definir qué es un disparador y su uso.
Entender las diferentes modalidades.
Definir y aplicar disparadores que resuelvan problemas y/o requerimientos que se dan en
la vida real.

1) Creación de disparadores
2) Componentes de un disparador
1) Creación de disparadores
a) Definición de un disparador








Un disparador (trigger) son bloques nominados de PL/SQL.
Deben estar almacenados en la base de datos como objetos independientes y no pueden
ser locales a un bloque o paquete.
A diferencia de los procedimientos y funciones que son llamados explícitamente, un
disparador se ejecuta de forma implícita cuando ocurre el suceso que lo activa.
No acepta parámetros.
Ayudan a mantener restricciones de integridad complejas que no pueden hacerse a través
de restricciones declarativas específicas durante la creación de la tabla.
Permiten auditar la información contenida en la tabla, registrando las modificaciones y el
autor de las mismas.
Pueden avisar automáticamente a otros módulos de PL/SQL de que hay que llevar a cabo
una determinada acción, cuando se realiza un cambio en una tabla.

b) Tipos de disparadores






Disparadores DML: Se activan a través de una instrucción DML y el tipo de instrucción
determina el tipo de disparador. Pueden definirse para las sentencias INSERT, UPDATE o
DELETE y pueden dispararse antes o después de la sentencia.
Disparadores de sustitución: Pueden definirse únicamente sobre vistas. A diferencia de
los disparadores DML que se ejecutan además de la sentencia DML, un disparador de
sustitución se ejecuta en lugar de la instrucción DML que lo activa.
Disparadores del sistema: Se activan cuando tiene lugar un suceso del sistema, como la
conexión o desconexión de la base de datos. También puede dispararse con instrucciones
DDL, como la creación de tablas.
c) Creación de un disparador DML





nombre_disparador: Es el nombre del disparador que se quiere crear.
tabla_referencia: Es la tabla para la cual se define el disparador.
cuerpo_disparador: Es un bloque PL/SQL que constituye el código del disparador.
condición: Es la condición que se evalúa antes de dispararse.

SINTAXIS:
CREATE [OR REPLACE] TRIGGER nombre_disparador
{BEFORE|AFTER}
{DELETE|INSERT|UPDATE [OF col1, col2, . ., colN]} ON tabla_referencia
[REFERENCING OLD AS oldname, NEW as newname]old
[FOR EACH ROW [WHEN (condición)]]
Ejemplo:
-- Creamos la tabla log_dept
CREATE TABLE LOG_DEPT
(DEPTNO NUMBER(4),DNAME VARCHAR2(20),LOCAL VARCHAR2(20),USUARIO
VARCHAR2(20),FECHAHORA DATE);
Tabla creada.
-- Creamos el trigger
CREATE OR REPLACE TRIGGER LOG_DEPT_INS
AFTER INSERT ON DEPT
FOR EACH ROW
BEGIN
-- Insertamos los valores nuevos
INSERT INTO LOG_DEPT
VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE);
DBMS_OUTPUT.PUT_LINE('Insertamos el nuevo registro.');
END;
/
Disparador creado.
-- Comprobamos
INSERT INTO DEPT(DEPTNO,DNAME,LOC)
VALUES(50,'RRHH','Surco');
Insertamos el nuevo registro.
1 fila creada.
SELECT * FROM LOG_DEPT;
DEPTNO DNAME LOCAL
---------- ---------- --------50 RRHH
Surco

USUARIO
------------SCOTT

FECHAHOR
-----------------03/04/12
2) Componentes de un disparador


Mientras que un procedimiento no puede tener el mismo nombre que un paquete, una tabla
o una función, un disparador si puede tenerlo ya que el espacio para sus nombres es
diferente al de los otros objetos de la base de datos que usan el mismo espacio.

a) Tipos de disparadores




El suceso de disparo determina el tipo de disparador. Los disparadores pueden definirse
para las sentencias INSERT, UPDATE o DELETE y pueden dispararse antes o después de
la operación.
Además se puede decir que el nivel de los disparadores puede ser por fila o sentencia.

Categoría

Valores

Orden

INSERT, DELETE Y UPDATE

Temporización

BEFORE O AFTER

Nivel

FILA O SENTENCIA

Comentarios
Define que tipo de orden DML provoca la
activación del disparador.
Define si el disparador se activa antes o
después de que se ejecute la orden
(Disparador previo o posterior).
Los disparadores con nivel de fila (FOR
EACH ROW) se activan una vez por cada fila
afectada por la orden que provoco el disparo.
Los
disparadores
con
nivel
de
orden(STATEMENT) se activa solo una vez,
antes o después de la sentencia que activa el
disparo

b) Tabla mutante



Una tabla mutante es una tabla que está modificándose actualmente por una orden DML.
Para un disparador, ésta es la tabla sobre la que está definido.
Las órdenes SQL en el cuerpo de un disparador no pueden leer o modificar ninguna tabla
mutante de la orden que provoca el disparo. Esto incluye a la propia tabla del disparador.

Ejemplo:
-- Trigger que actualiza una orden
CREATE OR REPLACE TRIGGER ACTUALIZA_ORDEN
AFTER INSERT OR DELETE OR UPDATE ON ITEM
FOR EACH ROW
DECLARE
V_TOTAL NUMBER(6);
BEGIN
-- Obtenemos el nuevo total de la orden
SELECT SUM(ITEMTOT) INTO V_TOTAL
FROM ITEM
WHERE ORDID = :NEW.ORDID;
-- Actualizamos el monto total de la orden
UPDATE ORD
SET TOTAL = V_TOTAL
WHERE ORDID = :NEW.ORDID;
END;
/
-- Comprobar
UPDATE ITEM
SET ITEMTOT = CANTIDAD * ACTUALPRICE;
c) Restricciones





Un disparador no puede emitir ninguna orden de control de transacciones: COMMIT,
ROLLBACK o SAVEPOINT.
En base a la restricción anterior, se concluye también que ningún procedimiento o función
que es llamado desde un disparador, puede emitir una orden de control de transacciones.
El cuerpo del disparador no puede contener ninguna declaración de variables LONG o
LONG RAW.
No puede leer ni modificar tablas mutantes.

d) Seudoregistros


Cuando un disparador es disparado, puede accederse a la fila que está siendo
actualmente procesada utilizando, para ello, dos seudoregistros, :old y :new.

Orden de disparo
INSERT
UPDATE
DELETE

:old
No definido: todos los campos
toman el valor NULL.
Valores originales de la fila,
antes de la actualización
Valores originales, antes del
borrado de la fila

:new
Valores que serán insertados
cuando se complete la orden.
Nuevos valores que serán
escritos cuando se complete la
orden.
No definido: todos los campos
toman el valor NULL

Ejemplo1:
-- Limpiamos la tabla log_dept
DELETE FROM LOG_DEPT;
1 fila suprimida.
-- Creamos el trigger
CREATE OR REPLACE TRIGGER LOG_DEPT
AFTER UPDATE ON DEPT
FOR EACH ROW
BEGIN
-- Insertamos los valores anterioriores
INSERT INTO LOG_DEPT
VALUES (:OLD.DEPTNO, :OLD.DNAME, :OLD.LOC, USER, SYSDATE);
-- Insertamos los valores nuevos
INSERT INTO LOG_DEPT
VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE);
END;
/
Disparador creado.
-- Comprobamos
UPDATE DEPT
SET DNAME='CONTABILIDAD', LOC='SAN LUIS'
WHERE DEPTNO =50;
1 fila actualizada.
SELECT * FROM LOG_DEPT;
DEPTNO DNAME
------------- -------------------50 RRHH
50 CONTABILIDAD

LOCAL
USUARIO FECHAHOR
--------------- --------------- ----------------Surco
SCOTT
03/04/12
SAN LUIS SCOTT
03/04/12

Ejemplo2:
CREATE OR REPLACE TRIGGER ACTUALIZA_ORD
AFTER INSERT ON ITEM
FOR EACH ROW
BEGIN
-- Actualizamos orden
UPDATE ORD
SET TOTAL = TOTAL + :NEW.ITEMTOT
WHERE ORDID = :NEW.ORDID;
END;
/
e) Cláusula WHEN




La cláusula WHEN sólo es válida para disparadores con nivel de fila. Si está presente, el
cuerpo del disparador sólo se ejecutará para las filas que cumplan la condición
especificada en la cláusula.
Donde condición es una expresión booleana que será evaluada para cada fila. Se puede
hacer referencia a las variables :new y :old dentro de la condición, pero no se utilizan los
dos puntos ( : )

WHEN condicion
Ejemplo:
-- Limpiamos la tabla log_dept
DELETE FROM LOG_DEPT;
2 filas suprimidas.
-- Creamos el trigger
CREATE OR REPLACE TRIGGER LOG_DEPT
AFTER UPDATE ON DEPT
FOR EACH ROW
WHEN (OLD.DNAME <> NEW.DNAME OR OLD.LOC <> NEW.LOC)
BEGIN
-- Insertamos los valores anteriores
INSERT INTO LOG_DEPT
VALUES (:OLD.DEPTNO, :OLD.DNAME, :OLD.LOC, USER, SYSDATE);
-- Insertamos los valores nuevos
INSERT INTO LOG_DEPT
VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE);
END;
/
Disparador creado.
-- Comprobamos
UPDATE DEPT
SET DNAME='EJECUTIVO', LOC='SAN MIGUEL'
WHERE DEPTNO =50;
1 fila actualizada.
SELECT * FROM LOG_DEPT;
DEPTNO DNAME
---------- -------------------50 CONTABILIDAD
50 EJECUTIVO

LOCAL
USUARIO FECHAHOR
-------------------- -------------- ------------------SAN LUIS
SCOTT
03/04/12
SAN MIGUEL SCOTT
03/04/12

f) Utilización de predicados


Un sólo disparador se puede ejecutar por una inserción, por una actualización o por una
eliminación de una fila de una tabla. El problema radica en diferenciar, dentro del cuerpo
del disparador, cuál fue el tipo acción que ejecutó el disparador. Para esto podemos hacer
uso de los predicados que devuelven true o false según la sentencia que se ejecutó.

Predicado
INSERTING
UPDATING
DELETING
Ejemplo:

Comportamiento
TRUE si la orden de disparo es INSERT; FALSE en caso contrario
TRUE si la orden de disparo es UPDATING; FALSE en caso contrario
TRUE si la orden de disparo es DELETE; FALSE en caso contrario
-- Limpiamos la tabla log_dept
DELETE FROM LOG_DEPT;
2 filas suprimidas.
-- Creamos el trigger
CREATE OR REPLACE TRIGGER LOG_DEPT
AFTER INSERT OR UPDATE OR DELETE ON DEPT
FOR EACH ROW
WHEN (OLD.DNAME <> NEW.DNAME OR OLD.LOC <> NEW.LOC)
BEGIN
-- Insertamos los valores anteriores
IF DELETING OR UPDATING THEN
INSERT INTO LOG_DEPT
VALUES (:OLD.DEPTNO, :OLD.DNAME, :OLD.LOC, USER, SYSDATE);
END IF;
-- Insertamos los valores nuevos
IF INSERTING OR UPDATING THEN
INSERT INTO LOG_DEPT
VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE);
END IF;
END;
/
Disparador creado.
-- Comprobamos
UPDATE DEPT
SET DNAME='EJECUTIVO', LOC='SAN MIGUEL'
WHERE DEPTNO =50;
1 fila actualizada.
SELECT * FROM LOG_DEPT;
DEPTNO DNAME
LOCAL
USUARIO FECHAHOR
------------- --------------------- ------------------ -------------- -------50 PRESIDENCIA LIMA
SCOTT
08/04/12
50

EJECUTIVO

SAN MIGUEL SCOTT

08/04/12

Problema1: Verificamos el nivel de los triggers, para ello ejecutamos los siguientes triggers.
-- Ejecutamos los siguientes triggers
CREATE OR REPLACE TRIGGER TR_BEFORE_STATEMENT
BEFORE UPDATE ON EMP
BEGIN
-- INSERTAMOS LOS VALORES NUEVOS
DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER BEFORE FOR STATEMENT.');
END;
/
CREATE OR REPLACE TRIGGER TR_BEFORE_FOREACHROW
BEFORE UPDATE ON EMP
FOR EACH ROW
BEGIN
-- INSERTAMOS LOS VALORES NUEVOS
DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: '
|| :NEW.EMPNO);
END;
/
CREATE OR REPLACE TRIGGER TR_AFTER_STATEMENT
AFTER UPDATE ON EMP
BEGIN
-- INSERTAMOS LOS VALORES NUEVOS
DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER AFTER FOR STATEMENT.');
END;
/
CREATE OR REPLACE TRIGGER TR_AFTER_FOREACHROW
AFTER UPDATE ON EMP
FOR EACH ROW
BEGIN
-- INSERTAMOS LOS VALORES NUEVOS
DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: ' ||
:NEW.EMPNO);
END;
/
-- Comprobamos
UPDATE EMP
SET COMM = COMM * 100;
EJECUTANDO TRIGGER BEFORE FOR STATEMENT.
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7499
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7499
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7521
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7521
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7654
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7654
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7698
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7698
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7782
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7782
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7839
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7839
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7844
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7844
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7499
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7499
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7521
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7521
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7654
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7654
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7698
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7698
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7782
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7782
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7839
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7839
EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7844
EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7844
EJECUTANDO TRIGGER AFTER FOR STATEMENT.
14 filas actualizadas.
-- Eliminamos los triggers.
DROP TRIGGER TR_BEFORE_STATEMENT;
DROP TRIGGER TR_BEFORE_FOREACHROW;
DROP TRIGGER TR_AFTER_STATEMENT;
DROP TRIGGER TR_AFTER_FOREACHROW;
Problema2: Trigger que verifique que a ningún empleado se le aumente el salario en más de 20%.
-- Trigger que valida saldo
CREATE OR REPLACE TRIGGER TR_VALIDA_SALDO
BEFORE UPDATE OF SAL ON EMP
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE('Ejecutando trigger');
IF :NEW.SAL > :OLD.SAL * 1.2 THEN
-- Falla el primero y fallo todas
RAISE_APPLICATION_ERROR(-20001,'Salario no puede ser mayor a 20%');
END IF;
END;
/
Disparador creado.
-- Comprobamos
UPDATE EMP
SET SAL = SAL + 900;
UPDATE EMP
*
ERROR en lÝnea 1:
ORA-20001: Salario no puede ser mayor a 20%
ORA-06512: en "SCOTT.TR_VALIDA_SALDO", lÝnea 5
ORA-04088: error durante la ejecuci¾n del disparador 'SCOTT.TR_VALIDA_SALDO'
Otra manera:
-- Trigger que valida saldo
CREATE OR REPLACE TRIGGER TR_VALIDA_SALDO
BEFORE UPDATE OF SAL ON EMP
FOR EACH ROW WHEN (NEW.SAL > OLD.SAL * 1.2)
BEGIN
DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER');
-- Falla el primero y fallo todas
RAISE_APPLICATION_ERROR(-20001, ‘Salario no puede ser mayor a 20%');
END;
/
-- Comprobamos
UPDATE EMP
SET SAL = SAL + 900;
UPDATE EMP
*
ERROR en lÝnea 1:
ORA-20001: Salario no puede ser mayor a 20%
ORA-06512: en "SCOTT.TR_VALIDA_SALDO", lÝnea 5
ORA-04088: error durante la ejecuci¾n del disparador 'SCOTT.TR_VALIDA_SALDO'
Nota1: En las validaciones se tiene que forzar el error. (RAISE_APPLICATION_ER.ROR).
Nota2: En el la clausula WHEN los pseudos registros no llevan dos puntos.

Weitere ähnliche Inhalte

Was ist angesagt?

Análisis de Requerimientos
Análisis de RequerimientosAnálisis de Requerimientos
Análisis de Requerimientos
UTPL UTPL
 
Especificación de requisitos de software
Especificación de requisitos de softwareEspecificación de requisitos de software
Especificación de requisitos de software
481200601
 

Was ist angesagt? (20)

Análisis de Requerimientos
Análisis de RequerimientosAnálisis de Requerimientos
Análisis de Requerimientos
 
Mapa conceptual Ingeniería de Requisitos
Mapa conceptual Ingeniería de RequisitosMapa conceptual Ingeniería de Requisitos
Mapa conceptual Ingeniería de Requisitos
 
Act 4.3 pruebas de software
Act 4.3 pruebas de softwareAct 4.3 pruebas de software
Act 4.3 pruebas de software
 
Estilos de programación y sus lenguajes
Estilos de programación y sus lenguajesEstilos de programación y sus lenguajes
Estilos de programación y sus lenguajes
 
Unidad 5
Unidad 5Unidad 5
Unidad 5
 
Estrategias prueba de software
Estrategias prueba de softwareEstrategias prueba de software
Estrategias prueba de software
 
Herramientas case
Herramientas caseHerramientas case
Herramientas case
 
Metodología para el desarrollo del sistemas de información y comunicación seg...
Metodología para el desarrollo del sistemas de información y comunicación seg...Metodología para el desarrollo del sistemas de información y comunicación seg...
Metodología para el desarrollo del sistemas de información y comunicación seg...
 
macros Lenguaje ensamblador
macros Lenguaje ensambladormacros Lenguaje ensamblador
macros Lenguaje ensamblador
 
Capas de la ingenieria de software
Capas de la ingenieria de softwareCapas de la ingenieria de software
Capas de la ingenieria de software
 
IEEE 730 1989: Plan de aseguramiento de la calidad del software
IEEE 730 1989: Plan de aseguramiento de la calidad del softwareIEEE 730 1989: Plan de aseguramiento de la calidad del software
IEEE 730 1989: Plan de aseguramiento de la calidad del software
 
Auditoría de bases de datos
Auditoría de bases de datosAuditoría de bases de datos
Auditoría de bases de datos
 
Tecnicas de estimacion de costos de proyecto software
Tecnicas de estimacion de costos de proyecto softwareTecnicas de estimacion de costos de proyecto software
Tecnicas de estimacion de costos de proyecto software
 
Calidad Del Producto Software
Calidad Del Producto SoftwareCalidad Del Producto Software
Calidad Del Producto Software
 
Sesión 2: Visión General. El proceso del software
Sesión 2: Visión General. El proceso del softwareSesión 2: Visión General. El proceso del software
Sesión 2: Visión General. El proceso del software
 
Ejemplo plan de_pruebas
Ejemplo plan de_pruebasEjemplo plan de_pruebas
Ejemplo plan de_pruebas
 
2. El proceso del software
2. El proceso del software2. El proceso del software
2. El proceso del software
 
Principios del RUP
Principios del RUPPrincipios del RUP
Principios del RUP
 
Arquitectura de bases de datos distribuidas
Arquitectura de bases de datos distribuidasArquitectura de bases de datos distribuidas
Arquitectura de bases de datos distribuidas
 
Especificación de requisitos de software
Especificación de requisitos de softwareEspecificación de requisitos de software
Especificación de requisitos de software
 

Ähnlich wie Sesión12 - Trigger (Oracle)

Bd L8 Eq9 Pre Rosa Triggers
Bd L8 Eq9 Pre Rosa TriggersBd L8 Eq9 Pre Rosa Triggers
Bd L8 Eq9 Pre Rosa Triggers
demoiselle
 
Disparadores - base de datos
Disparadores - base de datosDisparadores - base de datos
Disparadores - base de datos
Adriana Becerra
 
Disparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My SqlDisparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My Sql
yareli
 
Disparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My SqlDisparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My Sql
guest9c891000
 
Semana 12 y 13 subprogramas triggers
Semana 12 y 13 subprogramas triggersSemana 12 y 13 subprogramas triggers
Semana 12 y 13 subprogramas triggers
victdiazm
 

Ähnlich wie Sesión12 - Trigger (Oracle) (20)

TRIGGERS
TRIGGERSTRIGGERS
TRIGGERS
 
Bd L8 Eq9 Pre Rosa Triggers
Bd L8 Eq9 Pre Rosa TriggersBd L8 Eq9 Pre Rosa Triggers
Bd L8 Eq9 Pre Rosa Triggers
 
Postgres trigger
Postgres triggerPostgres trigger
Postgres trigger
 
Tutorial disparadores
Tutorial disparadoresTutorial disparadores
Tutorial disparadores
 
Disparadores
DisparadoresDisparadores
Disparadores
 
Disparadores - base de datos
Disparadores - base de datosDisparadores - base de datos
Disparadores - base de datos
 
Dbd triggers
Dbd triggersDbd triggers
Dbd triggers
 
Disparadores 1213820550525607-9
Disparadores 1213820550525607-9Disparadores 1213820550525607-9
Disparadores 1213820550525607-9
 
database trig
database trigdatabase trig
database trig
 
Trigger-activadores en sql server
Trigger-activadores en sql serverTrigger-activadores en sql server
Trigger-activadores en sql server
 
Triggers
TriggersTriggers
Triggers
 
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
Sesion06c - Sentencias SQL en PL-SQL (Oracle)Sesion06c - Sentencias SQL en PL-SQL (Oracle)
Sesion06c - Sentencias SQL en PL-SQL (Oracle)
 
Disparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My SqlDisparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My Sql
 
Disparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My SqlDisparadores Trigger En Sql Y My Sql
Disparadores Trigger En Sql Y My Sql
 
TRIGGERS O DISPARADORES
TRIGGERS O DISPARADORESTRIGGERS O DISPARADORES
TRIGGERS O DISPARADORES
 
Semana 12 y 13 subprogramas triggers
Semana 12 y 13 subprogramas triggersSemana 12 y 13 subprogramas triggers
Semana 12 y 13 subprogramas triggers
 
Textos sqli_mssql
 Textos sqli_mssql Textos sqli_mssql
Textos sqli_mssql
 
Disparadores.pptx
Disparadores.pptxDisparadores.pptx
Disparadores.pptx
 
Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)Sesion05 - Manipulacion de datos (Oracle)
Sesion05 - Manipulacion de datos (Oracle)
 
Formacion critica
Formacion criticaFormacion critica
Formacion critica
 

Mehr von José Toro

Mehr von José Toro (13)

Sesión14 – Archivos redologs (Oracle)
Sesión14 – Archivos redologs (Oracle)Sesión14 – Archivos redologs (Oracle)
Sesión14 – Archivos redologs (Oracle)
 
Sesión13 - Archivos de Control (Oracle)
Sesión13 - Archivos de Control (Oracle)Sesión13 - Archivos de Control (Oracle)
Sesión13 - Archivos de Control (Oracle)
 
Sesión11 - Paquetes (Oracle)
Sesión11 - Paquetes (Oracle)Sesión11 - Paquetes (Oracle)
Sesión11 - Paquetes (Oracle)
 
Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)Sesion10 - Funciones y procedimientos (Oracle)
Sesion10 - Funciones y procedimientos (Oracle)
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)
 
Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)
 
Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)
 
Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)Sesion06b - Introducción al PL-SQL (Oracle)
Sesion06b - Introducción al PL-SQL (Oracle)
 
Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)Sesion06a - Manipulacion de datos (Oracle)
Sesion06a - Manipulacion de datos (Oracle)
 
Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)Sesión04 - Diccionario de datos (Oracle)
Sesión04 - Diccionario de datos (Oracle)
 
Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)Sesión03 - Creación de objetos (Oracle)
Sesión03 - Creación de objetos (Oracle)
 
Sesión02 - Creación de objetos (Oracle)
Sesión02 - Creación de objetos (Oracle)Sesión02 - Creación de objetos (Oracle)
Sesión02 - Creación de objetos (Oracle)
 
Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)Sesión01 - Gestión de instancia (Oracle)
Sesión01 - Gestión de instancia (Oracle)
 

Kürzlich hochgeladen

2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
RigoTito
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Fernando Solis
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
EliaHernndez7
 
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptxRESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
pvtablets2023
 
Proyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfProyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdf
patriciaines1993
 

Kürzlich hochgeladen (20)

2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
2 REGLAMENTO RM 0912-2024 DE MODALIDADES DE GRADUACIÓN_.pptx
 
Concepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptxConcepto y definición de tipos de Datos Abstractos en c++.pptx
Concepto y definición de tipos de Datos Abstractos en c++.pptx
 
Los avatares para el juego dramático en entornos virtuales
Los avatares para el juego dramático en entornos virtualesLos avatares para el juego dramático en entornos virtuales
Los avatares para el juego dramático en entornos virtuales
 
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
 
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICABIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
 
semana 4 9NO Estudios sociales.pptxnnnn
semana 4  9NO Estudios sociales.pptxnnnnsemana 4  9NO Estudios sociales.pptxnnnn
semana 4 9NO Estudios sociales.pptxnnnn
 
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
🦄💫4° SEM32 WORD PLANEACIÓN PROYECTOS DARUKEL 23-24.docx
 
Supuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docxSupuestos_prácticos_funciones.docx
Supuestos_prácticos_funciones.docx
 
Infografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdfInfografía EE con pie del 2023 (3)-1.pdf
Infografía EE con pie del 2023 (3)-1.pdf
 
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docxPLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
PLAN DE REFUERZO ESCOLAR MERC 2024-2.docx
 
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADOTIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
TIENDAS MASS MINIMARKET ESTUDIO DE MERCADO
 
Biografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdfBiografía de Charles Coulomb física .pdf
Biografía de Charles Coulomb física .pdf
 
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptxRESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
RESULTADOS DE LA EVALUACIÓN DIAGNÓSTICA 2024 - ACTUALIZADA.pptx
 
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VSOCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
OCTAVO SEGUNDO PERIODO. EMPRENDIEMIENTO VS
 
Revista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdfRevista Apuntes de Historia. Mayo 2024.pdf
Revista Apuntes de Historia. Mayo 2024.pdf
 
FUERZA Y MOVIMIENTO ciencias cuarto basico.ppt
FUERZA Y MOVIMIENTO ciencias cuarto basico.pptFUERZA Y MOVIMIENTO ciencias cuarto basico.ppt
FUERZA Y MOVIMIENTO ciencias cuarto basico.ppt
 
origen y desarrollo del ensayo literario
origen y desarrollo del ensayo literarioorigen y desarrollo del ensayo literario
origen y desarrollo del ensayo literario
 
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLAACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
ACERTIJO DE POSICIÓN DE CORREDORES EN LA OLIMPIADA. Por JAVIER SOLIS NOYOLA
 
SEPTIMO SEGUNDO PERIODO EMPRENDIMIENTO VS
SEPTIMO SEGUNDO PERIODO EMPRENDIMIENTO VSSEPTIMO SEGUNDO PERIODO EMPRENDIMIENTO VS
SEPTIMO SEGUNDO PERIODO EMPRENDIMIENTO VS
 
Proyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdfProyecto de aprendizaje dia de la madre MINT.pdf
Proyecto de aprendizaje dia de la madre MINT.pdf
 

Sesión12 - Trigger (Oracle)

  • 1. /* Sesión12 – Disparadores Estudiante: José Luis Toro Alcarraz Curso: Base de Datos Avanzado II Correo:i201010865@cibertec.edu.pe */ Objetivos de la sesión.    Definir qué es un disparador y su uso. Entender las diferentes modalidades. Definir y aplicar disparadores que resuelvan problemas y/o requerimientos que se dan en la vida real. 1) Creación de disparadores 2) Componentes de un disparador 1) Creación de disparadores a) Definición de un disparador        Un disparador (trigger) son bloques nominados de PL/SQL. Deben estar almacenados en la base de datos como objetos independientes y no pueden ser locales a un bloque o paquete. A diferencia de los procedimientos y funciones que son llamados explícitamente, un disparador se ejecuta de forma implícita cuando ocurre el suceso que lo activa. No acepta parámetros. Ayudan a mantener restricciones de integridad complejas que no pueden hacerse a través de restricciones declarativas específicas durante la creación de la tabla. Permiten auditar la información contenida en la tabla, registrando las modificaciones y el autor de las mismas. Pueden avisar automáticamente a otros módulos de PL/SQL de que hay que llevar a cabo una determinada acción, cuando se realiza un cambio en una tabla. b) Tipos de disparadores    Disparadores DML: Se activan a través de una instrucción DML y el tipo de instrucción determina el tipo de disparador. Pueden definirse para las sentencias INSERT, UPDATE o DELETE y pueden dispararse antes o después de la sentencia. Disparadores de sustitución: Pueden definirse únicamente sobre vistas. A diferencia de los disparadores DML que se ejecutan además de la sentencia DML, un disparador de sustitución se ejecuta en lugar de la instrucción DML que lo activa. Disparadores del sistema: Se activan cuando tiene lugar un suceso del sistema, como la conexión o desconexión de la base de datos. También puede dispararse con instrucciones DDL, como la creación de tablas.
  • 2. c) Creación de un disparador DML     nombre_disparador: Es el nombre del disparador que se quiere crear. tabla_referencia: Es la tabla para la cual se define el disparador. cuerpo_disparador: Es un bloque PL/SQL que constituye el código del disparador. condición: Es la condición que se evalúa antes de dispararse. SINTAXIS: CREATE [OR REPLACE] TRIGGER nombre_disparador {BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF col1, col2, . ., colN]} ON tabla_referencia [REFERENCING OLD AS oldname, NEW as newname]old [FOR EACH ROW [WHEN (condición)]] Ejemplo: -- Creamos la tabla log_dept CREATE TABLE LOG_DEPT (DEPTNO NUMBER(4),DNAME VARCHAR2(20),LOCAL VARCHAR2(20),USUARIO VARCHAR2(20),FECHAHORA DATE); Tabla creada. -- Creamos el trigger CREATE OR REPLACE TRIGGER LOG_DEPT_INS AFTER INSERT ON DEPT FOR EACH ROW BEGIN -- Insertamos los valores nuevos INSERT INTO LOG_DEPT VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE); DBMS_OUTPUT.PUT_LINE('Insertamos el nuevo registro.'); END; / Disparador creado. -- Comprobamos INSERT INTO DEPT(DEPTNO,DNAME,LOC) VALUES(50,'RRHH','Surco'); Insertamos el nuevo registro. 1 fila creada. SELECT * FROM LOG_DEPT; DEPTNO DNAME LOCAL ---------- ---------- --------50 RRHH Surco USUARIO ------------SCOTT FECHAHOR -----------------03/04/12
  • 3. 2) Componentes de un disparador  Mientras que un procedimiento no puede tener el mismo nombre que un paquete, una tabla o una función, un disparador si puede tenerlo ya que el espacio para sus nombres es diferente al de los otros objetos de la base de datos que usan el mismo espacio. a) Tipos de disparadores   El suceso de disparo determina el tipo de disparador. Los disparadores pueden definirse para las sentencias INSERT, UPDATE o DELETE y pueden dispararse antes o después de la operación. Además se puede decir que el nivel de los disparadores puede ser por fila o sentencia. Categoría Valores Orden INSERT, DELETE Y UPDATE Temporización BEFORE O AFTER Nivel FILA O SENTENCIA Comentarios Define que tipo de orden DML provoca la activación del disparador. Define si el disparador se activa antes o después de que se ejecute la orden (Disparador previo o posterior). Los disparadores con nivel de fila (FOR EACH ROW) se activan una vez por cada fila afectada por la orden que provoco el disparo. Los disparadores con nivel de orden(STATEMENT) se activa solo una vez, antes o después de la sentencia que activa el disparo b) Tabla mutante   Una tabla mutante es una tabla que está modificándose actualmente por una orden DML. Para un disparador, ésta es la tabla sobre la que está definido. Las órdenes SQL en el cuerpo de un disparador no pueden leer o modificar ninguna tabla mutante de la orden que provoca el disparo. Esto incluye a la propia tabla del disparador. Ejemplo: -- Trigger que actualiza una orden CREATE OR REPLACE TRIGGER ACTUALIZA_ORDEN AFTER INSERT OR DELETE OR UPDATE ON ITEM FOR EACH ROW DECLARE V_TOTAL NUMBER(6); BEGIN -- Obtenemos el nuevo total de la orden SELECT SUM(ITEMTOT) INTO V_TOTAL FROM ITEM
  • 4. WHERE ORDID = :NEW.ORDID; -- Actualizamos el monto total de la orden UPDATE ORD SET TOTAL = V_TOTAL WHERE ORDID = :NEW.ORDID; END; / -- Comprobar UPDATE ITEM SET ITEMTOT = CANTIDAD * ACTUALPRICE; c) Restricciones     Un disparador no puede emitir ninguna orden de control de transacciones: COMMIT, ROLLBACK o SAVEPOINT. En base a la restricción anterior, se concluye también que ningún procedimiento o función que es llamado desde un disparador, puede emitir una orden de control de transacciones. El cuerpo del disparador no puede contener ninguna declaración de variables LONG o LONG RAW. No puede leer ni modificar tablas mutantes. d) Seudoregistros  Cuando un disparador es disparado, puede accederse a la fila que está siendo actualmente procesada utilizando, para ello, dos seudoregistros, :old y :new. Orden de disparo INSERT UPDATE DELETE :old No definido: todos los campos toman el valor NULL. Valores originales de la fila, antes de la actualización Valores originales, antes del borrado de la fila :new Valores que serán insertados cuando se complete la orden. Nuevos valores que serán escritos cuando se complete la orden. No definido: todos los campos toman el valor NULL Ejemplo1: -- Limpiamos la tabla log_dept DELETE FROM LOG_DEPT; 1 fila suprimida. -- Creamos el trigger CREATE OR REPLACE TRIGGER LOG_DEPT AFTER UPDATE ON DEPT FOR EACH ROW BEGIN -- Insertamos los valores anterioriores INSERT INTO LOG_DEPT VALUES (:OLD.DEPTNO, :OLD.DNAME, :OLD.LOC, USER, SYSDATE);
  • 5. -- Insertamos los valores nuevos INSERT INTO LOG_DEPT VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE); END; / Disparador creado. -- Comprobamos UPDATE DEPT SET DNAME='CONTABILIDAD', LOC='SAN LUIS' WHERE DEPTNO =50; 1 fila actualizada. SELECT * FROM LOG_DEPT; DEPTNO DNAME ------------- -------------------50 RRHH 50 CONTABILIDAD LOCAL USUARIO FECHAHOR --------------- --------------- ----------------Surco SCOTT 03/04/12 SAN LUIS SCOTT 03/04/12 Ejemplo2: CREATE OR REPLACE TRIGGER ACTUALIZA_ORD AFTER INSERT ON ITEM FOR EACH ROW BEGIN -- Actualizamos orden UPDATE ORD SET TOTAL = TOTAL + :NEW.ITEMTOT WHERE ORDID = :NEW.ORDID; END; / e) Cláusula WHEN   La cláusula WHEN sólo es válida para disparadores con nivel de fila. Si está presente, el cuerpo del disparador sólo se ejecutará para las filas que cumplan la condición especificada en la cláusula. Donde condición es una expresión booleana que será evaluada para cada fila. Se puede hacer referencia a las variables :new y :old dentro de la condición, pero no se utilizan los dos puntos ( : ) WHEN condicion Ejemplo: -- Limpiamos la tabla log_dept
  • 6. DELETE FROM LOG_DEPT; 2 filas suprimidas. -- Creamos el trigger CREATE OR REPLACE TRIGGER LOG_DEPT AFTER UPDATE ON DEPT FOR EACH ROW WHEN (OLD.DNAME <> NEW.DNAME OR OLD.LOC <> NEW.LOC) BEGIN -- Insertamos los valores anteriores INSERT INTO LOG_DEPT VALUES (:OLD.DEPTNO, :OLD.DNAME, :OLD.LOC, USER, SYSDATE); -- Insertamos los valores nuevos INSERT INTO LOG_DEPT VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE); END; / Disparador creado. -- Comprobamos UPDATE DEPT SET DNAME='EJECUTIVO', LOC='SAN MIGUEL' WHERE DEPTNO =50; 1 fila actualizada. SELECT * FROM LOG_DEPT; DEPTNO DNAME ---------- -------------------50 CONTABILIDAD 50 EJECUTIVO LOCAL USUARIO FECHAHOR -------------------- -------------- ------------------SAN LUIS SCOTT 03/04/12 SAN MIGUEL SCOTT 03/04/12 f) Utilización de predicados  Un sólo disparador se puede ejecutar por una inserción, por una actualización o por una eliminación de una fila de una tabla. El problema radica en diferenciar, dentro del cuerpo del disparador, cuál fue el tipo acción que ejecutó el disparador. Para esto podemos hacer uso de los predicados que devuelven true o false según la sentencia que se ejecutó. Predicado INSERTING UPDATING DELETING Ejemplo: Comportamiento TRUE si la orden de disparo es INSERT; FALSE en caso contrario TRUE si la orden de disparo es UPDATING; FALSE en caso contrario TRUE si la orden de disparo es DELETE; FALSE en caso contrario
  • 7. -- Limpiamos la tabla log_dept DELETE FROM LOG_DEPT; 2 filas suprimidas. -- Creamos el trigger CREATE OR REPLACE TRIGGER LOG_DEPT AFTER INSERT OR UPDATE OR DELETE ON DEPT FOR EACH ROW WHEN (OLD.DNAME <> NEW.DNAME OR OLD.LOC <> NEW.LOC) BEGIN -- Insertamos los valores anteriores IF DELETING OR UPDATING THEN INSERT INTO LOG_DEPT VALUES (:OLD.DEPTNO, :OLD.DNAME, :OLD.LOC, USER, SYSDATE); END IF; -- Insertamos los valores nuevos IF INSERTING OR UPDATING THEN INSERT INTO LOG_DEPT VALUES (:NEW.DEPTNO, :NEW.DNAME, :NEW.LOC, USER, SYSDATE); END IF; END; / Disparador creado. -- Comprobamos UPDATE DEPT SET DNAME='EJECUTIVO', LOC='SAN MIGUEL' WHERE DEPTNO =50; 1 fila actualizada. SELECT * FROM LOG_DEPT; DEPTNO DNAME LOCAL USUARIO FECHAHOR ------------- --------------------- ------------------ -------------- -------50 PRESIDENCIA LIMA SCOTT 08/04/12 50 EJECUTIVO SAN MIGUEL SCOTT 08/04/12 Problema1: Verificamos el nivel de los triggers, para ello ejecutamos los siguientes triggers. -- Ejecutamos los siguientes triggers CREATE OR REPLACE TRIGGER TR_BEFORE_STATEMENT BEFORE UPDATE ON EMP BEGIN -- INSERTAMOS LOS VALORES NUEVOS DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER BEFORE FOR STATEMENT.');
  • 8. END; / CREATE OR REPLACE TRIGGER TR_BEFORE_FOREACHROW BEFORE UPDATE ON EMP FOR EACH ROW BEGIN -- INSERTAMOS LOS VALORES NUEVOS DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: ' || :NEW.EMPNO); END; / CREATE OR REPLACE TRIGGER TR_AFTER_STATEMENT AFTER UPDATE ON EMP BEGIN -- INSERTAMOS LOS VALORES NUEVOS DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER AFTER FOR STATEMENT.'); END; / CREATE OR REPLACE TRIGGER TR_AFTER_FOREACHROW AFTER UPDATE ON EMP FOR EACH ROW BEGIN -- INSERTAMOS LOS VALORES NUEVOS DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: ' || :NEW.EMPNO); END; / -- Comprobamos UPDATE EMP SET COMM = COMM * 100; EJECUTANDO TRIGGER BEFORE FOR STATEMENT. EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7499 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7499 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7521 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7521 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7654 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7654 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7698 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7698 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7782 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7782 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7839 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7839 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7844 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7844
  • 9. EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7499 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7499 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7521 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7521 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7654 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7654 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7698 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7698 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7782 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7782 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7839 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7839 EJECUTANDO TRIGGER BEFORE FOR EACH ROW. EMPNO: 7844 EJECUTANDO TRIGGER AFTER FOR EACH ROW. EMPNO: 7844 EJECUTANDO TRIGGER AFTER FOR STATEMENT. 14 filas actualizadas. -- Eliminamos los triggers. DROP TRIGGER TR_BEFORE_STATEMENT; DROP TRIGGER TR_BEFORE_FOREACHROW; DROP TRIGGER TR_AFTER_STATEMENT; DROP TRIGGER TR_AFTER_FOREACHROW; Problema2: Trigger que verifique que a ningún empleado se le aumente el salario en más de 20%. -- Trigger que valida saldo CREATE OR REPLACE TRIGGER TR_VALIDA_SALDO BEFORE UPDATE OF SAL ON EMP FOR EACH ROW BEGIN DBMS_OUTPUT.PUT_LINE('Ejecutando trigger'); IF :NEW.SAL > :OLD.SAL * 1.2 THEN -- Falla el primero y fallo todas RAISE_APPLICATION_ERROR(-20001,'Salario no puede ser mayor a 20%'); END IF; END; / Disparador creado. -- Comprobamos UPDATE EMP SET SAL = SAL + 900; UPDATE EMP * ERROR en lÝnea 1: ORA-20001: Salario no puede ser mayor a 20% ORA-06512: en "SCOTT.TR_VALIDA_SALDO", lÝnea 5
  • 10. ORA-04088: error durante la ejecuci¾n del disparador 'SCOTT.TR_VALIDA_SALDO' Otra manera: -- Trigger que valida saldo CREATE OR REPLACE TRIGGER TR_VALIDA_SALDO BEFORE UPDATE OF SAL ON EMP FOR EACH ROW WHEN (NEW.SAL > OLD.SAL * 1.2) BEGIN DBMS_OUTPUT.PUT_LINE('EJECUTANDO TRIGGER'); -- Falla el primero y fallo todas RAISE_APPLICATION_ERROR(-20001, ‘Salario no puede ser mayor a 20%'); END; / -- Comprobamos UPDATE EMP SET SAL = SAL + 900; UPDATE EMP * ERROR en lÝnea 1: ORA-20001: Salario no puede ser mayor a 20% ORA-06512: en "SCOTT.TR_VALIDA_SALDO", lÝnea 5 ORA-04088: error durante la ejecuci¾n del disparador 'SCOTT.TR_VALIDA_SALDO' Nota1: En las validaciones se tiene que forzar el error. (RAISE_APPLICATION_ER.ROR). Nota2: En el la clausula WHEN los pseudos registros no llevan dos puntos.