<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=DAI-C8-EC%3A_Triggers%2C_exercicis_proposats</id>
	<title>DAI-C8-EC: Triggers, exercicis proposats - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=DAI-C8-EC%3A_Triggers%2C_exercicis_proposats"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Triggers,_exercicis_proposats&amp;action=history"/>
	<updated>2026-08-30T11:16:25Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Triggers,_exercicis_proposats&amp;diff=38043&amp;oldid=prev</id>
		<title>Joan a 18:50, 12 gen 2011</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=DAI-C8-EC:_Triggers,_exercicis_proposats&amp;diff=38043&amp;oldid=prev"/>
		<updated>2011-01-12T18:50:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Objectius==&lt;br /&gt;
Unitat Didàctica: UD 5. Triggers&lt;br /&gt;
&lt;br /&gt;
Després de fer i entendre els exercicis comentats a classe, l'alumne ja està en disposició de programar triggers i resoldre exercicis concrets a partir d'un enunciat.&lt;br /&gt;
&lt;br /&gt;
==Desenvolupament==&lt;br /&gt;
Realitza els següents exercicis:&lt;br /&gt;
&lt;br /&gt;
1. Construir un disparador de base de datos que permita auditar las operaciones de inserción o borrado de datos que se realicen en la tabla emple según las siguientes especificaciones:&lt;br /&gt;
&lt;br /&gt;
* En primer lugar se creará desde SQL*Plus la tabla auditaremple con la columna col1 VARCHAR2(200).&lt;br /&gt;
* Cuando se produzca cualquier manipulación se insertará una fila en dicha tabla que contendrá:&lt;br /&gt;
* Fecha y hora&lt;br /&gt;
* Número de empleado&lt;br /&gt;
* Apellido&lt;br /&gt;
* La operación de actualización INSERCIÓN o BORRADO &lt;br /&gt;
&lt;br /&gt;
2. Escribir un trigger de base de datos un que permita auditar las modificaciones en la tabla empleados insertado en la tabla auditaremple los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
* Fecha y hora&lt;br /&gt;
* Número de empleado&lt;br /&gt;
* Apellido&lt;br /&gt;
* La operación de actualización: MODIFICACIÓN.&lt;br /&gt;
* El valor anterior y el valor nuevo de cada columna modificada. (solo las columnas modificadas) &lt;br /&gt;
&lt;br /&gt;
3. Escribir un disparador de base de datos que haga fallar cualquier operación de modificación del apellido o del número de un empleado, o que suponga una subida de sueldo superior al 10%.&lt;br /&gt;
&lt;br /&gt;
4. Suponiendo que disponemos de la vista&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE VIEW DEPARTAM AS&lt;br /&gt;
SELECT DEPART.DEPT_NO, DNOM, LOC, COUNT(EMP_NO) TOT_EMPLE  &lt;br /&gt;
FROM EMPLE, DEPART&lt;br /&gt;
WHERE EMPLE.DEPT_NO (+) = DEPART.DEPT_NO&lt;br /&gt;
GROUP BY DEPART.DEPT_NO, DNOM, LOC;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Construir un disparador que permita realizar operaciones de actualización en la tabla depart a partir de la vista dptos, de forma similar al ejemplo del trigger t_ges_emplead. Se contemplarán las siguientes operaciones:&lt;br /&gt;
&lt;br /&gt;
* Insertar departamento.&lt;br /&gt;
* Borrar departamento.&lt;br /&gt;
* Modificar la localidad de un departamento.&lt;br /&gt;
&lt;br /&gt;
===solucions===&lt;br /&gt;
&amp;lt;toggledisplay&amp;gt;&lt;br /&gt;
1. Construir un disparador de base de datos que permita auditar las operaciones de inserción o borrado de datos que se realicen en la tabla emple según las siguientes especificaciones:&lt;br /&gt;
&lt;br /&gt;
* En primer lugar se creará desde SQL*Plus la tabla auditaremple con la columna col1 VARCHAR2(200).&lt;br /&gt;
* Cuando se produzca cualquier manipulación se insertará una fila en dicha tabla que contendrá:&lt;br /&gt;
* Fecha y hora&lt;br /&gt;
* Número de empleado&lt;br /&gt;
* Apellido&lt;br /&gt;
* La operación de actualización INSERCIÓN o BORRADO &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE auditaremple (camp1 VARCHAR2(255));&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE TRIGGER auditar_act_emp&lt;br /&gt;
   BEFORE INSERT OR DELETE&lt;br /&gt;
   ON EMPLE&lt;br /&gt;
   FOR EACH ROW&lt;br /&gt;
BEGIN&lt;br /&gt;
   IF DELETING THEN&lt;br /&gt;
     INSERT INTO AUDITAREMPLE&lt;br /&gt;
 VALUES(TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*') &lt;br /&gt;
 || :OLD.EMP_NO|| '*' || :OLD.COGNOM || '* ELIMINAT ');&lt;br /&gt;
   ELSIF INSERTING THEN&lt;br /&gt;
     INSERT INTO AUDITAREMPLE&lt;br /&gt;
   	 VALUES(TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*') &lt;br /&gt;
 || :NEW.EMP_NO || '*' || :NEW.COGNOM ||'* INSERIT ');&lt;br /&gt;
   END IF;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Escribir un trigger de base de datos un que permita auditar las modificaciones en la tabla empleados insertado en la tabla auditaremple los siguientes datos:&lt;br /&gt;
&lt;br /&gt;
* Fecha y hora&lt;br /&gt;
* Número de empleado&lt;br /&gt;
* Apellido&lt;br /&gt;
* La operación de actualización: MODIFICACIÓN.&lt;br /&gt;
* El valor anterior y el valor nuevo de cada columna modificada. (solo las columnas modificadas) &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE TRIGGER audit_modif&lt;br /&gt;
  	BEFORE UPDATE  ON EMPLE&lt;br /&gt;
  	FOR EACH ROW &lt;br /&gt;
DECLARE&lt;br /&gt;
	v_cad_inser auditaremple.camp1%TYPE;&lt;br /&gt;
BEGIN&lt;br /&gt;
v_cad_inser := TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*') ||:OLD.EMP_NO ||'* MODIFICACIÓ *';&lt;br /&gt;
&lt;br /&gt;
    	IF UPDATING ('EMP_NO') THEN		&lt;br /&gt;
  	v_cad_inser := v_cad_inser ||:OLD.EMP_NO|| '*'|| :NEW.EMP_NO;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	IF UPDATING ('COGNOM') THEN		&lt;br /&gt;
    	v_cad_inser := v_cad_inser ||:OLD.COGNOM|| '*'||:NEW.COGNOM;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	IF UPDATING ('OFICI') THEN		&lt;br /&gt;
	   	v_cad_inser := v_cad_inser ||:OLD.OFICI|| '*'||:NEW.OFICI;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	IF UPDATING ('DIR') THEN		&lt;br /&gt;
	v_cad_inser := v_cad_inser ||:OLD.DIR|| '*'||:NEW.DIR;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	IF UPDATING ('DATA_ALT') THEN		&lt;br /&gt;
	v_cad_inser := v_cad_inser || :OLD.DATA_ALT||:NEW.DATA_ALT;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	IF UPDATING ('SALARI') THEN		&lt;br /&gt;
		v_cad_inser := v_cad_inser || :OLD.SALARI || '*'||:NEW.SALARI;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	IF UPDATING ('COMISSIO') THEN		&lt;br /&gt;
	    v_cad_inser := v_cad_inser ||:OLD.COMISSIO || '*'||:NEW.COMISSIO;&lt;br /&gt;
	END IF;&lt;br /&gt;
&lt;br /&gt;
	IF UPDATING ('DEPT_NO') THEN		&lt;br /&gt;
	    v_cad_inser := v_cad_inser ||:OLD.DEPT_NO|| '*'||:NEW.DEPT_NO;&lt;br /&gt;
	END IF;&lt;br /&gt;
	&lt;br /&gt;
	INSERT INTO AUDITAREMPLE VALUES(v_cad_inser);&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Escribir un disparador de base de datos que haga fallar cualquier operación de modificación del apellido o del número de un empleado, o que suponga una subida de sueldo superior al 10%.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE TRIGGER errada_modif&lt;br /&gt;
	BEFORE UPDATE OF cognom, emp_no, salari&lt;br /&gt;
	ON emple&lt;br /&gt;
	FOR EACH ROW&lt;br /&gt;
BEGIN&lt;br /&gt;
	IF UPDATING('emp_no') OR UPDATING('cognom') OR (UPDATING ('salari')  AND :new.salari&amp;gt;:old.salari*1.1) THEN&lt;br /&gt;
	   RAISE_APPLICATION_ERROR (-20001,'Err. Modificació no permesa');&lt;br /&gt;
	END IF;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&lt;br /&gt;
/* NOTA: teniendo en cuenta los eventos que producirán el disparo del trigger la condición se puede resumir:  &lt;br /&gt;
IF NOT UPDATING ('salario') OR :new.salario &amp;gt; :old.salario*1.1&lt;br /&gt;
THEN ...&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4. Suponiendo que disponemos de la vista&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE VIEW DEPARTAM AS&lt;br /&gt;
SELECT DEPART.DEPT_NO, DNOM, LOC, COUNT(EMP_NO) TOT_EMPLE  &lt;br /&gt;
FROM EMPLE, DEPART&lt;br /&gt;
WHERE EMPLE.DEPT_NO (+) = DEPART.DEPT_NO&lt;br /&gt;
GROUP BY DEPART.DEPT_NO, DNOM, LOC;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Construir un disparador que permita realizar operaciones de actualización en la tabla depart a partir de la vista dptos, de forma similar al ejemplo del trigger t_ges_emplead. Se contemplarán las siguientes operaciones:&lt;br /&gt;
&lt;br /&gt;
* Insertar departamento.&lt;br /&gt;
* Borrar departamento.&lt;br /&gt;
* Modificar la localidad de un departamento. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE TRIGGER ges_depart&lt;br /&gt;
	INSTEAD OF DELETE OR INSERT OR UPDATE&lt;br /&gt;
	ON DEPARTAM&lt;br /&gt;
	FOR EACH ROW&lt;br /&gt;
BEGIN&lt;br /&gt;
	IF DELETING THEN&lt;br /&gt;
	  	DELETE FROM depart WHERE dept_no = :old.dept_no;&lt;br /&gt;
	ELSIF INSERTING THEN&lt;br /&gt;
		INSERT INTO depart VALUES(:new.dept_no, :new.dnom, :new.loc);&lt;br /&gt;
	ELSIF UPDATING('loc') THEN&lt;br /&gt;
		UPDATE depart SET loc = :new.loc WHERE dept_no = :old.dept_no;&lt;br /&gt;
	ELSE&lt;br /&gt;
	   RAISE_APPLICATION_ERROR (-20001,'Error en la actualizació');&lt;br /&gt;
	END IF;&lt;br /&gt;
END;&lt;br /&gt;
/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/toggledisplay&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Entrega==&lt;br /&gt;
* entregar els fitxers DAI2AXX_script_NA8.sql i DAI2AXX_NA8.log. Si has treballat per parelles: DAI2AXXXX_script_NA8.sql i DAI2AXXXX_NA8.log, indicant a dins clarament el nom i el número de classe (comentaris amb REM). Exercici individual o per parelles.&lt;br /&gt;
* entregar al Moodle: http://192.168.0.15/moodle&lt;br /&gt;
&lt;br /&gt;
==Recursos==&lt;br /&gt;
En el Moodle també pots descarregar el codi per crear les taules, i el codi que s'ha vist a classe.&lt;br /&gt;
&lt;br /&gt;
==Durarda==&lt;br /&gt;
2 hores&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, octubre 2009&lt;br /&gt;
[[Categoria: IES Jaume Balmes]]&lt;br /&gt;
[[Categoria: Pràctiques DAI-C8-EC]]&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>