Вы находитесь на странице: 1из 13

Desarrollo de Aplicaciones

ACorp Database

Desarrollando Triggers de Base de Datos


Desarrolle un trigger de base de datos para ejecutar un bloque PL/SQL implcitamente siempre que una sentencia de manipulacin de datos sea emitida en una tabla. Ejemplo:
CREATE OR REPLACE TRIGGER check_salary BEFORE INSERT OR UPDATE OF sal, job ON emp FOR EACH ROW WHEN ( new.job <> 'PRESIDENT' ) DECLARE v_minsal sal_guide.minsal%TYPE; v_maxsal sal_guide.maxsal%TYPE; e_sal_out_of_range EXCEPTION; BEGIN SELECT losal, hisal INTO minsal, maxsal FROM sals WHERE job = :new.job; IF :new.sal < v_minsal OR :new.sal > v_maxsal THEN RAISE e_sal_out_of_range; END IF; EXCEPTION WHEN e_sal_out_of_range THEN INSERT INTO audit_message (line_nr, line) VALUES (1, 'Salary '|| TO_CHAR (:new.sal) || ' is out of range for employee ' || TO_CHAR(:new.empno)); END;

La accin de un trigger puede causar que un segundo trigger se dispare. Ejemplo:


CREATE OR REPLACE TRIGGER count_audit_message BEFORE INSERT ON audit_message BEGIN emp_package.v_total_audit := emp_package.v_total_audit + 1; END;

El nmero de triggers en cascada es limitada por el parmetro de inicializacin OPEN_CURSORS.


SQL> INSERT INTO emp ...;

Tabla EMP
EMPNO 7369 7499 7566 ENAME SMITH ALLEN JONES JOB CLERK SALESMAN MANAGER SAL 800.00 1,600.00 2,975.00

Trigger CHECK_SAL

Before Insert Row

xxxxxxxxxxxxxx $$$$$$$$$$$$$$

Tabla AUDIT_MESSAGE
LINE_NR LINE

Trigger COUNT_AUDIT_MESSAGE

xxxxxxxxxxxxxx $$$$$$$$$$$$$$

Desarrollando Triggers

Pgina 5-1

Desarrollo de Aplicaciones

ACorp Database

Parte Trigger Timing Trigger Event

Descripcin Cuando el trigger se dispara en relacin al evento Operacin que manipula los datos en la tabla causando que el trigger se dispare Cuantas veces el cuerpo del trigger es ejecutado Accin que el trigger ejecuta

Posibles Valores BEFORE AFTER INSERT UPDATE DELETE Statement Row Bloque PL/SQL

Trigger Type Trigger Body

Diferencias entre triggers de base de datos y procedimientos almacenados Trigger de Base de Datos Procedimiento Almacenado

Invocado implcitamente cuando una sentencia Invocando explicitamente desde una aplicacin de manipulacin de datos es usada procedimiento Las siguientes sentencias son prohbidas en el cuerpo del trigger: COMMIT, ROLLBACK, SAVEPOINT Las sentencias COMMIT, ROLLBACK, SAVEPOINT son permitidas en el cuerpo del procedimiento

Diferencias entre triggers de base de datos y triggers de Oracle Forms Trigger de Base de Datos Ejecutado por la accin de cualquier herramienta de base de datos aplicaciones Triggers de Oracle Forms Ejecutado slo por una aplicacin de Oracle Forms

Siempre se dispara por una sentencia SQL que Puede dispararse por la navegacin de un campo a manipula los datos otro, presionando una tecla cualquier otra accin Si el trigger falla, causa un ROLLBACK en la Si el trigger falla, el cursor se detiene y puede causar sentencia ROLLBACK en la transacci Se dispara independientemente, adicional a los Se dispara independientemente, adicional a los triggers de Oracle Forms triggers de la base de datos Ejecutado bajo el dominio de seguridad del dueo del trigger Sentencia CREATE TRIGGER CREATE OR REPLACE TRIGGER trigger_name timing event OR [event] ON table FOR EACH ROW WHEN restricting condition Pl/sql block Cuando una sentencia de manipulacin de datos afecta a mltiples filas, la sentencia del trigger se disparada una vez y el trigger es disparado una vez por cada registro afectado por la sentencia. Ejemplos:
INSERT INTO emp (empno, ename) SELECT empno, ename FROM emp_backup; UPDATE emp SET sal = sal * 1.1 WHERE deptno = 10;

Ejecutado bajo el dominio de seguridad del usuario del Oracle Forms

Desarrollando Triggers

Pgina 5-2

Desarrollo de Aplicaciones

ACorp Database

Cree una sentencia trigger BEFORE para prevenir una operacin que suceda cuando una condicin es violada. Ejemplo: Restrinja la insercin de datos en la tabla emp para determinadas horas en la semana.
CREATE OR REPLACE TRIGGER secure_emp BEFORE INSERT ON emp BEGIN IF ( TO_CHAR (SYSDATE, 'DY') IN ('SAT','SUN') ) OR ( TO_NUMBER (SYSDATE, 'HH24') NOT BETWEEN 8 AND 18 ) THEN RAISE_APPLICATION_ERROR (-20500, 'You may only insert into EMP during normal hours'); END IF; END;

Cree una sentencia trigger AFTER para implementar auditorias ejecutar un clculo despus que la operacin ha sido completada. Ejemplo:
CREATE OR REPLACE TRIGGER check_sal_count AFTER UPDATE OF sal ON emp DECLARE v_sal_changes NUMBER; v_max_changes NUMBER; BEGIN SELECT upd, max_upd INTO v_sal_changes, v_max_changes FROM audit_table WHERE user_name = user AND table_name = 'EMP' AND column_name = 'SAL'; IF v_sal_changes > v_max_changes THEN RAISE_APPLICATION_ERROR (-20501, 'You may only make a maximum of '|| TO_CHAR (v_max_changes)|| ' to the SAL column.'); END IF; END;

Combine varios eventos en un solo trigger, use los predicados condicionales INSERTING, UPDATING, DELETING en el cuerpo del trigger. Ejemplo:
CREATE OR REPLACE TRIGGER secure_emp BEFORE DELETE OR INSERT OR UPDATE ON emp BEGIN IF ( TO_CHAR (SYSDATE, 'DY') IN ('SAT','SUN') ) OR ( TO_NUMBER (SYSDATE, 'HH24') NOT BETWEEN 8 AND 18 ) THEN IF DELETING THEN RAISE_APPLICATION_ERROR (-20502, 'You may only delete from EMP during normal hours'); ELSIF INSERTING THEN RAISE_APPLICATION_ERROR (-20500, 'You may only insert into EMP during normal hours'); ELSIF UPDATING ('SAL')THEN RAISE_APPLICATION_ERROR (-20503, 'You may only update SAL column during normal hours'); ELSE RAISE_APPLICATION_ERROR (-20504, 'You may only update EMP table during normal hours'); END IF; END;

Desarrollando Triggers

Pgina 5-3

Desarrollo de Aplicaciones

ACorp Database

Para crear un trigger que se dispare cada vez que una fila es afectada por una sentencia de manipulacin de datos, incluya la clusula FOR EACH ROW en la sentencia CREATE TRIGGER. Ejemplo:
CREATE OR REPLACE TRIGGER audit_emp AFTER DELETE OR INSERT OR UPDATE ON emp BEGIN IF DELETING THEN UPDATE audit_table SET del = del + 1 WHERE user_name = user AND table_name = 'EMP' AND column_name IS NULL; ELSIF INSERTING THEN UPDATE audit_table SET ins = ins + 1 WHERE user_name = user AND table_name = 'EMP' AND column_name IS NULL; ELSIF UPDATING ('SAL')THEN UPDATE audit_table SET udp = udp + 1 WHERE user_name = user AND table_name = 'EMP' AND column_name = 'SAL'; ELSE UPDATE audit_table SET ins = ins + 1 WHERE user_name = user AND table_name = 'EMP' AND column_name IS NULL; END IF; END;

En un trigger de filas, se puede referenciar el valor de la columna antes de que sea cambiado usando el prefijo calificador OLD, y referenciar el valor despus del cambio con prefijo calificador NEW. Use los prefijo calificadores en triggers BEFORE y AFTER al nivel de filas No use los prefijos calificadores en triggers de sentencias Use los prefijos calificadores con dos puntos [:] en las sentencias SQL y PL/SQL Operacin Insert Update Delete Valor OLD NULL Valor antes de la actualizacin Valor antes de la eliminacin Valor NEW Valor insertado Valor modificado NULL

Ejemplo: Almacene la historia de los valores de la tabla EMP


CREATE OR REPLACE TRIGGER audit_emp_values AFTER DELETE OR INSERT OR UPDATE ON emp FOR EACH ROW BEGIN INSERT INTO audit_emp_values (user_name, timestap, empno, old_ename, new_ename, old_job, new_job, old_mgr, new_mgr, old_sal, new_sal) VALUES (USER, SYSDATE, :old.empno, :old. Ename, :new.ename, :old.job, :new.job, :old.mgr, :new.mgr, :old.sql, :new.sal); END;

Desarrollando Triggers

Pgina 5-4

Desarrollo de Aplicaciones

ACorp Database

Restrinja la accin de un trigger para filas que satisfacen cierta condicin, a travs de la clusula WHEN. Ejemplo: Calcule la comisin automticamente para los vendedores
CREATE OR REPLACE TRIGGER derive_comm BEFORE INSERT OR UPDATE OF sal ON emp FOR EACH ROW WHEN new.job = 'SALESMAN' BEGIN :new.comm := :old.comm * (:new.sal / :old.sal); END;

En la clusula WHEN, los prefijos OLD y NEW no usan los dos puntos [:] En trigger de sentencias no use la clusula WHEN Almacenando trigger Tarea Crea un nuevo trigger Modifica un trigger existente Elimina un trigger Comando CREATE TRIGGER CREATE OR REPLACE TRIGGER DROP TRIGGER

Deshabilitando un trigger de base de datos. Sintaxis:


ALTER TRIGGER trigger_name DISABLE;

Rehabilitando un trigger de base de datos. Sintaxis:


ALTER TRIGGER trigger_name ENABLE;

Deshabilitando todos los triggers de una tabla. Sintaxis:


ALTER TABLE table_name DISABLE ALL TRIGGERS;

Rehabilitando todos los triggers de una tabla. Sintaxis:


ALTER TABLE table_name ENABLE ALL TRIGGERS;

Administrando Triggers Tarea Documentos Trigger Examine la vista del diccionario de datos USER_TRIGGERS Procedimiento DBMS_OUTPUT.PUT_LINE Procedimiento Examine las vistas del diccionario de datos USER_OBJECTS y USER_SOURCE Procedimiento DBMS_OUTPUT.PUT_LINE

Debug Control de Seguridad de desarrollo

Obtenga privilegios para crear triggers, Obtenga privilegios para crear para accesar objetos referenciados por procedimientos, para accesar objetos el trigger y para alterar la tabla referenciados por el procedimiento asociada Privilegios no especificados Obtener el privilegio de objeto EXECUTE para el procedimiento

Control de Seguridad de Usuario

Desarrollando Triggers

Pgina 5-5

Desarrollo de Aplicaciones

ACorp Database

Obtenga el cdigo fuente de triggers validos de la vista del diccionario de datos USER_TRIGGERS. Columna TRIGGER_NAME TRIGGER_TYPE TRIGGERING_EVENT TABLE_OWNER TABLE_NAME WHEN STATUS TRIGGER_BODY Descripcin Columna Nombre del trigger Timing del trigger (BEFORE AFTER) Sentencia de manipulacin de datos que dispara el trigger (INSERT, UPDATE DELETE) Dueo de la tabla asociada con el trigger Nombre de la tabla asociada con el trigger Condicin restrictiva Estado del trigger (ENABLED DISABLED) Bloque PL/SQL

Tambin examine las vistas ALL_TRIGGERS y DBA_TRIGGERS, estas contienen la columna adicional OWNER, para el dueo del trigger. Ejemplo: Muestre el cdigo del trigger DERIVE_COMM
SELECT trigger_body FROM user_triggers WHERE name = 'DERIVE_COMM'; TRIGGER_BODY --------------------------------------------------------BEGIN :new.comm := :old.comm * (:new.sal / :old.sal); END;

Privilegios necesarios para desarrollar triggers

Operacin CREATE

Privilegios requeridos Privilegios de Sistemas CREATE TRIGGER CREATE ANY TRIGGER

And ... Acceso a todos los objetos referenciados por el trigger y dueo de la tabla asociada privilegio de objeto ALTER sobre la tabla asociada privilegio de sistemas ALTER ANY TABLE No necesita otros privilegios

CREATE OR REPLACE DROP

Dueo del trigger privilegios de sistemas CREATE TRIGGER CREATE ANY TRIGGER Dueo del trigger privilegio de sistema DROP TRIGGER

No necesita otros privilegios

Implementando operaciones de validacin de datos con triggers Ejemplo #1: Cambiando datos en una tabla asociada al trigger
CREATE OR REPLACE TRIGGER derive_comm BEFORE INSERT OR UPDATE OF sal ON emp FOR EACH ROW WHEN new.job = 'SALESMAN'

Desarrollando Triggers

Pgina 5-6

Desarrollo de Aplicaciones

ACorp Database

BEGIN :new.comm := :old.comm * (:new.sal / :old.sal); END; UPDATE EMP SET sal = 1500 WHERE ename = 'MARTIN'; 1 row updated.

Ejemplo #2: Sobreescriba datos cambiados en la tabla


CREATE OR REPLACE TRIGGER derive_comm BEFORE INSERT OR UPDATE OF sal ON emp FOR EACH ROW BEGIN :new.comm := LEAST( :new.sal, :old.sal * 1.1); END; UPDATE EMP SET sal = 1500 WHERE ename = 'MARTIN'; 1 row updated.

Leyendo y escribiendo datos usando triggers sujetos a reglas Regla #1: No cambie informacin en la clave primaria, claves foranas, clave nica en una tabla con constraint. Ejemplo: Cuando el valor de DEPTNO cambia en la tabla padre DEPT, actualizaciones en cascada correspondientes a las filas en la tabla hija EMP. Este ejemplo produce un error en tiempo de ejecucin.
CREATE OR REPLACE TRIGGER cascade_updates AFTER UPDATE OF deptno ON dept FOR EACH ROW BEGIN UPDATE emp SET emp.deptno = :new.deptno WHERE emp.deptno = :old.deptno; END; UPDATE dept SET deptno = 1 WHERE deptno = 10; ERROR at line 1: ORA-04091: table DEPT is mutating, trigger may not read or modify it

Un constraint de la tabla es una tabla que referencia las tablas, directa indirectamente, a travs de un constraint de integridad referencial. Cambiando datos en columnas no-claves del constraint de la tabla. Ejemplo: Guarde el total del salario por departamento en la columna especial TOTAL_SAL de la tabla DEPT.
CREATE OR REPLACE PROCEDURE increment_sal (v_deptno IN dept.deptno%TYPE, v_sal IN dept.deptno%TYPE) IS BEGIN UPDATE dept SET total_sal = NVL(total_sal, 0) + v_sal WHERE deptno = v_deptno; END increment_sal;

Desarrollando Triggers

Pgina 5-7

Desarrollo de Aplicaciones

ACorp Database

CREATE OR REPLACE TRIGGER compute_sal AFTER INSERT OR UPDATE OF sal OR DELETE ON emp FOR EACH ROW BEGIN IF DELETING THEN increment_sal (:old.deptno, -1 * :old.sal); ELSIF UPDATING THEN increment_sal (:new.deptno, :new.sal - :old.sal); ELSE increment_sal (:new.deptno, :new.sal); END IF; END; UPDATE emp SET sal = sal + 100 WHERE empno = 7782; 1 row updated.

Cambiando datos de una tabla que no esta enlazada a un trigger. Ejemplo:


CREATE OR REPLACE TRIGGER audit_emp_values AFTER DELETE OR INSERT OR UPDATE ON emp FOR EACH ROW BEGIN INSERT INTO audit_emp_values (user_name, timestap, empno, old_ename, new_ename, old_job, new_job, old_mgr, new_mgr, old_sal, new_sal) VALUES (USER, SYSDATE, :old.empno, :old. Ename, :new.ename, :old.job, :new.job, :old.mgr, :new.mgr, :old.sql, :new.sal); END; UPDATE emp SET job = 'PRESIDENT' WHERE ename = 'SCOTT'; 1 row updated.

Regla #2: No lea datos de una tabla deformada. Ejemplo: Intente leer datos de una tabla deformada. Restrinja el salario con un rango entre el mnimo y mximo valor existente. Este ejemplo produce un error.
CREATE OR REPLACE TRIGGER check_sal BEFORE INSERT OR UPDATE OF sal, job ON emp FOR EACH ROW WHEN (new.job <> 'PRESIDENT') DECLARE v_minsal emp.sal%type; v_maxsal emp.sal%type; BEGIN SELECT MIN (sal), MAX (sal) INTO v_minsal, v_maxsal FROM emp; IF :new.sal < v_minsal OR :new.sal > v_maxsal THEN RAISE_APPLIXATION_ERROR (-20505, . . .); END IF; END; UPDATE emp SET sal = 6000

Desarrollando Triggers

Pgina 5-8

Desarrollo de Aplicaciones

ACorp Database

WHERE ename = 'SMITH'; ERROR at line 1: ORA-04091: table EMP is mutating, trigger may not read or modify it

Una tabla deformada (mutating) es una tabla que es afectada, directamente indirectamente por el evento que activa el trigger. Ejemplo: Leyendo datos de tablas no deformadas.
CREATE OR REPLACE TRIGGER check_sal BEFORE INSERT OR UPDATE OF sal, job ON emp FOR EACH ROW WHEN (new.job <> 'PRESIDENT') DECLARE v_minsal sal_guide.minsal%type; v_maxsal sal_guide.minsal%type; BEGIN SELECT minsal, maxsal INTO v_minsal, v_maxsal FROM sal_guide WHERE job = :new.job; IF :new.sal < v_minsal OR :new.sal > v_maxsal THEN RAISE_APPLIXATION_ERROR (-20505, 'Salary '||TO_CHAR(:new.sal)|| ' is out of range for employee '||TO_CHAR (:new.empno)); END IF; END; INSERT INTO EMP (empno, ename, job, sal) VALUES (7999, 'JOE', 'CLERK', 1000);

Desarrollando triggers para manejar requerimientos de seguridad complejos Controlando seguridad de objetos con triggers. Ejemplo: Restrinja operaciones en la tabla EMP para ciertos das de la semana.
CREATE OR REPLACE TRIGGER secure_emp BEFORE DELETE OR INSERT OR UPDATE ON emp DECLARE v_dummy VARCHAR2(1); BEGIN IF ( TO_CHAR (SYSDATE, 'DY') IN ('SAT','SUN') ) OR ( TO_NUMBER (SYSDATE, 'HH24') NOT BETWEEN 8 AND 17 ) THEN RAISE_APPLICATION_ERROR (-20506, 'You may only change data during normal business hours'); END IF; SELECT 'X' INTO v_dummy FROM holiday WHERE holiday_date <> TRUNC (SYSDATE); EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20507, 'You may not change data on a holiday.'); END;

Operaciones de auditoria de datos con Oracle Auditando objetos en el servidor

Desarrollando Triggers

Pgina 5-9

Desarrollo de Aplicaciones

ACorp Database

Auditando recuperacin, manipulacin y sentencias de definicin de datos Escribiendo auditorias centralizadas para una tabla Generando registros de auditoria por sesin por accesos Capturando transacciones satisfactorias y no satisfactorias Habilitando y deshabilitando automticamente Ejemplo: Auditando usando las facilidades del servidor
AUDIT INSERT, UPDATE, DELETE ON emp BY ACCESS WHENEVER SUCCESSFUL;

Auditando valores actuales de datos con triggers Auditando slo sentencias de manipulacim de datos Escribiendo auditorias definidas por el usuario para una tabla Generando registros de auditoria para sentencias para cada registro Capturando transacciones satisfactorias Habilitando y deshabilitando automticamente Ejemplo: Registre todas las transacciones de datos satisfactorias sobre la tabla EMP
CREATE OR REPLACE TRIGGER audit_emp_values AFTER DELETE OR INSERT OR UPDATE ON emp FOR EACH ROW BEGIN IF audit_emp_package.g_reason IS NULL THEN RAISE_APPLICATION_ERROR (-20059, 'Specify a reason for the data operation with the '|| ' procedure SET_REASON before proceeding.'); ELSE INSERT INTO audit_emp_values (user_name, timestap, empno, old_ename, new_ename, old_job, new_job, old_mgr, new_mgr, old_sal, new_sal, comments) VALUES (USER, SYSDATE, :old.empno, :old.ename, :new.ename, :old.job, :new.job, :old.mgr, :new.mgr, :old.sql, :new.sal, audit_package.g_reason); END IF; END; CREATE OR REPLACE TRIGGER cleanup_audit_emp AFTER DELETE OR INSERT OR UPDATE ON emp BEGIN audit_emp_package.g_reason := NULL; END;

Aplicando triggers para forzar integridad de datos Incorpore constraints con las definiciones de tablas para proteger la integridad de datos. Forzando integridad de datos en el servidor Fuerza reglas estandar de integridad de datos: not null, not unique, primary key y foreign key Provee valores default constantes Fuerza constraints estticos Habilitando y deshabilitando automticamente Ejemplo: Asegurese que el salario sea mayor igual que $500

Desarrollando Triggers

Pgina 5-10

Desarrollo de Aplicaciones

ACorp Database

ALTER TABLE emp ADD CONSTRAINT ok_sal CHECK (sal >= 500);

Forzando integridad de datos con triggers Fuerza chequeos de integridad de datos no estandar Provee valores default variables Fuerza constraints dinmicos Habilitando y deshabilitando automticamente Ejemplo: Asegure que el salario nunca sae incrementado ms que el 10%
CREATE OR REPLACE TRIGGER check_sal BEFORE UPDATE OF sal ON emp FOR EACH ROW WHEN (new.sal < old.sal) OR (new.sal > old.sal * 1.1) BEGIN RAISE_APPLIXATION_ERROR (-20508, 'Do not decrease salary nor increase by more than 10%.'); END;

Aplicando triggers para forzar integridad referencial Incorpore constraints de integridad referencial con las definiciones de tablas para prevenir inconsistencia de datos. Forzando integridad referencial en el servidor Restrinja actualizaciones y eliminaciones Eliminaciones en cascada Habilitando y deshabilitando automticamente Ejemplo: Cuando un departamento es eliminado de la tabla DEPT, elimina en cascada los registros correspondientes en la tabla EMP
ALTER TABLE emp ADD CONSTRAINT fk_emp_deptno FOREIGN KEY (deptno) REFERENCES dept (deptno) ON DELETE CASCADE;

Forzando integridad referencial con triggers Actualizaciones en cascada Fije NULL en actualizaciones y eliminaciones Fije un valor default en actualizaciones y eliminaciones Forzando integridad referencial en sistemas distribuidos Habilitando y deshabilitando automticamente Ejemplo: Cuando el valor de la columna DEPTNO cambia en la tabla DEPT, se actualizan los registros correspondientes en la tabla EMP. Si existe integridad referencial entre las definiciones de tablas, este ejemplo viola la Regla #1.
CREATE OR REPLACE TRIGGER cascade_updates AFTER UPDATE OF deptno ON dept FOR EACH ROW BEGIN UPDATE emp SET emp.dpetno = :new.deptno WHERE emp.deptno = :old.deptno; END;

Desarrollando Triggers

Pgina 5-11

Desarrollo de Aplicaciones

ACorp Database

Aplicando triggers para replicar tablas Manteniendo copias de tablas automticamente con Snapshots, particularmente en nodos remotos. Copiando tablas con snapshots Copiando tablas asincronicamente, en intervalos definidos por el usuario Snapshots bajos mltiples tablas maestras Leyendo slo de Snapshots Proporcionando mejoras en la manipulacin de datos en la tabla maestra, particularmente si la red falla Ejemplo: En San Francisco, cree un snapshot de la tabla remota EMP en New York
CREATE SNAPSHOT emp_copy AS SELECT * FROM emp@ny;

Replicando tablas con triggers Copie tablas sincronizadamente, en tiempo real Usualmente las replicas base son sobre una tabla maestra Leyendo de replicas Desmejora la manipulacin de datos en la tabla maestra, particularmente si la red falla
CREATE OR REPLACE TRIGGER emp_replica BEFORE INSERT OR UPDATE ON emp FOR EACH ROW BEGIN IF INSERTING THEN IF :new.flag IS NULL THEN INSERT INTO emp@sf VALUES (:new.empno, :new.ename, . . . , 'B'); END IF; :new.flag := 'A'; ELSE IF :new.flag = :old.flag THEN UPDATE emp@sf SET ename = :new.ename, . . . Flag = :new.flag WHERE empno = :new.empno; IF :old.flag = 'A' THEN :new.flag := 'B'; ELSE :new.flag := 'A'; END IF; END IF; END IF; END;

Aplicando triggers para derivar datos Derive datos con el Servidor Calcule columnas asincronicamente, en intervalos definidos por el usuario Almacene valores derivados en tablas de la base de datos Modifique datos en un paso a la base de datos y calcule los datos en un esgundo paso

Desarrollando Triggers

Pgina 5-12

Desarrollo de Aplicaciones

ACorp Database

Ejemplo: Almacene el salario total para cada departamento en la columna TOTAL_SAL de la tabla DEPT.
UPDATE dept SET total_sal = (SELECT SUM(sal) FROM emp WHERE emp.deptno = dept.deptno);

Derive datos con triggers Calcule columnas sincronizadamente, en tiempo real Almacene valores en tablas de la base de datos en variables globales de packages Modificando y calculando datos en un solo paso Ejemplo: Almacene el salario total para cada departamento en la columna TOTAL_SAL de la tabla DEPT.
CREATE OR REPLACE PROCEDURE increment_sal (v_deptno IN dept.deptno%TYPE, v_sal IN dept.deptno%TYPE) IS BEGIN UPDATE dept SET total_sal = NVL(total_sal, 0) + v_sal WHERE deptno = v_deptno; END increment_sal; CREATE OR REPLACE TRIGGER compute_sal AFTER INSERT OR UPDATE OF sal OR DELETE ON emp FOR EACH ROW BEGIN IF DELETING THEN increment_sal (:old.deptno, -1 * :old.sal); ELSIF UPDATING THEN increment_sal (:new.deptno, :new.sal - :old.sal); ELSE increment_sal (:new.deptno, :new.sal); END IF; END;

Aplicando triggers para Log Implicitamente se ejecutan las operaciones que son transparentes para el usuario, como disparar automticamente un correo electrnico Modificar datos y ejecutar operaciones de dependencia en un solo paso

Desarrollando Triggers

Pgina 5-13

Вам также может понравиться