Impedir eliminar mas de un registro a la vez con un trigger en Oracle

publicado por: Anonymous

Necesito implementar algo similar a lo que hace SQLServer pero en Oracle:

CODIGO: SQLSERVER

CREATE TRIGGER TR_ImpideBorradoMultiple 
   ON MiTabla AFTER DELETE
AS
BEGIN
   IF(SELECT COUNT(*) FROM Deleted) > 1
   Begin
      raiserror('Prohibido eliminar mas de un registro a la vez', 16, 1)
      rollback transaction
   End
END

Por lo que he visto, en Oracle existen las variables :Old y :New, que son de tipo %rowtype por tanto solo referencian a la fila afectada, en cambio en SQLServer, Deleted hace referencia al conjunto de filas afectadas… Debo concluir entonces que no se puede hacer esto en Oracle???

solución

Luego de revisar la documentación de Oracle, efectivamente solo se puede acceder al registro afectado y nunca al conjunto de ellos. Por lo tanto, se me ocurre la siguiente solución: Utilizar una tabla (puede ser temporal) que contabilice las eliminaciones en un trigger para cada fila de tipo before (antes de); luego con un trigger de orden de tipo after (después de), consultar por lo contabilizado:

Create or Replace Trigger Tr_CalculaEliminacionMultiple
   Before delete
   On Empleados
   for each row  /*este trigger se ejecuta por cada fila afectada*/
Begin
   Update EmpleCuentaDeleteRows /*tabla para contabilizar filas afectadas*/
   Set NumFilas = NumFilas + 1;
end;


/*Trigger se dispara despues de la ejecución de la orden.*/
Create or Replace Trigger Tr_EvitaEliminacionMultiple
   after delete
   On Empleados
Declare
   Filas number;
Begin

   Select NumFilas into Filas
   from EmpleCuentaDeleteRows; /*tabla para contabilizar filas afectadas.*/

   if Filas > 1 Then
      raise_application_error(-20001,'No se puede!!!');
   else
      update EmpleCuentaDeleteRows
      set NumFilas = 0;
   end if;
end;

Creo que el rendimiento se verá afectado, en comparación con SQL-SERVER, pero no veo otra alternativa.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *