Você está na página 1de 5

6/1/2018 Conociendo la aplicación que insertó filas a una tabla | Firebird SQL

Firebird SQL
Teoría y Práctica sobre Firebird

Inicio Acerca de Foro Índice

¡¡¡FELIZ AÑO 2014!!!

Manteniendo la Base de Datos en buen estado

Conociendo la aplicación que insertó filas a


2 enero una tabla
2014 wrov Diseño de bases de datos base de datos, delete, excepción,
exception, GTT, insert, trigger, update 2 comentarios

Cuando una Base de Datos puede ser accedida desde varias aplicaciones es muy
importante saber cual aplicación insertó las filas que tiene cada tabla.

¿Por qué?

Porque solamente la aplicación que insertó la fila debería tener el derecho de


modificar o de borrar esa fila. Si otra aplicación pudiera hacerlo, eso
solamente acarreará problemas. Imagínate que la aplicación de VENTAS
registró una venta y cuando se la quiere consultar no se la encuentra por
ningún lado porque CONTABILIDAD borró esa venta. Eso es inadmisible.

¿Qué necesitaremos?

1. Una tabla APLICACIONES, para guardar los nombres de las aplicaciones que
pueden usarse
2. Una tabla GTT, para guardar los datos de la conexión actual, incluyendo el
Identificador de la aplicación usada para el acceso
3. Un trigger de Base de Datos que le inserte una fila a la tabla GTT
4. Desde nuestra aplicación actualizar la tabla GTT para que tenga el
Identificador de aplicación correcto
5. Agregarle una columna a todas las tablas que pueden usarse por más de una
aplicación
6. Dos excepciones, para mostrar los mensajes de error
7. Agregarle un trigger a cada tabla que puede usarse por más de una aplicación,
para decidir si la fila puede ser modificada o eliminada

Tabla APLICACIONES

Captura 1. Si haces clic en la imagen la verás más grande

1 CREATE TABLE APLICACIONES (


2 APL_IDENTI D_IDENTIFICADOR NOT NULL,
3 APL_NOMBRE D_NOMBRE40);
4
5 ALTER TABLE APLICACIONES ADD CONSTRAINT PK_APLICACIONES PR
6
7 ALTER TABLE APLICACIONES ADD CONSTRAINT UQ_APLICACIONES UN
8
9 SET TERM ^ ;
10
11 CREATE TRIGGER BI_APLICACIONES_APL_IDENTI FOR APLICACIONES
12 ACTIVE BEFORE INSERT
13 POSITION 0
14 AS
15 BEGIN
16 IF (NEW.APL_IDENTI IS NULL OR NEW.APL_IDENTI = 0) THEN
17 NEW.APL_IDENTI = GEN_ID(APLICACIONES_APL_IDENTI_GEN, 1
18 END^
19
20 SET TERM ; ^

https://firebird21.wordpress.com/2014/01/02/conociendo-la-aplicacion-que-inserto-filas-a-una-tabla/ 1/5
6/1/2018 Conociendo la aplicación que insertó filas a una tabla | Firebird SQL
El contenido de esta tabla podría ser algo así:

Captura 2. Si haces clic en la imagen la verás más grande

Tabla GTT: CONEXION_ACTUAL

En una tabla GTT guardamos los datos que necesitamos conocer de la


conexión que actualmente está usando el usuario.

Captura 3. Si haces clic en la imagen la verás más grande

Trigger de Base de Datos para insertarle una fila a la tabla GTT

1 CREATE TRIGGER NEW_DBTRIGGER_C


2 ACTIVE ON CONNECT
3 POSITION 0
4 AS
5 BEGIN
6
7 INSERT INTO
8 CONEXION_ACTUAL
9 (CON_IDENTI, CON_USUARI, CON_TIMEST)
10 VALUES
11 (CURRENT_CONNECTION, CURRENT_USER, CURRENT_TIMESTAMP)
12
13 END;

El valor de la columna faltante (CON_APLICA) debería ser puesto por la


aplicación correspondiente.

Contenido de la tabla CONEXION_ACTUAL

Captura 4. Si haces clic en la imagen la verás más grande

Ejemplo:

A la tabla CLIENTES pueden insertarle filas las aplicaciones de Contabilidad,


Facturación, y Ventas. Si la fila fue insertada por Contabilidad entonces
Facturación y Ventas no deberían tener el derecho de modificar esa fila ni de
borrarla. De la misma manera, si la fila fue insertada por Facturación o por
Ventas las otras aplicaciones no deberían poder cambiarla.

Cualquier aplicación puede consultar una fila, pero solamente la aplicación


que la insertó puede modificarla o borrarla.

Captura 5. Si haces clic en la imagen la verás más grande

Y para ver los nombres de las aplicaciones que insertaron las filas podríamos
escribir algo como:

1 SELECT
2 C.CLI_IDENTI,
3 C.CLI_NOMBRE,
4 C.CLI_IDEAPL,
5 A.APL_NOMBRE AS CLI_NOMAPL
6 FROM
7 CLIENTES C
8 JOIN
9 APLICACIONES A
10 ON C.CLI_IDEAPL = A.APL_IDENTI

que nos dará como resultado algo similar a:

https://firebird21.wordpress.com/2014/01/02/conociendo-la-aplicacion-que-inserto-filas-a-una-tabla/ 2/5
6/1/2018 Conociendo la aplicación que insertó filas a una tabla | Firebird SQL

Captura 6. Si haces clic en la imagen la verás más grande

Aquí como puedes ver las filas de MARCELA, DIANA y MIRTA fueron
insertadas por CONTABILIDAD, en cambio la fila de SILVIA fue insertada por
FACTURACIÓN. Eso implica que si debemos modificar o borrar las filas de
MARCELA, DIANA, o MIRTA deberemos hacerlo desde la CONTABILIDAD y
si queremos modificar o borrar la fila de SILVIA deberemos hacerlo desde
FACTURACIÓN.

Esto nos asegura que nunca una aplicación modifique o borre las filas que no
le corresponden.

Las excepciones para mostrar los mensajes de error

1 CREATE EXCEPTION E_UPDATE_NO_ADMITIDO 'No puedes modificar el


2
3 CREATE EXCEPTION E_DELETE_NO_ADMITIDO 'No tienes permiso para

El trigger para modificar o borrar filas de la tabla CLIENTES

1 CREATE TRIGGER BUD_CLIENTES1 FOR CLIENTES


2 ACTIVE BEFORE UPDATE OR DELETE
3 POSITION 0
4 AS
5 DECLARE VARIABLE lnAplicacion SMALLINT;
6 BEGIN
7
8 lnAplicacion = (SELECT CON_APLICA FROM CONEXION_ACTUAL);
9
10 IF (UPDATING AND NEW.CLI_IDEAPL <> lnAplicacion) THEN
11 EXCEPTION E_UPDATE_NO_ADMITIDO;
12
13 IF (DELETING AND OLD.CLI_IDEAPL <> lnAplicacion) THEN
14 EXCEPTION E_DELETE_NO_ADMITIDO;
15
16 END;

Terminando:

Y listo, eso es todo, ahora solamente la aplicación que insertó una fila podrá
modificar o borrar esa fila. Los intentos realizados por las demás aplicaciones
serán rechazados, como tiene que ser.

Conclusión:

Siempre es muy importante delimitar exactamente que puede hacer cada


aplicación que se conecta a nuestra Base de Datos, no podemos permitir que
una aplicación modifique o borre filas que fueron insertadas por otra
aplicación porque eso solamente nos traerá problemas y ningún beneficio.

Artículos relacionados:

Los triggers de la Base de Datos

El índice del blog Firebird21

https://firebird21.wordpress.com/2014/01/02/conociendo-la-aplicacion-que-inserto-filas-a-una-tabla/ 3/5
6/1/2018 Conociendo la aplicación que insertó filas a una tabla | Firebird SQL
Anuncios

Share this:

 Twitter  Facebook

 Me gusta
Sé el primero en decir que te gusta.

Relacionado

La problemática de las Creando y usando tablas Tablas agregadas


tablas maestras temporales En "OLAP y OLTP"
En "Diseño de bases de En
datos" "ADMINISTRACIÓN"

2 comentarios (+add yours?)

Julio Romero
Sep 18, 2014 @ 19:47:31
Hola Don Walter. Un placer saludarle nuevamente. Antes le consulte por correo.
Buscando una solucion para mi pequenno problema, encontre su articulo. Yo
realizo algo parecido a todo el proceso que usted explica aca. En un campo
almaceno la hora en que se guarda el registro, especificamente. El tipo de dato del
campo es TIME. No obstante, al dejar un valor por defecto, CURRENT_TIME, para
el campo HORA, la hora del sistema se guarda bien, pero la fecha en todosssss los
registros me aparece 12/30/1899 15:45:23 y no es la fecha del dia de hoy. Al ser este
articulo relacionado, permitame preguntarle como corregir este detalle? He
investigado pero no logro dar en el clavo. Probe extraer la fecha con
CURRENT_DATE y funciona super bien, pero en CURRENT_TIME me da siempre
esa fecha erronea con la hora correcta.

Julio
Desde Managua, Nicaragua!

RESPONDER

wrov
Sep 18, 2014 @ 22:07:01

CURRENT_TIME solamente debe devolver la hora, no la fecha.

Si quieres obtener la fecha y la hora debes utilizar CURRENT_TIMESTAMP

Saludos.

https://firebird21.wordpress.com/2014/01/02/conociendo-la-aplicacion-que-inserto-filas-a-una-tabla/ 4/5
6/1/2018 Conociendo la aplicación que insertó filas a una tabla | Firebird SQL
Walter.

RESPONDER

Responder

Introduce aquí tu comentario...

¡¡¡FELIZ AÑO 2014!!!

Manteniendo la Base de Datos en buen estado

Crea un blog o un sitio web gratuitos con WordPress.com.

https://firebird21.wordpress.com/2014/01/02/conociendo-la-aplicacion-que-inserto-filas-a-una-tabla/ 5/5

Você também pode gostar