La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.

Presentaciones similares


Presentación del tema: "6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega."— Transcripción de la presentación:

1 6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega

2 1-2 Definición Un trigger o disparador es una unidad PL/SQL que es almacenada en la base de datos y ejecutada (disparada) en respuesta a un evento especificado y asociado a:Un trigger o disparador es una unidad PL/SQL que es almacenada en la base de datos y ejecutada (disparada) en respuesta a un evento especificado y asociado a: Una tabla Una vista Un esquema La base de datos Un trigger o disparador es una unidad PL/SQL que es almacenada en la base de datos y ejecutada (disparada) en respuesta a un evento especificado y asociado a:Un trigger o disparador es una unidad PL/SQL que es almacenada en la base de datos y ejecutada (disparada) en respuesta a un evento especificado y asociado a: Una tabla Una vista Un esquema La base de datos

3 1-3 Tipos de eventos Sentencia DML (DELETE, INSERT, UPDATE)Sentencia DML (DELETE, INSERT, UPDATE) Sentencia DDL (CREATE, ALTER, DROP)Sentencia DDL (CREATE, ALTER, DROP) Operación de Base de datos (SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN). Llamado Trigger de sistemaOperación de Base de datos (SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN). Llamado Trigger de sistema Un Trigger INSTEAD OF es un trigger DML que se define sobre una vista.Un Trigger INSTEAD OF es un trigger DML que se define sobre una vista. Sentencia DML (DELETE, INSERT, UPDATE)Sentencia DML (DELETE, INSERT, UPDATE) Sentencia DDL (CREATE, ALTER, DROP)Sentencia DDL (CREATE, ALTER, DROP) Operación de Base de datos (SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN). Llamado Trigger de sistemaOperación de Base de datos (SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN). Llamado Trigger de sistema Un Trigger INSTEAD OF es un trigger DML que se define sobre una vista.Un Trigger INSTEAD OF es un trigger DML que se define sobre una vista.

4 1-4 Estados de un trigger Un trigger puede tener uno de los siguientes estados: Habilitado: Se ejecuta el cuerpo si la sentencia de disparo existe y la condición de disparo se evalua en VERDADERO.Habilitado: Se ejecuta el cuerpo si la sentencia de disparo existe y la condición de disparo se evalua en VERDADERO. Deshabilitado: No se ejecuta el cuerpo del trigger aún si existe la sentencia de disparo y la condición de disparo es VERDADERADeshabilitado: No se ejecuta el cuerpo del trigger aún si existe la sentencia de disparo y la condición de disparo es VERDADERA Por defecto el trigger se crea HABILITADO pero es posible crearlo de en estado DESHABILITADO (DISABLE en la sentencia CREATE TRIGGER).Por defecto el trigger se crea HABILITADO pero es posible crearlo de en estado DESHABILITADO (DISABLE en la sentencia CREATE TRIGGER). Un trigger puede tener uno de los siguientes estados: Habilitado: Se ejecuta el cuerpo si la sentencia de disparo existe y la condición de disparo se evalua en VERDADERO.Habilitado: Se ejecuta el cuerpo si la sentencia de disparo existe y la condición de disparo se evalua en VERDADERO. Deshabilitado: No se ejecuta el cuerpo del trigger aún si existe la sentencia de disparo y la condición de disparo es VERDADERADeshabilitado: No se ejecuta el cuerpo del trigger aún si existe la sentencia de disparo y la condición de disparo es VERDADERA Por defecto el trigger se crea HABILITADO pero es posible crearlo de en estado DESHABILITADO (DISABLE en la sentencia CREATE TRIGGER).Por defecto el trigger se crea HABILITADO pero es posible crearlo de en estado DESHABILITADO (DISABLE en la sentencia CREATE TRIGGER).

5 1-5 Guía para diseño de triggers No crear triggers para duplicar funcionalidades de la base de datos. (Ej. Constraints en una tabla)No crear triggers para duplicar funcionalidades de la base de datos. (Ej. Constraints en una tabla) Es recomendable usar trigger para controlar la integridad referencial cuando tablas padre e hija están en diferentes nodos de una base de datos distribuidaEs recomendable usar trigger para controlar la integridad referencial cuando tablas padre e hija están en diferentes nodos de una base de datos distribuida Limitar el tamaño de los triggers. No puede exceder 32K. Si contiene demasiada lógica puede crear un procedimiento almacenado e invocarlo desde el trigger.Limitar el tamaño de los triggers. No puede exceder 32K. Si contiene demasiada lógica puede crear un procedimiento almacenado e invocarlo desde el trigger. No crear triggers recursivos.No crear triggers recursivos. Ej. Crear un trigger AFTER UPDATE en una tabla y en el cuerpo del trigger hacer un UPDATE sobre esa tabla No crear triggers para duplicar funcionalidades de la base de datos. (Ej. Constraints en una tabla)No crear triggers para duplicar funcionalidades de la base de datos. (Ej. Constraints en una tabla) Es recomendable usar trigger para controlar la integridad referencial cuando tablas padre e hija están en diferentes nodos de una base de datos distribuidaEs recomendable usar trigger para controlar la integridad referencial cuando tablas padre e hija están en diferentes nodos de una base de datos distribuida Limitar el tamaño de los triggers. No puede exceder 32K. Si contiene demasiada lógica puede crear un procedimiento almacenado e invocarlo desde el trigger.Limitar el tamaño de los triggers. No puede exceder 32K. Si contiene demasiada lógica puede crear un procedimiento almacenado e invocarlo desde el trigger. No crear triggers recursivos.No crear triggers recursivos. Ej. Crear un trigger AFTER UPDATE en una tabla y en el cuerpo del trigger hacer un UPDATE sobre esa tabla

6 1-6 Privilegios requeridos Para crear un trigger en su esquema: Privilegio CREATE TRIGGERPrivilegio CREATE TRIGGER Además que una de las siguientes condiciones se cumpla: Es el propietario de la tabla especificada en la sentencia Tiene el privilegio ALTER para la tabla especificada en la sentencia Tiene el privilegio ALTER ANY TABLE Para crear un trigger en su esquema: Privilegio CREATE TRIGGERPrivilegio CREATE TRIGGER Además que una de las siguientes condiciones se cumpla: Es el propietario de la tabla especificada en la sentencia Tiene el privilegio ALTER para la tabla especificada en la sentencia Tiene el privilegio ALTER ANY TABLE

7 1-7 Privilegios requeridos Para crear un trigger en otro esquema o referenciar una tabla in otro esquema: Tener el privilegio CREATE ANY TRIGGERTener el privilegio CREATE ANY TRIGGER Tener el privilegio EXECUTE sobre los subprogramas o paquetes referenciados.Tener el privilegio EXECUTE sobre los subprogramas o paquetes referenciados. Para crear un trigger sobre la base de datos debe tener el privilegio ADMINISTER DATABASE TRIGGER. Para crear un trigger en otro esquema o referenciar una tabla in otro esquema: Tener el privilegio CREATE ANY TRIGGERTener el privilegio CREATE ANY TRIGGER Tener el privilegio EXECUTE sobre los subprogramas o paquetes referenciados.Tener el privilegio EXECUTE sobre los subprogramas o paquetes referenciados. Para crear un trigger sobre la base de datos debe tener el privilegio ADMINISTER DATABASE TRIGGER.

8 1-8 Creación de Triggers Crear disparadores de tipo fila o sentencia DML mediante: CREATE [OR REPLACE] TRIGGER trigger_name timing event1 [OR event2 OR event3] ON object_name [[REFERENCING OLD AS old | NEW AS new] FOR EACH ROW [WHEN (condition)]] trigger_body

9 1-9 Tipos de disparadores DML El tipo de disparador determina si el cuerpo se ejecuta para cada fila o sólo una vez para la sentencia disparadora. Un disparador de sentencia: Se ejecuta una vez para el evento disparador Es el tipo por defecto de disparador Se arranca una vez incluso aunque no haya filas afectadas en absoluto El tipo de disparador determina si el cuerpo se ejecuta para cada fila o sólo una vez para la sentencia disparadora. Un disparador de sentencia: Se ejecuta una vez para el evento disparador Es el tipo por defecto de disparador Se arranca una vez incluso aunque no haya filas afectadas en absoluto

10 1-10 Tipos de disparadores DML Un disparador de fila: Se ejecuta una vez para cada fila afectada por el evento disparador No se ejecuta si el evento disparador no afecta a ninguna fila Se indica mediante la especificación de la cláusula FOR EACH ROW Un disparador de fila: Se ejecuta una vez para cada fila afectada por el evento disparador No se ejecuta si el evento disparador no afecta a ninguna fila Se indica mediante la especificación de la cláusula FOR EACH ROW

11 1-11 Temporización de los disparadores ¿Cuándo se debe arrancar el disparador? BEFORE: Ejecutar el cuerpo del disparador antes del evento DML disparador en una tabla. AFTER: Ejecutar el cuerpo del disparador después del evento DML disparador en una tabla. INSTEAD OF: Ejecutar el cuerpo del disparador en lugar de la sentencia disparadora. Se utiliza para vistas que no se pueden modificar de otra forma. ¿Cuándo se debe arrancar el disparador? BEFORE: Ejecutar el cuerpo del disparador antes del evento DML disparador en una tabla. AFTER: Ejecutar el cuerpo del disparador después del evento DML disparador en una tabla. INSTEAD OF: Ejecutar el cuerpo del disparador en lugar de la sentencia disparadora. Se utiliza para vistas que no se pueden modificar de otra forma.

12 1-12 Tipos de evento y cuerpo Un evento del disparador determina qué sentencia DML hace que se ejecute el disparador Los tipos son: INSERT UPDATE [OF column] DELETE El cuerpo del disparador: Determina qué acción se realiza Es un bloque PL/SQL o una llamada a un procedimiento Un evento del disparador determina qué sentencia DML hace que se ejecute el disparador Los tipos son: INSERT UPDATE [OF column] DELETE El cuerpo del disparador: Determina qué acción se realiza Es un bloque PL/SQL o una llamada a un procedimiento

13 1-13 Creación de un disparador de sentencia Ejemplo.Ejemplo. CREATE OR REPLACE TRIGGER tr_horario_adicion_est BEFORE INSERT ON estudiante BEGIN IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND '18:00') THEN RAISE_APPLICATION_ERROR(-20500, ‘Solo puede agregar estudiantes en horas laborales'); END IF; END; CREATE OR REPLACE TRIGGER tr_horario_adicion_est BEFORE INSERT ON estudiante BEGIN IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') NOT BETWEEN '08:00' AND '18:00') THEN RAISE_APPLICATION_ERROR(-20500, ‘Solo puede agregar estudiantes en horas laborales'); END IF; END;

14 1-14 Creación de un disparador de fila Ejemplo.Ejemplo. CREATE OR REPLACE TRIGGER restriccion_salario BEFORE INSERT OR UPDATE OF salario ON profesor FOR EACH ROW BEGIN IF :NEW.salario < 1500000 THEN RAISE_APPLICATION_ERROR (-20202, ‘Los profesores no pueden ganar menos de $1’500,000.'); END IF; END; CREATE OR REPLACE TRIGGER restriccion_salario BEFORE INSERT OR UPDATE OF salario ON profesor FOR EACH ROW BEGIN IF :NEW.salario < 1500000 THEN RAISE_APPLICATION_ERROR (-20202, ‘Los profesores no pueden ganar menos de $1’500,000.'); END IF; END;

15 1-15 Bibliografía Oracle® Database PL/SQL Language Reference -11g Release 1 (11.1) - 2009Oracle® Database PL/SQL Language Reference -11g Release 1 (11.1) - 2009


Descargar ppt "6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega."

Presentaciones similares


Anuncios Google