SlideShare una empresa de Scribd logo
1 de 58
Descargar para leer sin conexión
FACULTAD DE INGENIERIA
ESCUELA ACADÉMICA PROFESIONAL DE INGENIERÍA DE SISTEMAS
GESTIÓN DE DATOS E INFORMACIÓN II
SEMANA 2: Cursores, paquetes y
triggers en Bases de Datos.
Ing. Mg.Sc. Hugo Villaverde M.
CREACIÓN DE PAQUETES
Visión General sobre los Paquetes
– Agrupan de forma lógica subprogramas.
– Compuestos de dos partes:
• Especificación
• Cuerpo
– No pueden ser llamados, parametrizados o
anidados
– Permiten al SGBD leer múltiples objetos en
memoria, de una sola vez.
Ventajas de los Paquetes
– Modularidad
– Diseño más sencillo de la aplicación
– Información oculta
– Funcionalidad añadida
– Mejor rendimiento
– Sobrecarga
Desarrollo de un Paquete
Declaración del
Procedimiento A
Definición del
Procedimiento B
Especificación
del Paquete
Cuerpo
del Paquete
1
2
3
4
2
Definición del
Procedimiento A
5
CREATE [OR REPLACE] PACKAGE package_name
IS | AS
public type and item declarations
subprogram specifications
END package_name;
Creación de la Especificación de un
PaqueteSintaxis:
Paquete COMM_PACKAGE
G_COMM
Declaración
del Procedimiento
RESET_COMM
Especificación
del Paquete
1
2
Declaración de Partes Públicas
Creación de la Especificación de un
Paquete: Ejemplo
SQL>CREATE OR REPLACE PACKAGE comm_package IS
2 g_comm NUMBER := 10; --initialized to 10
3 PROCEDURE reset_comm
4 (v_comm
IN NUMBER);
5 END comm_package;
6 /
Declaración de una Variable Global o
un Procedimiento Público
SQL>EXECUTE comm_package.g_comm := 5
SQL>EXECUTE comm_package.reset_comm(8)
Creación del Cuerpo de un Paquete
Sintaxis:
CREATE [OR REPLACE] PACKAGE BODY package_name
IS | AS
private type and item declarations
subprogram bodies
END package_name;
G_COMM
Declaración del Procedimiento
RESET_COMM
Definición de la Función
VALIDATE_COMM
Especificación
del Paquete
Cuerpo
del Paquete
1
2
3
2
Definición del Procedimiento
RESET_COMM
Paquete COMM_PACKAGE
Partes Públicas y Privadas
Creación del Cuerpo de un Paquete :
Ejemplo
SQL>CREATE OR REPLACE PACKAGE BODY comm_package IS
2 FUNCTION validate_comm
3 (v_comm IN NUMBER) RETURN BOOLEAN
4 IS
5 v_max_comm NUMBER;
6 BEGIN
7 SELECT MAX(comm)
8 INTO v_max_comm
9 FROM emp;
10 IF v_comm > v_max_comm THEN RETURN(FALSE);
11 ELSE RETURN(TRUE);
12 END IF;
13 END validate_comm;
14 END comm_package;
15 /
SQL>PROCEDURE reset_comm
2 (v_comm IN NUMBER)
3 IS
4 v_valid BOOLEAN;
5 BEGIN
6 v_valid := validate_comm(v_comm);
7 IF v_valid = TRUE THEN
8 g_comm := v_comm;
9 ELSE
10 RAISE_APPLICATION_ERROR
11 (-20210,'Invalid commission');
12 END IF;
13 END reset_comm;
14 END comm_package;
15 /
Creación del Cuerpo de un Paquete :
Ejemplo
Guía para el Desarrollo de Paquetes
– Cree paquetes flexibles.
– Defina la especificación del paquete antes que
el cuerpo.
– La especificación del paquete sólo debería de
contener construcciones públicas
– La especificación del paquete debería
contener el mínimo nº de construcciones.
Llamada a Programas de un Paquete
• Ejemplo 1: Llamada a una función desde un
procedimiento del mismo paquete:
CREATE OR REPLACE PACKAGE BODY comm_package IS
. . .
PROCEDURE reset_comm(v_comm IN NUMBER)
IS
v_valid BOOLEAN;
BEGIN
v_valid := validate_comm(v_comm);
IF v_valid = TRUE THEN
g_comm := v_comm;
ELSE
RAISE_APPLICATION_ERROR (-20210, 'Invalid comm');
END IF;
END reset_comm;
END comm_package;
• Ejemplo 2: Llamada a un procedimiento de
un paquete desde SQL*Plus:
• Ejemplo 3: Llamada a un procedimiento de
un paquete en un esquema diferente:
• Ejemplo 4: Llamada a un procedimiento de
un paquete en una B.D. remota:
Llamada a Programas de un Paquete
SQL>EXECUTE comm_package.reset_comm(1500);
SQL> EXECUTE scott.comm_package.reset_comm(1500);
SQL> EXECUTE comm_package.reset_comm@ny (1500);
Referencia a una Variable Global
dentro del PaqueteEjemplo 1:
CREATE OR REPLACE PACKAGE BODY comm_package IS
. . .
PROCEDURE reset_comm(v_comm IN NUMBER)
IS
v_valid BOOLEAN;
BEGIN
v_valid := validate_comm(v_comm);
IF v_valid = TRUE THEN
g_comm := v_comm;
ELSE
RAISE_APPLICATION_ERROR (-20210,'Invalid comm');
END IF;
END reset_comm;
END comm_package;
Referencia a una Variable Global desde
un Proc. Standalone
• Ejemplo 2:
CREATE OR REPLACE PROCEDURE hire_emp
(v_ename IN emp.ename%TYPE,
v_mgr IN emp.mgr%TYPE,
v_job IN emp.job%TYPE,
v_sal IN emp.sal%TYPE)
IS
v_comm emp.comm%TYPE;
. . .
BEGIN
. . .
v_comm := comm_package.g_comm;
. . .
END hire_emp;
SCOTT-09:00> EXECUTE comm_package.reset_comm(120);
Initially g_comm equals 10
After executing the procedure, g_comm equals 120
JONES-09:30> INSERT INTO emp (ename,..,comm)
VALUES ('Madona',..,2000);
JONES-09:35> EXECUTE comm_package.reset_comm(170);
Initially g_comm equals 10
After executing the procedure, g_comm equals 170
SCOTT-10:00> EXECUTE comm_package.reset_comm(4000);
Results in: 'Invalid commission'
JONES-11:00> ROLLBACK;
JONES-11:01> EXIT;
JONES-12:00> EXECUTE comm_package.reset_comm(150);
Initially g_comm equals 10
After executing the procedure, g_comm equals 150
Estado Persistente de las Variables de un
Paquete
Estado Persistente de un Cursor en un
Paquete
SQL> CREATE OR REPLACE PACKAGE pack_cur
2 IS
3 CURSOR c1 IS SELECT empno FROM emp
4 ORDER BY empno desc;
5 PROCEDURE proc1_3rows;
6 PROCEDURE proc4_6rows;
7 END pack_cur;
8 /
• Ejemplo:
SQL> CREATE OR REPLACE PACKAGE BODY pack_cur
2 IS
3 v_empno NUMBER;
4 PROCEDURE proc1_3rows IS
5 BEGIN OPEN c1;
6 LOOP FETCH c1 INTO v_empno;
7 DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno));
8 EXIT WHEN c1%ROWCOUNT >= 3;
9 END LOOP;
10 END proc1_3rows;
11 PROCEDURE proc4_6rows IS
12 BEGIN
13 LOOP FETCH c1 INTO v_empno;
14 DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno));
15 EXIT WHEN c1%ROWCOUNT >= 6;
16 END LOOP;
17 CLOSE c1;
18 END proc4_6rows;
19 END pack_cur;
20 /
Estado Persistente de un Cursor en un
Paquete
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE pack1.proc1_3rows;
Id : 7934
Id : 7902
Id : 7900
SQL> EXECUTE pack1.proc4_6rows;
Id : 7876
Id : 7844
Id : 7839
Estado Persistente de un Cursor en un
Paquete
CREATE OR REPLACE PACKAGE emp_package IS
TYPE emp_table_type IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
PROCEDURE read_emp_table(emp_table OUT
emp_table_type);
END emp_package;
CREATE OR REPLACE PACKAGE BODY emp_package IS
PROCEDURE read_emp_table(emp_table OUT
emp_table_type)
IS
i BINARY_INTEGER:=0;
BEGIN
FOR emp_record IN (SELECT * FROM emp) LOOP
emp_table(i):=emp_record;
I:=I+1;
END LOOP;
END;
END emp_package;
Estado Persistente de Tablas de
Registros PL/SQL en un Paquete
DROP PACKAGE package_name
Eliminación de Paquetes
Para borrar la especificación del paquete y el cuerpo:
Para borrar el cuerpo del paquete:
DROP PACKAGE BODY package_name
Resumen
– Mejoran la organización, gestión, seguridad y
rendimiento.
– Agrupan procedimientos y funciones.
– Se puede cambiar el cuerpo de un paquete sin
que afecte a la especificación.
– Conceden acceso de seguridad al paquete
completo.
Resumen
– Ocultan el código fuente a los usuarios.
– Cargan todo el paquete en memoria en la
primera llamada.
– Reducen el acceso a disco para llamadas
posteriores.
– Ofrecen identificadores para las sesiones de
usuario.
Comando
CREATE [OR REPLACE] PACKAGE
CREATE [OR REPLACE] PACKAGE
BODY
DROP PACKAGE
DROP PACKAGE BODY
Tarea
Crea o modifica la especificación de un
paquete ya existente
Crea o modifica el cuerpo de un paquete ya
existente
Borra tanto la especificación como el cuerpo
de un paquete
Borra el cuerpo de un paquete
Resumen
Creación de Triggers en la Base de
Datos
Visión General de los Triggers
– Un trigger es un bloque PL/SQL que se
ejecuta implícitamente cuando ocurre un
evento.
– Un trigger puede ser “de la base de datos” o
“de la aplicación”.
Guía para el Diseño de Triggers
– Realizar acciones relacionadas.
– Utilizar triggers para operaciones globales.
– No “reinventar la rueda”
– Prestar atención a los excesos (overkill)
Creación de Disparadores
– Momento: BEFORE o AFTER
– Evento: INSERT o UPDATE o DELETE
– Nombre Tabla: On table
– Tipo de Trigger: Row o statement
– Claúsula When: Condición
– Cuerpo del Trigger: DECLARE
• BEGIN
• END;
Componentes de un Trigger
• Momento: ¿Cuándo debería dispararse?
– BEFORE: El código del cuerpo del trigger se
ejecutará antes del evento DML
– AFTER: El código del cuerpo del trigger se
ejecutará antes del evento DML
Componentes de un Trigger
• Evento:
• ¿Qué operación DML provocará la
ejecución trigger?
– INSERT
– UPDATE
– DELETE
– Cualquier combinación de las anteriores
Componentes de un Trigger
• Tipo de Trigger:
• ¿Cuántas veces debería ejecutarse el
cuerpo del trigger cuando ocurre el
evento?
– Statement: El cuerpo del trigger se ejecuta
sólo una vez para el evento. Este es el
comportamiento por defecto.
– Row: El cuerpo del trigger se ejecuta una vez
para cada registro afectado por el evento.
Componentes de un Trigger
• Cuerpo del Trigger:
• ¿Qué acción debería de realizar el trigger?
– El cuerpo del trigger es definido con un bloque
PL/SQL anónimo
• [DECLARE]
• BEGIN
• [EXCEPTION]
• END;
Sintaxis para la Creación y Definición
de Triggers
CREATE [OR REPLACE] TRIGGER trigger_name
timing event1 [OR event2 OR event3]
ON table_name
PL/SQL block;
Trigger “Before Statement”: Ejemplo
SQL> CREATE OR REPLACE TRIGGER secure_emp
2 BEFORE INSERT ON emp
3 BEGIN
4 IF (TO_CHAR (sysdate,'DY') IN ('SAT','SUN'))
5 OR (TO_CHAR(sysdate,'HH24')NOT BETWEEN
6 '08' AND '18'
7 THEN RAISE_APPLICATION_ERROR (-20500,
8 'You may only insert into EMP during normal
9 hours.');
10 END IF;
11 END;
12 /
Ejemplo
SQL> INSERT INTO emp (empno, ename, deptno)
2 VALUES (7777, 'BAUWENS', 40);
INSERT INTO emp (empno, ename, deptno)
*
ERROR at line 1:
ORA-20500: You may only insert into EMP during
normal hours.
ORA-06512: at "SCOTT.SECURE_EMP", line 4
ORA-04088: error during execution of trigger
'SCOTT.SECURE_EMP'
Trigger “After Statement”: EjemploSQL>CREATE OR REPLACE TRIGGER check_salary_count
2 AFTER UPDATE OF sal ON emp
3 DECLARE
4 v_salary_changes NUMBER;
5 v_max_changes NUMBER;
6 BEGIN
7 SELECT upd, max_upd
8 INTO v_salary_changes, v_max_changes
9 FROM audit_table
10 WHERE user_name = user
11 AND table_name = 'EMP'
12 AND column_name = 'SAL';
13 IF v_salary_changes > v_max_changes THEN
14 RAISE_APPLICATION_ERROR (-20501,
15 'You may only make a maximum of '||
16 TO_CHAR (v_max_changes) ||
17 ' changes to the SAL column');
18 END IF;
19 END;
20 /
Creación de un Trigger a Nivel de
Registro
CREATE [OR REPLACE] TRIGGER trigger_name
timing event1 [OR event2 OR event3]
ON table_name
[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
[WHEN condition]
PL/SQL block;
SQL>CREATE OR REPLACE TRIGGER audit_emp
2 AFTER DELETE OR INSERT OR UPDATE ON emp
3 FOR EACH ROW
4 BEGIN
5 IF DELETING THEN
6 UPDATE audit_table SET del = del + 1
7 WHERE user_name = user AND table_name = 'EMP'
8 AND column_name IS NULL;
9 ELSIF INSERTING THEN
10 UPDATE audit_table SET ins = ins + 1
11 WHERE user_name = user AND table_name = 'EMP'
12 AND column_name IS NULL;
13 ELSIF UPDATING ('SAL') THEN
14 UPDATE audit_table SET upd = upd + 1
15 WHERE user_name = user AND table_name = 'EMP'
16 AND column_name = 'SAL';
17 ELSE /* The data manipulation operation is a general UPDATE. */
18 UPDATE audit_table SET upd = upd + 1
19 WHERE user_name = user AND table_name = 'EMP'
20 AND column_name IS NULL;
21 END IF;
22 END;
23 /
Trigger “After Row”: Ejemplo
SQL>CREATE OR REPLACE TRIGGER audit_emp_values
2 AFTER DELETE OR INSERT OR UPDATE ON emp
3 FOR EACH ROW
4 BEGIN
5 INSERT INTO audit_emp_values (user_name,
6 timestamp, id, old_last_name, new_last_name,
7 old_title, new_title, old_salary, new_salary)
8 VALUES (USER, SYSDATE, :old.empno, :old.ename,
9 :new.ename, :old.job, :new.job,
10 :old.sal, :new.sal);
11 END;
12 /
Uso de los calificadores
“OLD” y “NEW”
SQL>CREATE OR REPLACE TRIGGER derive_commission_pct
2 BEFORE INSERT OR UPDATE OF sal ON emp
3 FOR EACH ROW
4 WHEN (new.job = 'SALESMAN')
5 BEGIN
6 IF INSERTING THEN :new.comm := 0;
7 ELSE /* UPDATE of salary */
8 IF :old.comm IS NULL THEN
9 :new.comm :=0;
10 ELSE
11 :new.comm := :old.comm * (:new.sal/:old.sal);
12 END IF;
13 END IF;
14 END;
15 /
Condicionando un Trigger de
Registro
Diferenciando entre Triggers y
Procedimientos Almacenados
Triggers
Usa CREATE TRIGGER
El Dic. de Datos contiene el código
fuente y el p-code
Invocados implícitamente
NO se permite: COMMIT,
SAVEPOINT, ROLLBACK
Procedure
Usa CREATE PROCEDURE
El Dic. de Datos contiene el
código fuente y el p-code
Invocados explícitamente
Se permite: COMMIT,
SAVEPOINT, ROLLBACK
ALTER TRIGGER trigger_name DISABLE | ENABLE
Gestión de los Triggers
Activar o desactivar un trigger de la B.D.
ALTER TABLE table_name DISABLE | ENABLE ALL TRIGGERS
Activar o desactivar todos los trigs. de una tabla
ALTER TRIGGER trigger_name COMPILE
Recompilar un trigger para una tabla
Eliminación de Triggers
• Para borrar un trigger de la B.D, utilice la
sintaxis DROP TRIGGER:
DROP TRIGGER trigger_name
SQL>CREATE OR REPLACE TRIGGER audit_emp_values
2 AFTER DELETE OR INSERT OR UPDATE ON emp
3 FOR EACH ROW
4 BEGIN
5 IF audit_emp_package.g_reason IS NULL THEN
6 RAISE_APPLICATION_ERROR (-20059, 'Specify a reason
7 for the data operation with the procedure
8 SET_REASON before proceeding.');
9 ELSE
10 INSERT INTO audit_emp_values (user_name, timestamp, id,
11 old_last_name, new_last_name, old_title, new_title,
12 old_salary, new_salary, comments)
13 VALUES (user, sysdate, :old.empno,:old.ename,
14 :new.ename, :old.job, :new.job, :old.sal,
15 :new.sal, :audit_emp_package.g_reason);
16 END IF;
17 END;
18 /
SQL>CREATE TRIGGER cleanup_audit_emp
2 AFTER INSERT OR UPDATE OR DELETE ON emp
3 BEGIN
4 audit_emp_package.g_reason := NULL;
5 END;
6 /
Auditar por medio de Triggers
SQL> ALTER TABLE emp ADD
2 CONSTRAINT ck_salary CHECK (sal >= 500);
Forzar la Integridad de los Datos
dentro del Servidor
SQL>CREATE OR REPLACE TRIGGER check_salary
2 BEFORE UPDATE OF sal ON emp
3 FOR EACH ROW
4 WHEN (new.sal < old.sal) OR
5 (new.sal > old.sal * 1.1)
6 BEGIN
7 RAISE_APPLICATION_ERROR (-20508,
8 'Do not decrease salary nor increase by
9 more than 10%.');
10 END;
11 /
Protección de la Integridad de los
Datos con un Trigger
SQL> ALTER TABLE emp
2 ADD CONSTRAINT emp_deptno_fk
3 FOREIGN KEY (deptno) REFERENCES dept(deptno)
4 ON DELETE CASCADE;
Forzar la Integridad Referencial dentro
del Servidor
SQL>CREATE OR REPLACE TRIGGER cascade_updates
2 AFTER UPDATE OF deptno ON dept
3 FOR EACH ROW
4 BEGIN
5 UPDATE emp
6 SET emp.deptno = :new.deptno
7 WHERE emp.deptno = :old.deptno;
8 END;
9 /
Protección de la Integridad Referencial
con un Trigger
SQL> CREATE SNAPSHOT emp_copy AS
2 SELECT * FROM emp@ny;
Replicación de una Tabla dentro del
Servidor
SQL>CREATE OR REPLACE TRIGGER emp_replica
2 BEFORE INSERT OR UPDATE ON emp
3 FOR EACH ROW
4 BEGIN /*Only proceed if user init. data operation,
5 NOT the casc. trigger.*/
6 IF INSERTING THEN
7 IF :new.flag IS NULL THEN
8 INSERT INTO emp@sf VALUES (:new.empno,
9 :new.ename,...,'B');
10 :new.flag = 'A';
11 ELSE /* Updating. */
12 IF :new.flag = :old.flag THEN
13 UPDATE emp@sf SET ename = :new.ename, ...,
14 FLAG = :new.flag
15 WHERE empno = :new.empno;
16 END IF;
17 IF :old.flag = 'A' THEN :new.flag := 'B';
18 ELSE :new.flag := 'A';
19 END IF;
20 END IF;
21 END;
22 /
Replicación de una Tabla con un Trigger
Cálculo de Datos Derivados dentro del
Servidor
SQL> UPDATE dept
2> SET total_sal = (SELECT SUM(salary)
3> FROM emp
4> WHERE emp.deptno = dept.deptno);
SQL>CREATE OR REPLACE PROCEDURE increment_salary
2 (v_id IN dept.deptno%TYPE,
3 v_salary IN dept.total_salary%TYPE)
4 IS
5 BEGIN
6 UPDATE dept
7 SET total_sal = NVL (total_sal,0)+ v_salary
8 WHERE deptno = v_id;
9 END increment_salary;
10 /
SQL>CREATE OR REPLACE TRIGGER compute_salary
2 AFTER INSERT OR UPDATE OF sal OR DELETE ON emp
3 FOR EACH ROW
4 BEGIN
5 IF DELETING THEN increment_salary(:old.deptno, -1 * :old.sal);
6 ELSIF UPDATING THEN increment_salary(:new.deptno,
7 :new.sal-:old.sal);
8 ELSE /*inserting*/ increment_salary(:new.deptno, :new.sal);
9 END IF;
10 END;
11 /
Cálculo Datos Derivados con Triggers
SQL>CREATE OR REPLACE TRIGGER notify_reorder_rep
2 AFTER UPDATE OF amount_in_stock, reorder_point ON inventory
3 FOR EACH ROW
4 WHEN new.amount_in_stock <= new.reorder_point
5 DECLARE
6 v_descrip product.descrip%TYPE;
7 v_msg_text VARCHAR2(2000);
8 BEGIN
9 SELECT descrip INTO v_descrip
10 FROM PRODUCT WHERE prodid = :new.product_id;
11 v_msg_text := 'It has come to my personal attention that,
12 due to recent '
13 CHR(10) || 'transactions, our inventory for product # '||
14 TO_CHAR(:new.product_id)||'--'
15 || v_name ||'-- has fallen' || CHR(10) || CHR(10) ||
16 'Yours,' ||CHR(10) ||user || '.';
17 dbms_mail.send ('Inventory', user,null,null,'Low
18 Inventory',null,v_msg_text);
19 END;
20 /
Control de Eventos con un Trigger
Ventajas de los Triggers de la B.D.
• Seguridad de los datos mejorada:
– Ofrecen chequeos de seguridad basada en
valores.
– Ofrecen auditorías basadas en valores.
• Integridad de los datos mejorada:
– Fuerzan restricciones dinámicas de
integridad de datos.
– Fuerzan restricciones complejas de
integridad referencial.
– Aseguran que las operaciones relacionadas
se realizan juntas de forma impícita.
GRACIAS

Más contenido relacionado

La actualidad más candente

Teoria procedimientos almacenados
Teoria procedimientos almacenadosTeoria procedimientos almacenados
Teoria procedimientos almacenados
hirmaroxana13
 
Notas clase
Notas claseNotas clase
Notas clase
1 2d
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
1 2d
 

La actualidad más candente (17)

Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)Sesion09 - Manejo de Excepciones (Oracle)
Sesion09 - Manejo de Excepciones (Oracle)
 
Expo base
Expo baseExpo base
Expo base
 
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)
 
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11CONECTAR  C# CON POSTGRESQL  USANDO NPGSQL 2.0.11
CONECTAR C# CON POSTGRESQL USANDO NPGSQL 2.0.11
 
Trabajo dehoy (1)
Trabajo dehoy (1)Trabajo dehoy (1)
Trabajo dehoy (1)
 
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)
 
Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)Sesion08 - Cursores (Oracle)
Sesion08 - Cursores (Oracle)
 
Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)Sesion07- Estructuras de control (Oracle)
Sesion07- Estructuras de control (Oracle)
 
Vistas
VistasVistas
Vistas
 
Teoria procedimientos almacenados
Teoria procedimientos almacenadosTeoria procedimientos almacenados
Teoria procedimientos almacenados
 
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)
 
Comandos java
Comandos javaComandos java
Comandos java
 
Preparedstatemet
PreparedstatemetPreparedstatemet
Preparedstatemet
 
LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.LABORATORIO DE PROGRAMACIÓN I.
LABORATORIO DE PROGRAMACIÓN I.
 
Notas clase
Notas claseNotas clase
Notas clase
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Preparedstatement
PreparedstatementPreparedstatement
Preparedstatement
 

Destacado

La evolución de los automóviles
La evolución de los automóvilesLa evolución de los automóviles
La evolución de los automóviles
joseptower
 
Sistema de control iso 9000 luisvia
Sistema de control iso 9000 luisviaSistema de control iso 9000 luisvia
Sistema de control iso 9000 luisvia
lusvia3
 
Industrias farmaceuticas
Industrias farmaceuticasIndustrias farmaceuticas
Industrias farmaceuticas
fatimacrucesj
 
Diccionario informatico
Diccionario  informaticoDiccionario  informatico
Diccionario informatico
esyei07
 
Artefactos tecnologicos 801
Artefactos tecnologicos 801Artefactos tecnologicos 801
Artefactos tecnologicos 801
karelusi
 
Salto de página y salto de sección
Salto de página y salto de secciónSalto de página y salto de sección
Salto de página y salto de sección
Jennyfer Diaz
 

Destacado (20)

Cortana Analytics Workshop: Deep Neural Networks
Cortana Analytics Workshop: Deep Neural NetworksCortana Analytics Workshop: Deep Neural Networks
Cortana Analytics Workshop: Deep Neural Networks
 
La evolución de los automóviles
La evolución de los automóvilesLa evolución de los automóviles
La evolución de los automóviles
 
Sistema de control iso 9000 luisvia
Sistema de control iso 9000 luisviaSistema de control iso 9000 luisvia
Sistema de control iso 9000 luisvia
 
Industrias farmaceuticas
Industrias farmaceuticasIndustrias farmaceuticas
Industrias farmaceuticas
 
Gpap a10 lactanciam
Gpap a10 lactanciamGpap a10 lactanciam
Gpap a10 lactanciam
 
Diccionario informatico
Diccionario  informaticoDiccionario  informatico
Diccionario informatico
 
Familia triggrr ( papa)
Familia triggrr ( papa)Familia triggrr ( papa)
Familia triggrr ( papa)
 
Evaluación de riesgos
Evaluación de riesgosEvaluación de riesgos
Evaluación de riesgos
 
Ambiente
AmbienteAmbiente
Ambiente
 
Lenguaje 3
Lenguaje 3Lenguaje 3
Lenguaje 3
 
Arte
ArteArte
Arte
 
Nuestra visita a la fenal 2
Nuestra visita a la fenal 2Nuestra visita a la fenal 2
Nuestra visita a la fenal 2
 
Encuesta mirian y dorali
Encuesta mirian y doraliEncuesta mirian y dorali
Encuesta mirian y dorali
 
Samsung galaxy siii
Samsung galaxy siiiSamsung galaxy siii
Samsung galaxy siii
 
como cuido lal energia
como cuido lal energiacomo cuido lal energia
como cuido lal energia
 
Carta ano 2070 (1)
Carta ano 2070 (1)Carta ano 2070 (1)
Carta ano 2070 (1)
 
Tipos de datos
Tipos de datosTipos de datos
Tipos de datos
 
Apresentação - II Jornada Nacional de Investigación - ULADECH - Peru
Apresentação - II Jornada Nacional de Investigación - ULADECH - PeruApresentação - II Jornada Nacional de Investigación - ULADECH - Peru
Apresentação - II Jornada Nacional de Investigación - ULADECH - Peru
 
Artefactos tecnologicos 801
Artefactos tecnologicos 801Artefactos tecnologicos 801
Artefactos tecnologicos 801
 
Salto de página y salto de sección
Salto de página y salto de secciónSalto de página y salto de sección
Salto de página y salto de sección
 

Similar a gestion de datos de informacion

Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
betabeers
 
Semana 11 y 12 packages
Semana 11 y 12 packagesSemana 11 y 12 packages
Semana 11 y 12 packages
victdiazm
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
Javier P.
 
Joomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesJoomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensiones
deivit86
 

Similar a gestion de datos de informacion (20)

1 -programacion_oo
1  -programacion_oo1  -programacion_oo
1 -programacion_oo
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Intro a cakephp
Intro a cakephpIntro a cakephp
Intro a cakephp
 
Webpack desde cero
Webpack desde ceroWebpack desde cero
Webpack desde cero
 
preparedstatement
preparedstatementpreparedstatement
preparedstatement
 
Semana 11 y 12 packages
Semana 11 y 12 packagesSemana 11 y 12 packages
Semana 11 y 12 packages
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Paquete
PaquetePaquete
Paquete
 
Test bench en vhdl
Test bench en vhdlTest bench en vhdl
Test bench en vhdl
 
¡Twig desde 0!
¡Twig desde 0! ¡Twig desde 0!
¡Twig desde 0!
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Statement
StatementStatement
Statement
 
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
Analizador Léxico y Sintáctico para Compilador que Invierte Cadenas utilizand...
 
Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2Rendimiento en aplicaciones web con Symfony2
Rendimiento en aplicaciones web con Symfony2
 
Joomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensionesJoomladay 2008 Madrid - desarrollo de extensiones
Joomladay 2008 Madrid - desarrollo de extensiones
 
Cisco CCNA v5 Lab
Cisco CCNA v5 LabCisco CCNA v5 Lab
Cisco CCNA v5 Lab
 
Packages pl sql
Packages pl sqlPackages pl sql
Packages pl sql
 
Tuning fondo-negro-2
Tuning fondo-negro-2Tuning fondo-negro-2
Tuning fondo-negro-2
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (10)

investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
Guia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos BasicosGuia Basica para bachillerato de Circuitos Basicos
Guia Basica para bachillerato de Circuitos Basicos
 

gestion de datos de informacion

  • 1. FACULTAD DE INGENIERIA ESCUELA ACADÉMICA PROFESIONAL DE INGENIERÍA DE SISTEMAS GESTIÓN DE DATOS E INFORMACIÓN II SEMANA 2: Cursores, paquetes y triggers en Bases de Datos. Ing. Mg.Sc. Hugo Villaverde M.
  • 3. Visión General sobre los Paquetes – Agrupan de forma lógica subprogramas. – Compuestos de dos partes: • Especificación • Cuerpo – No pueden ser llamados, parametrizados o anidados – Permiten al SGBD leer múltiples objetos en memoria, de una sola vez.
  • 4. Ventajas de los Paquetes – Modularidad – Diseño más sencillo de la aplicación – Información oculta – Funcionalidad añadida – Mejor rendimiento – Sobrecarga
  • 5. Desarrollo de un Paquete Declaración del Procedimiento A Definición del Procedimiento B Especificación del Paquete Cuerpo del Paquete 1 2 3 4 2 Definición del Procedimiento A 5
  • 6. CREATE [OR REPLACE] PACKAGE package_name IS | AS public type and item declarations subprogram specifications END package_name; Creación de la Especificación de un PaqueteSintaxis:
  • 8. Creación de la Especificación de un Paquete: Ejemplo SQL>CREATE OR REPLACE PACKAGE comm_package IS 2 g_comm NUMBER := 10; --initialized to 10 3 PROCEDURE reset_comm 4 (v_comm IN NUMBER); 5 END comm_package; 6 /
  • 9. Declaración de una Variable Global o un Procedimiento Público SQL>EXECUTE comm_package.g_comm := 5 SQL>EXECUTE comm_package.reset_comm(8)
  • 10. Creación del Cuerpo de un Paquete Sintaxis: CREATE [OR REPLACE] PACKAGE BODY package_name IS | AS private type and item declarations subprogram bodies END package_name;
  • 11. G_COMM Declaración del Procedimiento RESET_COMM Definición de la Función VALIDATE_COMM Especificación del Paquete Cuerpo del Paquete 1 2 3 2 Definición del Procedimiento RESET_COMM Paquete COMM_PACKAGE Partes Públicas y Privadas
  • 12. Creación del Cuerpo de un Paquete : Ejemplo SQL>CREATE OR REPLACE PACKAGE BODY comm_package IS 2 FUNCTION validate_comm 3 (v_comm IN NUMBER) RETURN BOOLEAN 4 IS 5 v_max_comm NUMBER; 6 BEGIN 7 SELECT MAX(comm) 8 INTO v_max_comm 9 FROM emp; 10 IF v_comm > v_max_comm THEN RETURN(FALSE); 11 ELSE RETURN(TRUE); 12 END IF; 13 END validate_comm; 14 END comm_package; 15 /
  • 13. SQL>PROCEDURE reset_comm 2 (v_comm IN NUMBER) 3 IS 4 v_valid BOOLEAN; 5 BEGIN 6 v_valid := validate_comm(v_comm); 7 IF v_valid = TRUE THEN 8 g_comm := v_comm; 9 ELSE 10 RAISE_APPLICATION_ERROR 11 (-20210,'Invalid commission'); 12 END IF; 13 END reset_comm; 14 END comm_package; 15 / Creación del Cuerpo de un Paquete : Ejemplo
  • 14. Guía para el Desarrollo de Paquetes – Cree paquetes flexibles. – Defina la especificación del paquete antes que el cuerpo. – La especificación del paquete sólo debería de contener construcciones públicas – La especificación del paquete debería contener el mínimo nº de construcciones.
  • 15. Llamada a Programas de un Paquete • Ejemplo 1: Llamada a una función desde un procedimiento del mismo paquete: CREATE OR REPLACE PACKAGE BODY comm_package IS . . . PROCEDURE reset_comm(v_comm IN NUMBER) IS v_valid BOOLEAN; BEGIN v_valid := validate_comm(v_comm); IF v_valid = TRUE THEN g_comm := v_comm; ELSE RAISE_APPLICATION_ERROR (-20210, 'Invalid comm'); END IF; END reset_comm; END comm_package;
  • 16. • Ejemplo 2: Llamada a un procedimiento de un paquete desde SQL*Plus: • Ejemplo 3: Llamada a un procedimiento de un paquete en un esquema diferente: • Ejemplo 4: Llamada a un procedimiento de un paquete en una B.D. remota: Llamada a Programas de un Paquete SQL>EXECUTE comm_package.reset_comm(1500); SQL> EXECUTE scott.comm_package.reset_comm(1500); SQL> EXECUTE comm_package.reset_comm@ny (1500);
  • 17. Referencia a una Variable Global dentro del PaqueteEjemplo 1: CREATE OR REPLACE PACKAGE BODY comm_package IS . . . PROCEDURE reset_comm(v_comm IN NUMBER) IS v_valid BOOLEAN; BEGIN v_valid := validate_comm(v_comm); IF v_valid = TRUE THEN g_comm := v_comm; ELSE RAISE_APPLICATION_ERROR (-20210,'Invalid comm'); END IF; END reset_comm; END comm_package;
  • 18. Referencia a una Variable Global desde un Proc. Standalone • Ejemplo 2: CREATE OR REPLACE PROCEDURE hire_emp (v_ename IN emp.ename%TYPE, v_mgr IN emp.mgr%TYPE, v_job IN emp.job%TYPE, v_sal IN emp.sal%TYPE) IS v_comm emp.comm%TYPE; . . . BEGIN . . . v_comm := comm_package.g_comm; . . . END hire_emp;
  • 19. SCOTT-09:00> EXECUTE comm_package.reset_comm(120); Initially g_comm equals 10 After executing the procedure, g_comm equals 120 JONES-09:30> INSERT INTO emp (ename,..,comm) VALUES ('Madona',..,2000); JONES-09:35> EXECUTE comm_package.reset_comm(170); Initially g_comm equals 10 After executing the procedure, g_comm equals 170 SCOTT-10:00> EXECUTE comm_package.reset_comm(4000); Results in: 'Invalid commission' JONES-11:00> ROLLBACK; JONES-11:01> EXIT; JONES-12:00> EXECUTE comm_package.reset_comm(150); Initially g_comm equals 10 After executing the procedure, g_comm equals 150 Estado Persistente de las Variables de un Paquete
  • 20. Estado Persistente de un Cursor en un Paquete SQL> CREATE OR REPLACE PACKAGE pack_cur 2 IS 3 CURSOR c1 IS SELECT empno FROM emp 4 ORDER BY empno desc; 5 PROCEDURE proc1_3rows; 6 PROCEDURE proc4_6rows; 7 END pack_cur; 8 / • Ejemplo:
  • 21. SQL> CREATE OR REPLACE PACKAGE BODY pack_cur 2 IS 3 v_empno NUMBER; 4 PROCEDURE proc1_3rows IS 5 BEGIN OPEN c1; 6 LOOP FETCH c1 INTO v_empno; 7 DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno)); 8 EXIT WHEN c1%ROWCOUNT >= 3; 9 END LOOP; 10 END proc1_3rows; 11 PROCEDURE proc4_6rows IS 12 BEGIN 13 LOOP FETCH c1 INTO v_empno; 14 DBMS_OUTPUT.PUT_LINE('Id :' ||(v_empno)); 15 EXIT WHEN c1%ROWCOUNT >= 6; 16 END LOOP; 17 CLOSE c1; 18 END proc4_6rows; 19 END pack_cur; 20 / Estado Persistente de un Cursor en un Paquete
  • 22. SQL> SET SERVEROUTPUT ON SQL> EXECUTE pack1.proc1_3rows; Id : 7934 Id : 7902 Id : 7900 SQL> EXECUTE pack1.proc4_6rows; Id : 7876 Id : 7844 Id : 7839 Estado Persistente de un Cursor en un Paquete
  • 23. CREATE OR REPLACE PACKAGE emp_package IS TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER; PROCEDURE read_emp_table(emp_table OUT emp_table_type); END emp_package; CREATE OR REPLACE PACKAGE BODY emp_package IS PROCEDURE read_emp_table(emp_table OUT emp_table_type) IS i BINARY_INTEGER:=0; BEGIN FOR emp_record IN (SELECT * FROM emp) LOOP emp_table(i):=emp_record; I:=I+1; END LOOP; END; END emp_package; Estado Persistente de Tablas de Registros PL/SQL en un Paquete
  • 24. DROP PACKAGE package_name Eliminación de Paquetes Para borrar la especificación del paquete y el cuerpo: Para borrar el cuerpo del paquete: DROP PACKAGE BODY package_name
  • 25. Resumen – Mejoran la organización, gestión, seguridad y rendimiento. – Agrupan procedimientos y funciones. – Se puede cambiar el cuerpo de un paquete sin que afecte a la especificación. – Conceden acceso de seguridad al paquete completo.
  • 26. Resumen – Ocultan el código fuente a los usuarios. – Cargan todo el paquete en memoria en la primera llamada. – Reducen el acceso a disco para llamadas posteriores. – Ofrecen identificadores para las sesiones de usuario.
  • 27. Comando CREATE [OR REPLACE] PACKAGE CREATE [OR REPLACE] PACKAGE BODY DROP PACKAGE DROP PACKAGE BODY Tarea Crea o modifica la especificación de un paquete ya existente Crea o modifica el cuerpo de un paquete ya existente Borra tanto la especificación como el cuerpo de un paquete Borra el cuerpo de un paquete Resumen
  • 28. Creación de Triggers en la Base de Datos
  • 29. Visión General de los Triggers – Un trigger es un bloque PL/SQL que se ejecuta implícitamente cuando ocurre un evento. – Un trigger puede ser “de la base de datos” o “de la aplicación”.
  • 30. Guía para el Diseño de Triggers – Realizar acciones relacionadas. – Utilizar triggers para operaciones globales. – No “reinventar la rueda” – Prestar atención a los excesos (overkill)
  • 31. Creación de Disparadores – Momento: BEFORE o AFTER – Evento: INSERT o UPDATE o DELETE – Nombre Tabla: On table – Tipo de Trigger: Row o statement – Claúsula When: Condición – Cuerpo del Trigger: DECLARE • BEGIN • END;
  • 32. Componentes de un Trigger • Momento: ¿Cuándo debería dispararse? – BEFORE: El código del cuerpo del trigger se ejecutará antes del evento DML – AFTER: El código del cuerpo del trigger se ejecutará antes del evento DML
  • 33. Componentes de un Trigger • Evento: • ¿Qué operación DML provocará la ejecución trigger? – INSERT – UPDATE – DELETE – Cualquier combinación de las anteriores
  • 34. Componentes de un Trigger • Tipo de Trigger: • ¿Cuántas veces debería ejecutarse el cuerpo del trigger cuando ocurre el evento? – Statement: El cuerpo del trigger se ejecuta sólo una vez para el evento. Este es el comportamiento por defecto. – Row: El cuerpo del trigger se ejecuta una vez para cada registro afectado por el evento.
  • 35. Componentes de un Trigger • Cuerpo del Trigger: • ¿Qué acción debería de realizar el trigger? – El cuerpo del trigger es definido con un bloque PL/SQL anónimo • [DECLARE] • BEGIN • [EXCEPTION] • END;
  • 36. Sintaxis para la Creación y Definición de Triggers CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name PL/SQL block;
  • 37. Trigger “Before Statement”: Ejemplo SQL> CREATE OR REPLACE TRIGGER secure_emp 2 BEFORE INSERT ON emp 3 BEGIN 4 IF (TO_CHAR (sysdate,'DY') IN ('SAT','SUN')) 5 OR (TO_CHAR(sysdate,'HH24')NOT BETWEEN 6 '08' AND '18' 7 THEN RAISE_APPLICATION_ERROR (-20500, 8 'You may only insert into EMP during normal 9 hours.'); 10 END IF; 11 END; 12 /
  • 38. Ejemplo SQL> INSERT INTO emp (empno, ename, deptno) 2 VALUES (7777, 'BAUWENS', 40); INSERT INTO emp (empno, ename, deptno) * ERROR at line 1: ORA-20500: You may only insert into EMP during normal hours. ORA-06512: at "SCOTT.SECURE_EMP", line 4 ORA-04088: error during execution of trigger 'SCOTT.SECURE_EMP'
  • 39. Trigger “After Statement”: EjemploSQL>CREATE OR REPLACE TRIGGER check_salary_count 2 AFTER UPDATE OF sal ON emp 3 DECLARE 4 v_salary_changes NUMBER; 5 v_max_changes NUMBER; 6 BEGIN 7 SELECT upd, max_upd 8 INTO v_salary_changes, v_max_changes 9 FROM audit_table 10 WHERE user_name = user 11 AND table_name = 'EMP' 12 AND column_name = 'SAL'; 13 IF v_salary_changes > v_max_changes THEN 14 RAISE_APPLICATION_ERROR (-20501, 15 'You may only make a maximum of '|| 16 TO_CHAR (v_max_changes) || 17 ' changes to the SAL column'); 18 END IF; 19 END; 20 /
  • 40. Creación de un Trigger a Nivel de Registro CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON table_name [REFERENCING OLD AS old | NEW AS new] FOR EACH ROW [WHEN condition] PL/SQL block;
  • 41. SQL>CREATE OR REPLACE TRIGGER audit_emp 2 AFTER DELETE OR INSERT OR UPDATE ON emp 3 FOR EACH ROW 4 BEGIN 5 IF DELETING THEN 6 UPDATE audit_table SET del = del + 1 7 WHERE user_name = user AND table_name = 'EMP' 8 AND column_name IS NULL; 9 ELSIF INSERTING THEN 10 UPDATE audit_table SET ins = ins + 1 11 WHERE user_name = user AND table_name = 'EMP' 12 AND column_name IS NULL; 13 ELSIF UPDATING ('SAL') THEN 14 UPDATE audit_table SET upd = upd + 1 15 WHERE user_name = user AND table_name = 'EMP' 16 AND column_name = 'SAL'; 17 ELSE /* The data manipulation operation is a general UPDATE. */ 18 UPDATE audit_table SET upd = upd + 1 19 WHERE user_name = user AND table_name = 'EMP' 20 AND column_name IS NULL; 21 END IF; 22 END; 23 / Trigger “After Row”: Ejemplo
  • 42. SQL>CREATE OR REPLACE TRIGGER audit_emp_values 2 AFTER DELETE OR INSERT OR UPDATE ON emp 3 FOR EACH ROW 4 BEGIN 5 INSERT INTO audit_emp_values (user_name, 6 timestamp, id, old_last_name, new_last_name, 7 old_title, new_title, old_salary, new_salary) 8 VALUES (USER, SYSDATE, :old.empno, :old.ename, 9 :new.ename, :old.job, :new.job, 10 :old.sal, :new.sal); 11 END; 12 / Uso de los calificadores “OLD” y “NEW”
  • 43. SQL>CREATE OR REPLACE TRIGGER derive_commission_pct 2 BEFORE INSERT OR UPDATE OF sal ON emp 3 FOR EACH ROW 4 WHEN (new.job = 'SALESMAN') 5 BEGIN 6 IF INSERTING THEN :new.comm := 0; 7 ELSE /* UPDATE of salary */ 8 IF :old.comm IS NULL THEN 9 :new.comm :=0; 10 ELSE 11 :new.comm := :old.comm * (:new.sal/:old.sal); 12 END IF; 13 END IF; 14 END; 15 / Condicionando un Trigger de Registro
  • 44. Diferenciando entre Triggers y Procedimientos Almacenados Triggers Usa CREATE TRIGGER El Dic. de Datos contiene el código fuente y el p-code Invocados implícitamente NO se permite: COMMIT, SAVEPOINT, ROLLBACK Procedure Usa CREATE PROCEDURE El Dic. de Datos contiene el código fuente y el p-code Invocados explícitamente Se permite: COMMIT, SAVEPOINT, ROLLBACK
  • 45. ALTER TRIGGER trigger_name DISABLE | ENABLE Gestión de los Triggers Activar o desactivar un trigger de la B.D. ALTER TABLE table_name DISABLE | ENABLE ALL TRIGGERS Activar o desactivar todos los trigs. de una tabla ALTER TRIGGER trigger_name COMPILE Recompilar un trigger para una tabla
  • 46. Eliminación de Triggers • Para borrar un trigger de la B.D, utilice la sintaxis DROP TRIGGER: DROP TRIGGER trigger_name
  • 47. SQL>CREATE OR REPLACE TRIGGER audit_emp_values 2 AFTER DELETE OR INSERT OR UPDATE ON emp 3 FOR EACH ROW 4 BEGIN 5 IF audit_emp_package.g_reason IS NULL THEN 6 RAISE_APPLICATION_ERROR (-20059, 'Specify a reason 7 for the data operation with the procedure 8 SET_REASON before proceeding.'); 9 ELSE 10 INSERT INTO audit_emp_values (user_name, timestamp, id, 11 old_last_name, new_last_name, old_title, new_title, 12 old_salary, new_salary, comments) 13 VALUES (user, sysdate, :old.empno,:old.ename, 14 :new.ename, :old.job, :new.job, :old.sal, 15 :new.sal, :audit_emp_package.g_reason); 16 END IF; 17 END; 18 / SQL>CREATE TRIGGER cleanup_audit_emp 2 AFTER INSERT OR UPDATE OR DELETE ON emp 3 BEGIN 4 audit_emp_package.g_reason := NULL; 5 END; 6 / Auditar por medio de Triggers
  • 48. SQL> ALTER TABLE emp ADD 2 CONSTRAINT ck_salary CHECK (sal >= 500); Forzar la Integridad de los Datos dentro del Servidor
  • 49. SQL>CREATE OR REPLACE TRIGGER check_salary 2 BEFORE UPDATE OF sal ON emp 3 FOR EACH ROW 4 WHEN (new.sal < old.sal) OR 5 (new.sal > old.sal * 1.1) 6 BEGIN 7 RAISE_APPLICATION_ERROR (-20508, 8 'Do not decrease salary nor increase by 9 more than 10%.'); 10 END; 11 / Protección de la Integridad de los Datos con un Trigger
  • 50. SQL> ALTER TABLE emp 2 ADD CONSTRAINT emp_deptno_fk 3 FOREIGN KEY (deptno) REFERENCES dept(deptno) 4 ON DELETE CASCADE; Forzar la Integridad Referencial dentro del Servidor
  • 51. SQL>CREATE OR REPLACE TRIGGER cascade_updates 2 AFTER UPDATE OF deptno ON dept 3 FOR EACH ROW 4 BEGIN 5 UPDATE emp 6 SET emp.deptno = :new.deptno 7 WHERE emp.deptno = :old.deptno; 8 END; 9 / Protección de la Integridad Referencial con un Trigger
  • 52. SQL> CREATE SNAPSHOT emp_copy AS 2 SELECT * FROM emp@ny; Replicación de una Tabla dentro del Servidor
  • 53. SQL>CREATE OR REPLACE TRIGGER emp_replica 2 BEFORE INSERT OR UPDATE ON emp 3 FOR EACH ROW 4 BEGIN /*Only proceed if user init. data operation, 5 NOT the casc. trigger.*/ 6 IF INSERTING THEN 7 IF :new.flag IS NULL THEN 8 INSERT INTO emp@sf VALUES (:new.empno, 9 :new.ename,...,'B'); 10 :new.flag = 'A'; 11 ELSE /* Updating. */ 12 IF :new.flag = :old.flag THEN 13 UPDATE emp@sf SET ename = :new.ename, ..., 14 FLAG = :new.flag 15 WHERE empno = :new.empno; 16 END IF; 17 IF :old.flag = 'A' THEN :new.flag := 'B'; 18 ELSE :new.flag := 'A'; 19 END IF; 20 END IF; 21 END; 22 / Replicación de una Tabla con un Trigger
  • 54. Cálculo de Datos Derivados dentro del Servidor SQL> UPDATE dept 2> SET total_sal = (SELECT SUM(salary) 3> FROM emp 4> WHERE emp.deptno = dept.deptno);
  • 55. SQL>CREATE OR REPLACE PROCEDURE increment_salary 2 (v_id IN dept.deptno%TYPE, 3 v_salary IN dept.total_salary%TYPE) 4 IS 5 BEGIN 6 UPDATE dept 7 SET total_sal = NVL (total_sal,0)+ v_salary 8 WHERE deptno = v_id; 9 END increment_salary; 10 / SQL>CREATE OR REPLACE TRIGGER compute_salary 2 AFTER INSERT OR UPDATE OF sal OR DELETE ON emp 3 FOR EACH ROW 4 BEGIN 5 IF DELETING THEN increment_salary(:old.deptno, -1 * :old.sal); 6 ELSIF UPDATING THEN increment_salary(:new.deptno, 7 :new.sal-:old.sal); 8 ELSE /*inserting*/ increment_salary(:new.deptno, :new.sal); 9 END IF; 10 END; 11 / Cálculo Datos Derivados con Triggers
  • 56. SQL>CREATE OR REPLACE TRIGGER notify_reorder_rep 2 AFTER UPDATE OF amount_in_stock, reorder_point ON inventory 3 FOR EACH ROW 4 WHEN new.amount_in_stock <= new.reorder_point 5 DECLARE 6 v_descrip product.descrip%TYPE; 7 v_msg_text VARCHAR2(2000); 8 BEGIN 9 SELECT descrip INTO v_descrip 10 FROM PRODUCT WHERE prodid = :new.product_id; 11 v_msg_text := 'It has come to my personal attention that, 12 due to recent ' 13 CHR(10) || 'transactions, our inventory for product # '|| 14 TO_CHAR(:new.product_id)||'--' 15 || v_name ||'-- has fallen' || CHR(10) || CHR(10) || 16 'Yours,' ||CHR(10) ||user || '.'; 17 dbms_mail.send ('Inventory', user,null,null,'Low 18 Inventory',null,v_msg_text); 19 END; 20 / Control de Eventos con un Trigger
  • 57. Ventajas de los Triggers de la B.D. • Seguridad de los datos mejorada: – Ofrecen chequeos de seguridad basada en valores. – Ofrecen auditorías basadas en valores. • Integridad de los datos mejorada: – Fuerzan restricciones dinámicas de integridad de datos. – Fuerzan restricciones complejas de integridad referencial. – Aseguran que las operaciones relacionadas se realizan juntas de forma impícita.