Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-04-2005
xerkan xerkan is offline
Miembro
 
Registrado: jun 2003
Posts: 89
Poder: 21
xerkan Va por buen camino
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
Responder Con Cita
  #2  
Antiguo 27-04-2005
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
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).
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.

Última edición por delphi.com.ar fecha: 27-04-2005 a las 14:48:16.
Responder Con Cita
  #3  
Antiguo 28-04-2005
fly fly is offline
Miembro
 
Registrado: abr 2005
Posts: 65
Poder: 20
fly Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 28-04-2005
lbuelvas lbuelvas is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 377
Poder: 22
lbuelvas Va por buen camino
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.
__________________
Luis Fernando Buelvas T.
Responder Con Cita
  #5  
Antiguo 29-04-2005
fly fly is offline
Miembro
 
Registrado: abr 2005
Posts: 65
Poder: 20
fly Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 29-04-2005
xerkan xerkan is offline
Miembro
 
Registrado: jun 2003
Posts: 89
Poder: 21
xerkan Va por buen camino
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; !!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 08:58:18.


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