Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Cancelar borrado (https://www.clubdelphi.com/foros/showthread.php?t=20837)

xerkan 27-04-2005 12:32:07

Cancelar borrado
 
Como podria hacer un trigger en firebird 1.5 para que si el usuario intenta borrar un registro con un codigo X la base de datos no le deje borrarlo

Ej.: Quiero estar seguro de que el registro de una tabla con codigo 1 este siempre en esta y no pueda se borrado de ninguna manera, asi que si lo intentan borrar la base de datos deniege esta peticion

delphi.com.ar 27-04-2005 14:44:24

No conozco IB, pero lo que quieres hacer es un trigger de validación, la forma clásica es crear un trigger BEFORE FOR EACH ROW (antes de la ejecución y por cada fila) y poner una pregunta donde si se cumple cierta condición producir un error (exception).

fly 28-04-2005 02:47:19

Yo lo uso tal cual lo explica delphi.com.ar.

Código:


CREATE EXCEPTION Facturas_NODELETE_E "ERROR SOLO SE PUEDE BORRAR LA ULTIMA";
SET TERM !! ;
CREATE TRIGGER Facturas_BDT FOR Facturas
BEFORE DELETE
AS
DECLARE VARIABLE AUX INTEGER;
BEGIN
SELECT MAX(num) FROM Facturas
        WHERE periodo=OLD.periodo AND serie=OLD.serie
        INTO AUX;
IF (OLD.num < :AUX)
        THEN EXCEPTION Facturas_NODELETE_E;
 
END !!
SET TERM ; !!

Y ya que estamos ¿alguien quiere comentar algo? Este código lo uso para que no se pueda borrar mas que la última factura. El código funciona perfectamente, pero si alguien tiene algún otro método mejor estaría bien saberlo.

lbuelvas 28-04-2005 16:19:54

Hola Foro,

Sobre el metodo que utilizas para permitir borrados unicamente sobre le ultimo registro, creo que no funcionaria para una aplicacion de multiples usuarios, en cuyo caso tendrias que colocar un campo a tu tabla con el nombre del usuario y cambiar el select a algo como:

SELECT MAX(num) FROM Facturas
WHERE periodo=OLD.periodo AND serie=OLD.serie and usuario = current_user
INTO AUX;

Tambien como las llaves primarias (por lo menos hasta la version de Firebird 1.0.3) se crean en orden ascendente, el rendimiento caeria en la medida que aumente el numero de registros en la tabla, deberias entonces crear un indice descendente (de mayor a menor) sobre la columna num.

fly 29-04-2005 07:12:05

Gracias lbuelvas por tu apreciación.

Uhm!! Lo del usuario no valdría, pues sea quien fuere el que haga la factura, una vez "numerada" ya no se puede borrar si existe otra con numeración superior (legalmente no puede haber "vacios" entre facturas).

Aún no me preocupa lo de multipuesto, pero tendré que arreglarlo para el futuro.

Gracias.

PD: Tomo nota de lo del indice. thx.

xerkan 29-04-2005 12:55:50

Gracias por contestar al final he conseguido hacer lo que queria creando unas excepciones tal y como decis de la siguiente manera:


Código:

CREATE EXCEPTION EXC_USUARIOS 'NO SE PUEDE BORRAR AL USUARIO 1';

SET TERM !!;

CREATE TRIGGER BEF_DEL_USUARIOS FOR Usuarios
BEFORE DELETE
AS
BEGIN
  IF (OLD.IDUSUARIO=1) THEN EXCEPTION EXC_USUARIOS;
END!!

SET TERM; !!



La franja horaria es GMT +2. Ahora son las 21:05:00.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi