116 - Disparador (eliminar)


Primer problema:

Un comercio almacena los datos de los artículos que tiene para la venta en una tabla denominada "articulos". En otra tabla denominada "ventas" almacena el código de cada artículo, la cantidad que se vende y la fecha.

1- Elimine las tablas:

 drop table ventas;
 drop table articulos;

2- Cree las tablas con las siguientes estructuras:

 create table articulos(
  codigo number(4) not null,
  descripcion varchar2(40),
  precio number (6,2),
  stock number(4),
  constraint PK_articulos_codigo
   primary key (codigo)
 );

 create table ventas(
  codigo number(4),
  cantidad number(4),
  fecha date,
  constraint FK_ventas_articulos
   foreign key (codigo)
   references articulos(codigo)
);

3- Cree una secuencia llamada "sec_codigoart", estableciendo que comience en 1, sus valores estén entre 1 y 9999 y se incrementen en 1. Antes elimínela por si existe

4- Active el paquete para permitir mostrar salida en pantalla

5- Cree un trigger que coloque el siguiente valor de una secuencia para el código de "articulos" cada vez que se ingrese un nuevo artículo
Podemos ingresar un nuevo registro en "articulos" sin incluir el código porque lo ingresará el disparador luego de calcularlo. Si al ingresar un registro en "articulos" incluimos un valor para código, será ignorado y reemplazado por el valor calculado por el disparador.

6- Ingrese algunos registros en "articulos" sin incluir el código:

 insert into articulos (descripcion, precio, stock) values ('cuaderno rayado 24h',4.5,100);
 insert into articulos (descripcion, precio, stock) values ('cuaderno liso 12h',3.5,150);
 insert into articulos (descripcion, precio, stock) values ('lapices color x6',8.4,60);

7- Recupere todos los artículos para ver cómo se almacenó el código

8- Ingrese algunos registros en "articulos" incluyendo el código:

 insert into articulos values(160,'regla 20cm.',6.5,40);
 insert into articulos values(173,'compas metal',14,35);
 insert into articulos values(234,'goma lapiz',0.95,200);

9- Recupere todos los artículos para ver cómo se almacenó los códigos
Ignora los códigos especificados ingresando el siguiente de la secuencia.

10- Cuando se ingresa un registro en "ventas", se debe:

- controlar que el código del artículo exista en "articulos" (lo hacemos con la restricción "foreign key" establecida en "ventas");

- controlar que exista stock, lo cual no puede controlarse con una restricción "foreign key" porque el campo "stock" no es clave primaria en la tabla "articulos"; cree un trigger. Si existe stock, debe disminuirse en "articulos".

Cree un trigger a nivel de fila sobre la tabla "ventas" para el evento se inserción. Cada vez que se realiza un "insert" sobre "ventas", el disparador se ejecuta. El disparador controla que la cantidad que se intenta vender sea menor o igual al stock del articulo y actualiza el campo "stock" de "articulos", restando al valor anterior la cantidad vendida. Si la cantidad supera el stock, debe producirse un error, revertirse la acción y mostrar un mensaje

11- Ingrese un registro en "ventas" cuyo código no exista en "articulos"
Aparece un mensaje de error, porque el código no existe. El trigger se ejecutó.

12- Verifique que no se ha agregado ningún registro en "ventas"

13- Ingrese un registro en "ventas" cuyo código exista en "articulos" y del cual haya suficiente stock
Note que el trigger se disparó, aparece el texto "tr_insertar_ventas activado".

14- Verifique que el trigger se disparó consultando la tabla "articulos" (debe haberse disminuido el stock) y se agregó un registro en "ventas"

15- Ingrese un registro en "ventas" cuyo código exista en "articulos" y del cual NO haya suficiente stock
Aparece el mensaje mensaje de error 20001 y el texto que muestra que se disparó el trigger.

16- Verifique que NO se ha disminuido el stock en "articulos" ni se ha agregado un registro en "ventas"

17- El comercio quiere que se realicen las ventas de lunes a viernes de 8 a 18 hs. Reemplace el trigger creado anteriormente "tr_insertar_ventas" para que No permita que se realicen ventas fuera de los días y horarios especificados y muestre un mensaje de error

18- Ingrese un registro en "ventas", un día y horario permitido, si es necesario, modifique la fecha y la hora del sistema

19- Verifique que se ha agregado un registro en "ventas" y se ha disminuido el stock en "articulos"

20- Ingrese un registro en "ventas", un día permitido fuera del horario permitido (si es necesario, modifique la fecha y hora del sistema)
Se muestra un mensaje de error.

21- Ingrese un registro en "ventas", un día sábado a las 15 hs.

22- El comercio quiere que los registros de la tabla "articulos" puedan ser ingresados, modificados y/o eliminados únicamente los sábados de 8 a 12 hs. Cree un trigger "tr_articulos" que No permita que se realicen inserciones, actualizaciones ni eliminaciones en "articulos" fuera del horario especificado los días sábados, mostrando un mensaje de error. Recuerde que al ingresar un registro en "ventas", se actualiza el "stock" en "articulos"; el trigger debe permitir las actualizaciones del campo "stock" en "articulos" de lunes a viernes de 8 a 18 hs. (horario de ventas)

23- Ingrese un nuevo artículo un sábado a las 9 AM
Note que se activan 2 triggers.

24- Elimine un artículo, un sábado a las 16 hs.
Mensaje de error.

25- Actualice el precio de un artículo, un domingo

26- Actualice el precio de un artículo, un lunes en horario de ventas
Mensaje de error.

27- Ingrese un registro en "ventas" que modifique el "stock" en "articulos", un martes entre las 8 y 18 hs.
Note que se activan 2 triggers.

28- Consulte el diccionario "user_triggers" para ver cuántos trigger están asociados a "articulos" y a "ventas" (3 triggers)

29- Elimine el trigger asociado a "ventas"

30- Elimine las tablas "ventas" y "articulos"

31- Consulte el diccionario "user_triggers" para verificar que al eliminar la tabla "articulos" se han eliminado todos los triggers asociados a ella

Ver solución

 drop table ventas;
 drop table articulos;

 create table articulos(
  codigo number(4) not null,
  descripcion varchar2(40),
  precio number (6,2),
  stock number(4),
  constraint PK_articulos_codigo
   primary key (codigo)
 );

 create table ventas(
  codigo number(4),
  cantidad number(4),
  fecha date,
  constraint FK_ventas_articulos
   foreign key (codigo)
   references articulos(codigo)
);

 drop sequence sec_codigoart;
 create sequence sec_codigoart
  start with 1
  increment by 1;

 set serveroutputon;
 execute dbms_output.enable (20000);

 create or replace trigger tr_insertar_codigo_articulos
  before insert
  on articulos
  for each row
 begin
  select sec_codigoart.nextval into :new.codigo from dual;
  dbms_output.put_line('"tr_insertar_codigo_articulos" activado');
 end tr_insertar_codigo_articulos;
 /

 insert into articulos (descripcion, precio, stock) values ('cuaderno rayado 24h',4.5,100);
 insert into articulos (descripcion, precio, stock) values ('cuaderno liso 12h',3.5,150);
 insert into articulos (descripcion, precio, stock) values ('lapices color x6',8.4,60);

 select *from articulos;

 insert into articulos values(160,'regla 20cm.',6.5,40);
 insert into articulos values(173,'compas metal',14,35);
 insert into articulos values(234,'goma lapiz',0.95,200);

 select *from articulos;

 create or replace trigger tr_insertar_ventas
  before insert
  on ventas
  for each row
 declare
   canti number:=null;
 begin
  dbms_output.put_line('"tr_insertar_ventas" activado');
  select stock into canti from articulos where codigo=:new.codigo;
   if :new.cantidad>canti then
    raise_application_error(-20001,'Sólo hay '|| to_char(canti)||' en stock');
   else
     update articulos set stock=stock-:new.cantidad where codigo=:new.codigo; 
   end if; 
 end tr_insertar_ventas;
 /

  insert into ventas values(200,10,sysdate);

 select *from ventas;

  insert into ventas values(2,10,sysdate);

 select *from articulos;
 select *from ventas;

  insert into ventas values(2,300,sysdate);

 select *from articulos;
 select *from ventas;

 create or replace trigger tr_insertar_ventas
  before insert
  on ventas
  for each row
 declare
   canti number:=null;
 begin
  dbms_output.put_line('"tr_insertar_ventas" activado');
  if (to_char(sysdate, 'DY','nls_date_language=SPANISH') in ('LUN','MAR','MIE','JUE','VIE')) then 
    if(to_number(to_char(sysdate, 'HH24')) between 8 and 17) then
      select stock into canti from articulos where codigo=:new.codigo;
      if :new.cantidad>canti then
        raise_application_error(-20001,'Sólo hay '|| to_char(canti)||' en stock');
      else
        update articulos set stock=stock-:new.cantidad where codigo=:new.codigo; 
      end if;
    else--hora
      raise_application_error(-20002,'Solo se pueden realizar ventas entre las 8 y 18 hs.');
    end if;--hora
  else
    raise_application_error(-20003,'Solo se pueden realizar ventas de lunes a viernes.');
  end if; --dia
 end tr_insertar_ventas;
 /

 insert into ventas values(3,20,sysdate);

 select *from articulos;
 select *from ventas;

 insert into ventas values(3,20,sysdate);

 insert into ventas values(3,20,sysdate);

 create or replace trigger tr_articulos
  before insert or update or delete
  on articulos
  for each row
 begin
  dbms_output.put_line('"tr_update_articulos" activado');
  if (to_char(sysdate, 'DY','nls_date_language=SPANISH')='SÁB')then
     if(to_number(to_char(sysdate, 'HH24')) not between 8 and 11) then
       raise_application_error(-20004,'Esta tarea en sábado sólo de 8 a 12 hs.');
     end if;
  else
    if(to_char(sysdate, 'DY','nls_date_language=SPANISH')='DOM')then
      raise_application_error(-20005,'Esta tarea no en domingo.');
    else 
      if updating ('stock') then
        if  (to_number(to_char(sysdate, 'HH24')) not between 8 and 17) then
           raise_application_error(-20006,'Esta tarea de LUN a VIE de 8 a 18 hs. o SAB de 8 a 12 hs.');
        end if;
      else
         raise_application_error(-20007,'Esta tarea solo SAB de 8 a 12 hs.');
      end if;--stock
    end if;--domingo
  end if;--sab
 end tr_articulos;
 /

insert into articulos values(234,'cartulina',0.95,100);

 delete from articulos where codigo=1;

 update articulos set precio=precio+precio*0.1 where codigo=5;

 update articulos set precio=precio+precio*0.1 where codigo=5;

 insert into ventas values(3,5,sysdate);

select table_name, trigger_name, triggering_event from user_triggers
  where table_name ='ARTICULOS' or table_name='VENTAS';

 drop trigger tr_insertar_ventas;

 drop table ventas;
 drop table articulos;

select * from user_triggers where trigger_name='TR_ARTICULOS' or trigger_name='TR_INSERTAR_CODIGO_ARTICULOS'; 

 

Segundo problema:

Una empresa almacena los datos de sus empleados en una tabla denominada "empleados" y en otra tabla llamada "secciones", el código de la sección y el sueldo máximo de cada una de ellas.

1- Elimine las tablas:

 drop table empleados;
 drop table secciones;

2- Cree las tablas, con las siguientes estructuras:

 create table secciones(
  codigo number(2),
  nombre varchar2(30),
  sueldomaximo number(8,2),
  constraint PK_secciones primary key(codigo)
 );

 create table empleados(
  documento char(8) not null,
  nombre varchar2(30) not null,
  domicilio varchar2(30),
  codigoseccion number(2) not null,
  sueldo number(8,2),
  constraint PK_empleados primary key(documento),
  constraint FK_empleados_seccion
   foreign key (codigoseccion)
   references secciones(codigo)
 );

3- Ingrese algunos registros en ambas tablas:

 insert into secciones values(1,'Administracion',1500);
 insert into secciones values(2,'Sistemas',2000);
 insert into secciones values(3,'Secretaria',1000);

 insert into empleados values('22222222','Ana Acosta','Avellaneda 88',1,1100);
 insert into empleados values('23333333','Bernardo Bustos','Bulnes 345',1,1200);
 insert into empleados values('24444444','Carlos Caseres','Colon 674',2,1800);
 insert into empleados values('25555555','Diana Duarte','Colon 873',3,1000);

4- Active el paquete necesario para mostrar mensaje por pantalla:

 set serveroutput on;
 execute dbms_output.enable (20000);

5- En cada disparador que cree próximamente muestre un mensaje por pantalla que indique su nombre.

6- Cree un disparador para que se ejecute cada vez que una instrucción "insert" ingrese datos en "empleados"; el mismo debe verificar que el sueldo del empleado no sea mayor al sueldo máximo establecido para la sección, si lo es, debe mostrar un mensaje indicando tal situación y deshacer la transacción

7- Ingrese un nuevo registro en "empleados" cuyo sueldo sea menor o igual al establecido para la sección:

 insert into empleados values('26666666','Federico Fuentes','Francia 938',2,1000);

El disparador se ejecutó, un texto en pantalla muestra su nombre.

8- Verifique que el disparador se ejecutó consultando la tabla "empleados"

9- Intente ingresar un nuevo registro en "empleados" cuyo sueldo sea mayor al establecido para la sección
El disparador se ejecutó mostrando un mensaje de error y la transacción se deshizo.

10- Verifique que el registro no se agregó en "empleados"

11- Intente ingresar un empleado con código de sección inexistente
Aparece un mensaje de error porque se viola la restricción "foreign key"; el trigger se ejecutó, aparece el mensaje de texto que lo indica.

12- Cree un disparador para que se ejecute cada vez que una instrucción "update" aumente el sueldo de "empleados"; el mismo debe verificar que el sueldo del empleado no supere al sueldo máximo establecido para la sección, si lo es, debe mostrar un mensaje indicando tal situación y deshacer la transacción

13- Modifique el sueldo de un empleado, debe ser menor o igual al establecido para la sección
El trigger se disparó.

14- Verifique que el disparador se ejecutó consultando la tabla "empleados"

15- Intente actualizar el sueldo de un empleado a un valor mayor al establecido para la sección
El disparador se ejecutó mostrando un mensaje de error y la transacción se deshizo.

16- Verifique que el registro no se modificó en "empleados"

17- Disminuya el sueldo de un empleado
El trigger no se disparo (no se mostró el texto con su nombre) porque se estableció en la condición "when" que el sueldo nuevo fuera mayor al anterior.

18- Verifique que el registro se modificó en "empleados"

19- Modifique el código de sección del empleado cuyo documento es "22222222" a "3"
Note que el cambio se realizó, y ahora existe un empleado de la sección "Secretaria" con sueldo "1350" cuando el máximo para esa sección es de "1000". Debe crear el trigger "tr_empleados_update_seccion", que se dispare cada vez que se modifique la seccion de un empleado y verifique que el sueldo no supere el máximo de la nueva sección, si lo supera, la transacción debe deshacerse

20- Modifique el código de sección del empleado cuyo documento es "22222222" a "1"
El trigger se disparó, como el sueldo no supera el máximo permitido para la nueva sección, el cambio se realizó.

21- Verifique que el cambio se realizó

22- Modifique el código de sección del empleado cuyo documento es "23333333" a "3"
El trigger se disparó y mostró el mensaje de error, la transacción se deshizo.

23- Verifique que el cambio no se realizó

24- Modifique el sueldo del empleado cuyo documento es "23333333" a "1000" y el código de sección a "3"
El trigger se disparó.

25- Verifique que el cambio se realizó

26- Si modificamos el sueldo máximo de una sección de "secciones", disminuyéndolo, pueden quedar en "empleados" valores de sueldos superiores al permitido para la sección. Para evitar esto debe crear un disparador sobre "secciones" que se active cuando se disminuya el campo "sueldomaximo" y modifique el sueldo (al máximo permitido para la sección) de todos los empleados de esa sección cuyos sueldos superen el nuevo máximo establecido

27- Modifique el sueldo máximo para la sección "Administracion" a 2000, es decir, auméntelo
Note que el trigger No se disparó, porque el trigger tiene una condición "when" que especifica que se active unicamente cuando el nuevo sueldo maximo sea menor al anterior.

28- Verifique que el sueldo máximo de "Administracion" se ha modificado

29- Modifique el sueldo máximo para la sección "Administracion" a 1800, es decir, disminúyalo
Note que el trigger se disparó, cumple con la condición "when". Pero, como no hay en "empleados", sueldos de tal sección que superen tal valor, no se han modificado registros en "empleados".

30- Verifique que se modificó el sueldo máximo en "secciones" pero ningún registro en "empleados"

31- Modifique el sueldo máximo para la sección "Administracion" a 1200, es decir, disminúyalo
Note que el trigger se disparó, cumple con la condición "when". Como hay en "empleados" un sueldo de 1350, de "Administracion", es decir supera el nuevo "sueldomaximo" que se intenta establecer, se modifica tal registro en "empleados".

32- Verifique que se modificó el sueldo máximo en "secciones" y un registro en "empleados"

33- Cree un trigger que no permita que se modifique el código de "secciones"

34- Intente modificar el código de una sección de "secciones"
Note que el trigger se disparó y muestra el mensaje de error. El código no se modificó. Verifíquelo

35- Actualice en una misma sentencia "update", el sueldo a "1800" y el codigo de sección a "2" del empleado cuyo documento es "22222222"
Note que se activan 2 triggers.

36- Cree un trigger a nivel de sentencia sobre "empleados", que muestre un mensaje de error para evitar que se actualice el campo "documento"

37- Consulte el diccionario "user_triggers" para ver cuántos trigger están asociados a "empleados" y a "secciones"

38- Elimine los 2 triggers asociados a la tabla "secciones"

39- Consulte el diccionario "user_triggers" para verificar que "secciones" ya no tiene disparadores asociados a ella

40- Cree un trigger sobre "secciones", para el evento de actualización que realice todas las acciones que ejecutaban los 2 triggers que "secciones" tenía asociados anteriormente; es decir:

- si se actualiza un sueldo máximo, modificar el sueldo, al máximo permitido, a todos los empleados (de la sección modificada) cuyos sueldos superen el nuevo sueldo máximo;

- definir un mensaje de error si se intenta actualizar un código se sección.

41- Probarlo. Disminuir el sueldo máximo de una sección que no supere el sueldo de ningun empleado:
Se activó el trigger de actualizacion de secciones pero ningún registro de "empleados" fue modificado.

42- Disminuir el sueldo máximo de una sección de modo que supere el sueldo de algún empleado
Se activó el trigger de actualizacion de secciones y 2 registros de "empleados" fueron modificados.

43- Intente modificar un código de sección
Mensaje de error.

44- Consulte el diccionario "user_triggers" para ver cuántos triggers están asociados a las tablas "secciones" y "empleados"

45- Elimine la tabla "empleados"

46- Consulte el diccionario "user_triggers" para verificar que al borrar la tabla "empleados" se eliminaron todos los disparadores asociados a ella

47- Elimine la tabla "secciones" y consulte "user_triggers" para verificar que al borrar la tabla "secciones" se eliminaron todos los desencadenadores asociados a ella


Ver solución
 drop table empleados;
 drop table secciones;

 create table secciones(
  codigo number(2),
  nombre varchar2(30),
  sueldomaximo number(8,2),
  constraint PK_secciones primary key(codigo)
 );

 create table empleados(
  documento char(8) not null,
  nombre varchar2(30) not null,
  domicilio varchar2(30),
  codigoseccion number(2) not null,
  sueldo number(8,2),
  constraint PK_empleados primary key(documento),
  constraint FK_empleados_seccion
   foreign key (codigoseccion)
   references secciones(codigo)
 );

 insert into secciones values(1,'Administracion',1500);
 insert into secciones values(2,'Sistemas',2000);
 insert into secciones values(3,'Secretaria',1000);

 insert into empleados values('22222222','Ana Acosta','Avellaneda 88',1,1100);
 insert into empleados values('23333333','Bernardo Bustos','Bulnes 345',1,1200);
 insert into empleados values('24444444','Carlos Caseres','Colon 674',2,1800);
 insert into empleados values('25555555','Diana Duarte','Colon 873',3,1000);

 set serveroutput on;
 execute dbms_output.enable (20000);

  create or replace trigger tr_empleados_insertar
  before insert
  on empleados
  for each row
 declare
   varsueldo number:=null;
   varseccion varchar2(30):=null;
 begin
  dbms_output.put_line('Trigger de insercion de "empleados" activado');  
  select sueldomaximo into varsueldo from secciones where codigo=:new.codigoseccion;   
  select nombre into varseccion from secciones where codigo=:new.codigoseccion;
  if (:new.sueldo>varsueldo) then
    raise_application_error(-20001,'Ud. intenta ingresar un sueldo de $ '||to_char(:new.sueldo)
|| ' y el máx. para ' || varseccion ||' es de '|| to_char(varsueldo));
  end if;--sueldo mayor
 end tr_empleados_insertar;
 /

 insert into empleados values('26666666','Federico Fuentes','Francia 938',2,1000);

 select *from empleados;

 insert into empleados values('27777777','Gaston Garcia','Guemes 366',3,1200);

 select *from empleados;

 insert into empleados values('27777777','Gaston Garcia','Guemes 366',9,1200);

create or replace trigger tr_empleados_update_sueldos
  before update of sueldo
  on empleados
  for each row when (new.sueldo>old.sueldo)
 declare
   varsueldo number:=null;
   varseccion varchar2(30):=null;
 begin
  dbms_output.put_line('Trigger de actualizacion de sueldo activado');  
  select sueldomaximo into varsueldo from secciones where codigo=:new.codigoseccion;   
  select nombre into varseccion from secciones where codigo=:new.codigoseccion;
  if (:new.sueldo>varsueldo) then
   raise_application_error(-20002,'Ud. intenta cambiar el sueldo de $ '||to_char(:old.sueldo)||' por '
||to_char(:new.sueldo)||' y el máx. para ' || varseccion ||' es de '|| to_char(varsueldo));
  end if;--sueldo mayor
 end tr_empleados_update_sueldos;
 /

 update empleados set sueldo=1500 where documento='22222222';

 select *from empleados;

 update empleados set sueldo=1600 where documento='22222222';

 select *from empleados;

 update empleados set sueldo=sueldo-sueldo*0.1 where documento='22222222';

 select *from empleados;

 update empleados set codigoseccion=3 where documento='22222222';

 create or replace trigger tr_empleados_update_seccion
  before update of codigoseccion
  on empleados
  for each row
 declare
   varsueldo number:=null;
   varseccion varchar2(30):=null;
 begin
  dbms_output.put_line('Trigger de actualizacion de codigo de seccion activado');  
  select sueldomaximo into varsueldo from secciones where codigo=:new.codigoseccion;
  select nombre into varseccion from secciones where codigo=:new.codigoseccion;
  if (:new.sueldo>varsueldo) then
     raise_application_error(-20003,'Intenta cambiar la sección, pero el sueldo máx. para ' 
|| varseccion ||' es de '|| to_char(varsueldo)|| ' y el sueldo actual de '||
 to_char(:new.sueldo)|| ' lo supera');
  end if;--sueldo mayor
 end tr_empleados_update_seccion;
 /

 update empleados set codigoseccion=1 where documento='22222222';

 select *from empleados;

 update empleados set codigoseccion=3 where documento='23333333';

 select *from empleados;

 update empleados set sueldo=1000, codigoseccion=3 where documento='23333333';

 select *from empleados;

create or replace trigger tr_secciones_maximo
  before update of sueldomaximo
  on secciones
  for each row when (new.sueldomaximo<old.sueldomaximo)
 declare
   existen number:=0;
 begin
  dbms_output.put_line('Trigger de actualizacion de maximo sueldo activado');  
  select count(*) into existen from empleados
      where codigoseccion=:new.codigo
      and sueldo>:new.sueldomaximo;
  if (existen>0)Then
   update empleados set sueldo=:new.sueldomaximo
    where codigoseccion=:new.codigo
    and sueldo>:new.sueldomaximo;
   dbms_output.put_line(to_char(existen)|| ' registros de "empleados" actualizados');      
  end if; 
 end tr_secciones_maximo;
 /

 update secciones set sueldomaximo=2000 where nombre='Administracion';

 select sueldomaximo from secciones where nombre='Administracion';

 update secciones set sueldomaximo=1800 where nombre='Administracion';

 select sueldomaximo from secciones where nombre='Administracion';
 select *from empleados where codigoseccion=1;

 update secciones set sueldomaximo=1200 where nombre='Administracion';

 select sueldomaximo from secciones where nombre='Administracion';
 select *from empleados where codigoseccion=1;

 create or replace trigger tr_secciones_update_codigo
  before update of codigo
  on secciones
  for each row
 begin
  dbms_output.put_line('Trigger de actualizacion de codigo activado');  
  raise_application_error(-20004,'El código de sección no puede modificarse');
 end tr_secciones_update_codigo;
 /

 update secciones set codigo=9 where codigo=1;

 select *from secciones;

 update empleados set sueldo=1800, codigoseccion=2 where documento='22222222';

create or replace trigger tr_empleados_documento
  before update of documento
  on empleados
 begin
  dbms_output.put_line('Trigger de actualizacion de documento activado');  
  raise_application_error(-20005,'El documento no puede modificarse');
 end tr_empleados_documento;
 /

select table_name, trigger_name, triggering_event from user_triggers
  where table_name ='EMPLEADOS' or table_name='SECCIONES';

 drop trigger tr_secciones_maximo;
 drop trigger tr_secciones_update_codigo;

 select trigger_name, triggering_event from user_triggers
  where table_name ='SECCIONES';

create or replace trigger tr_secciones
  before update
  on secciones
  for each row
 declare
   existen number:=0;
 begin
  dbms_output.put_line('Trigger de actualizacion de secciones activado');  
  if (updating('sueldomaximo'))then
   if (:new.sueldomaximo<:old.sueldomaximo) then
     select count(*) into existen from empleados where codigoseccion=:new.codigo and sueldo>:new.sueldomaximo;
     if (existen>0)Then
      update empleados set sueldo=:new.sueldomaximo
      where codigoseccion=:new.codigo
      and sueldo>:new.sueldomaximo;
     end if; --existen
     dbms_output.put_line(to_char(existen)|| ' registros de "empleados" actualizados');   
   end if;--mayor
  end if;--actualizacion de sueldo
  if updating('codigo')then
   raise_application_error(-20004,'El código no puede modificarse');
  end if;
 end tr_secciones;
 /

 update secciones set sueldomaximo=1100 where codigo=1;

 update secciones set sueldomaximo=1500 where codigo=2;

 update secciones set codigo=10 where codigo=2;

 select trigger_name, table_name, triggering_event from user_triggers
  where table_name ='SECCIONES' or table_name ='EMPLEADOS';

 drop table empleados;

 select trigger_name, table_name, triggering_event from user_triggers
  where table_name ='EMPLEADOS';

 drop table secciones;
 select *from user_triggers
  where table_name ='SECCIONES';

Retornar