PDA

Ver la Versión Completa : ¿existe "on delete restrict" en Firebird ?


Lepe
04-04-2007, 18:32:07
Hola amigos:

He estado buscando pero se vé que no lo suficiente.

Uso Firebird 1.5 e Ib Expert Personal, pero este último, al establecer las reglas de borrado sobre una clave ajena (foránea, foreign key) solo me da elegir:

- no action (no viene ayuda, no sé si equivale "restrict" ¿?)
- set null
- cascade
- set default

El hecho es que me extraña que no venga la regla "Restrict / prohibit" o parecido.

Gracias por adelantado.

egostar
04-04-2007, 18:49:10
Hola lepe,

Interbase/Firebird: Interbase didn't have support for RESTRICT. Not sure about firebird. (use NO ACTION instead)


Aqui (http://code.djangoproject.com/ticket/2288) los post completos a esa pregunta.

Salud OS.

Lepe
04-04-2007, 19:47:35
Gracias egostar, aunque eso también es un problema, porque no encuentro el significado.

NO ACTION significa que al borrar en la tabla principal, ¿no hace nada en la tabla con clave ajena?... o sea, se quedaría un Id huérfano, si es así no me interesa.

De momento lo estoy solucionando así, aunque no me gusta:
CREATE TRIGGER CATEGORIA_BD FOR CATEGORIA
ACTIVE BEFORE DELETE POSITION 0
as
declare variable cuantos integer;
begin
select first 1 idcategoria from Trabajador t
where t.Idcategoria = old.Idcategoria
into :cuantos;

if (cuantos > 0) then
exception NotdeleteCategoria;
end

Ya en delphi, en un ApplicationsEvents:

if (e is EMDOError) then
if (e is EMDOFirebirdError) then
begin
Notifica(maviso, dtm.ParseError(EMDOError(E)));
end

ParseError, lo único que hace es quitar el texto "exception X" de la excepción.

Saludos.

egostar
04-04-2007, 23:05:13
Hola Lepe, buscando encontré esto.

Connections between temporary tables (http://ibdeveloper.com/issues/issue-1-sep-1-2005/working-with-temporary/)


No se si te pueda ayudar porque desconozco el tema, pero quiero aprenderlo y me interesa mucho para aplicaciones que tengo en mente.

Salud OS.

maeyanes
04-04-2007, 23:24:44
Haciendo una búsqueda:

http://www.ibphoenix.com/main.nfs?a=ibphoenix&s=1154575297:5422&page=ibp_50_cdri


NO ACTION: The foreign key is left unchanged. This may cause the primary key update to fail due to referential integrity checks. (default)

Esto es, hacer:


alter table tabla_hijo add constraint campohijo_ref_campopadre
foreign key (campo_hijo) references tabla_padre(campo_padre)
on delete no action


es equivalente a hacer:


alter table tabla_hijo add constraint campohijo_ref_campopadre
foreign key (campo_hijo) references tabla_padre(campo_padre)


Yo personalmente lo uso de la segunda forma y no tengo problemas...


Saludos...

Delfino
13-04-2007, 17:58:13
o sea, se quedaría un Id huérfano, si es así no me interesa.

Firebird no permite referencias huerfanas, esto va en contra de la Integridad de los datos,
asi q NoAction significa Restrict..

Lepe
13-04-2007, 19:53:38
Delfino, tienes que conectarme más a menudo a los foros ehhh :D :D jejeje

Realmente no sé como hice las pruebas, quizás tenía creado el campo pero no definida la clave ajena, no sé. Lo cierto es que realmente funciona como dices, así que tendré que eliminar los 7 triggers que había creado y las 7 exceptions...y vuelta a organizar las cosas.

En principio al intentar borrar la clave ajena aparece el nombre de la restricción en la excepción, así que lo capturaré en el OnException del ApplicationsEvents, para mostrar un texto más descriptivo.

Muchas gracias por la info, me sonaba raro que no existiese.

Saludos

Delphius
14-04-2007, 00:21:21
¡Que susto! Al ver que que Lepe estaba preguntando sobre restrict... me hizo dudar de lo que yo había leído en algún lado.
Yo ya estaba por responderte que tenía entendido que NoAction es equivalente a Restrict, pero preferí leer el hilo para enterarme mejor (y en una de esas yo también estaba confundido).

Gracias Delfino por traerme la calma... ¡vaya sustito me hiciste llevar Lepe!

En serio... el hecho que Lepe o cualquier otro de los grandes maestros salte con un pregunta sobre Firebird me hace dar un susto bárbaro... ¡yo ando iniciandome y si meto la pata... quien me salva! Me falta aprender mucho (a pesar de haberme leído casi todos los pdfs que están en su sitio (http://firebirdsql.org) y en Firebird Mexico (http://www.firebird.com.mx/modules/sections/index.php?op=listarticles&secid=1)

Bueno... de nuevo... gracias Delfino.
Saludos,

Lepe
14-04-2007, 01:17:09
¿qué pasa? ¿que yo no puedo tener dudas? :p :p

O no lo he leído, o lo he olvidado :o.

De grande no tengo nada... 1,70 más o menos :p

Saludos

Delphius
14-04-2007, 01:35:06
¿qué pasa? ¿que yo no puedo tener dudas? :p :p

O no lo he leído, o lo he olvidado :o.

De grande no tengo nada... 1,70 más o menos :p

Saludos
Claro... quien no puede tener dudas... sólo contaba mi anédota. Es que a pesar de que estoy con Firebird desde hace ya un tiempo ¿Tal vez 6, 8 meses? no me siento muy seguro sobre el manejo... y el gran susto mio es que haga una tontera y no poder resolverla.
Y yo también he pasado por la misma duda que te ha invadido... y la verdad es que por un breve momento el chucho se apoderó de mi.
Gracias a dios, todo en calma...;)... me voy a tomar la presión:D

Saludos,