Mensaje    Asunto: ON DELETE RESTRICT en Interbase / Firebird. Responder citando

Bueno esto más que un truco es un consejo, pero bueno lo pongo aquí para que este a mano.

Si os vais al Language Reference para Interbase 6.0 OS y Firebird, vereis que interbase no contempla el ON DELETE RESTRICT como parte del lenguaje SQL implementado en el gestor, pero graciosamente cuando vosotros definais un restricción de integridad referencial de una clave ajena, si quereis poner el ON DELETE RESTRICT pues simplemente no pongais nada, y el funcionamiento es similar al ON DELETE RESTRICT, es decir no te dejará borra las tupla de la tabla maestra, hasta que previamente se borre la tupla de la tabla donde es clave ajena y se "simuló" con el ON DELETE RESTRICT.

Ejemplo, imaginemos que tenemos una tabla llamada ARTICULOS, que tiene esta forma:
Código:

CREATE TABLE articulos (
     codigo INTEGER NOT NULL,
     descripcion VARCHAR(25),
     precio integer,
     ...
);

ALTER TABLE articulos ADD CONSTRAINT articulos_PK PRIMARY KEY (codigo);


Tenemos una segunda tabla llamada imagenes de articulos, donde tenemos varias imagenes para cada objeto, es decir de 0 a muchas imagenes.
Código:

CREATE TABLE imagenes_articulos (
      codigo INTEGER NOT NULL,
      articulos_codigo INTEGER NOT NULL,
      imagen BLOB SUB_TYPE 0 SEGMENT SIZE 1024,
      etc...
);

// Con las restricciones
ALTER TABLE imagenes_articulos ADD CONSTRAINT imagenes_articulos_PK PRIMARY KEY (codigo);

ALTER TABLE imagenes_articulos ADD CONSTRAINT articulos_codigo_FK FOREIGN KEY (articulos_codigo) REFERENCES articulos(codigo) ON UPDATE CASCADE;


Con la ultima linea establecemos la restricción de integridad referencial para el campo articulos_codigo, ahora cuando actualizemos el codigo de cualquier articulo, automaticamente Interbase/Firebird nos actualizará el codigo del articulo en la tabla imagenes_articulos, y cuando intentemos borrar un articulo, si en la tabla imagenes_articulos tenemos algun registro que contenga ese codigo de articulo a borrar, Interbase/Firebird nos producirá una excepción y no nos permitirá borrar el original, es decir, simulará un ON DELETE RESTRICT.

Luego solo queda atrapar la excepción en Builder e informar al usuario.

Pues eso es todo.
Lo que es una pena es que no lo implementen como parte del lenguaje porque más o menos tiene el mismo funcionamiento.
_________________
OJO!! Ya tenemos subforo de Bases de Datos!!
Gracias a los admins.