Sei sulla pagina 1di 24

2.7 Mecanismo de actividad: disparadores.

2.7 Mecanismo de actividad: disparadores.


Clave primaria Clave Ajena

Departamento cod_dep nombre director


Profesor

telfono

Asignatura cod_asg

cod_pro nombre telfono cod_dep Docencia cod_pro cod_asg gteo gprac

nombre semestre teo prac cod_dep

2.7 Mecanismo de actividad: disparadores.


Departamento (cod_dep: tira(5), nombre: tira(100), director tira(50), telfono : tira(11)) CP={cod_dep}, VNN={nombre} Asignatura (cod_asg: tira(5), nombre: tira(100), semestre: tira(2), teo: real, prac: real, cod_dep: tira(5)) CP={cod_asg}, VNN={nombre, teo, prac, semestre} CAj={cod_dep} Departamento f(cod_dep)=cod_dep Profesor (cod_pro : tira(5), nombre: tira(50), telfono: tira(11), cod_dep: tira(5) ) CP={cod_pro}, VNN={nombre} CAj={cod_dep} Departamento f(cod_dep)=cod_dep Docencia ( cod_asg: tira(3), cod_pro: tira(3), gteo: entero, gprac: entero) CP={cod_pro, cod_asg}, VNN={gteo, gprac} CAj={cod_asg} Asignatura f(cod_asg)=cod_asg CAj={cod_pro} Profesor f(cod_pro)=cod_pro

2.7 Mecanismo de actividad: disparadores.


La evolucin de una base de datos es provocada por la ejecucin de operaciones de actualizacin realizadas bien por los usuarios (interactivamente) o bien por la ejecucin de programas (aplicaciones) que acceden a la base de datos.

D
INSERT DELETE UPDATE

2.7 Mecanismo de actividad: disparadores.


En muchas aplicaciones de la tecnologa de bases de datos, es til que ciertas operaciones se realicen de forma automtica como respuesta a la ocurrencia de algn suceso o situacin, sin necesidad que intervenga el usuario o deban codificarse en los programas de aplicacin.

Sistemas de Gestin de Bases de Datos Activos

2.7 Mecanismo de actividad: disparadores.

Ejemplo1: cuando un profesor se da de baja (es borrado) sus datos deben registrarse en un histrico de profesores.
Profesor
HistricoProfesores

cod_pro nombre telfono cod_dep

cod_pro nombre telfono cod_dep fecha Insercin quin debe realizar esta insercin?

Borrado

2.7 Mecanismo de actividad: disparadores.


Profesor
HistricoProfesores

cod_pro nombre telfono cod_dep

cod_pro nombre telfono cod_dep fecha Insercin


SGBD

Borrado

En un SGBD activo la insercin en el histrico de profesores puede ser realizada por el SGBD sin la intervencin del usuario.

2.7 Mecanismo de actividad: disparadores.


Profesor
cod_pro nombre Juan C. Casamayor Rdenas Robert Fuster i Capilla Jos V. Benlloch Dualde Mara Alpuente Frasnedo Cristina Prez Guillot Jos M. Torralba Martnez Ignacio Gil Pechun Daniel Gil Toms Matilde Celma Gimnez telfono 7796 6789 5760 3560 7439 4590 3423 5679 7756 cod_dep DSIC MAT DISCA DSIC IDM OEM OEM DISCA DSIC JCC RFC JBD MAF CPG JTM IGP DGT MCG

DELETE FROM Profesor WHERE cod_pro=RFC

SGBD
INSERT INTO Histrico-Profesores VALUES (RFC, Robert Fuster Capilla, 6789, MAT, SYSDATE) PPP Pedro Prez Puerta

HistricoProfesores
7795 DISCA 12/12/97 6789 MAT 12/12/99

RFC Robert Fuster Capilla

2.7 Mecanismo de actividad: disparadores. disparador regla de actividad


Los disparadores permiten modelar un comportamiento activo (autnomo) del sistema (SGBD) como respuesta a la ocurrencia de ciertos sucesos o condiciones. Regla de actividad (ECA)

evento - condicin - accin

evento: especifica el suceso a cuya ocurrencia debe responder el sistema . condicin: especifica el contexto en el cual la regla cuyo evento se ha producido debe ser ejecutada. accin: especifica las acciones que deben ser ejecutadas por el sistema como respuesta a la ocurrencia del evento cuando la condicin es cierta .

2.7 Mecanismo de actividad: disparadores.

evento - condicin - accin


Operaciones de actualizacin de la base de datos Expresin lgica en SQL Operaciones de manipulacin de la base de datos, control de errores, etc

Disparadores en SQL

2.7 Mecanismo de actividad: disparadores.

evento - condicin - accin


TRUE
DELETE FROM Profesor WHERE cod_pro=RFC
INSERT INTO Histrico-Profesores VALUES (RFC, Robert Fuster Capilla, 6789, MAT, SYSDATE)

SGBD

Cmo escribir una regla ECA genrica que sirva para cualquier borrado en Profesor?

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER borrado_profesor AFTER DELETE ON Profesor FOR EACH ROW WHEN <condicin> BEGIN INSERT INTO Histrico-Profesores VALUES (-, - , -, - , -); END; accin no hay condicin

Regla ECA en SQL99


evento

Despus (AFTER) de un borrado en Profesor (evento), en cualquier contexto (no hay condicin), se insertar una tupla en HistricoProfesores (accin).

2.7 Mecanismo de actividad: disparadores.


Profesor
cod_pro nombre Juan C. Casamayor Rdenas Robert Fuster i Capilla Jos V. Benlloch Dualde Mara Alpuente Frasnedo Cristina Prez Guillot Jos M. Torralba Martnez Ignacio Gil Pechun Daniel Gil Toms Matilde Celma Gimnez telfono 7796 6789 5760 3560 7439 4590 3423 5679 7756 cod_dep DSIC MAT DISCA DSIC IDM OEM OEM DISCA DSIC

DELETE FROM Profesor WHERE cod_pro=RFC

JCC RFC JBD MAF CPG JTM IGP DGT MCG

evento

OLD.cod_pro

OLD.nombre

OLD.telfono

OLD.cod_dep

Para poder referir los valores de la tupla actualizada, los eventos estn parametrizados impcitamente con la tupla actualizada (OLD)

Mecanismo de disparadores en ORACLE


Parmetros del evento: tupla actualizada. OLD: valor de la tupla antes de la actualizacin NEW: valor de la tupla despus de la actualizacin INSERT: NEW DELETE: OLD UPDATE: OLD, NEW Dependiendo del tipo de evento slo tienen sentido un tipo de parmetros (NEW o OLD)

A los parmetros del evento se les debe asociar un identificador (nominar) en el disparador: REFERENCING [NEW | OLD] AS ....

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER borrado_profesor AFTER DELETE ON Profesor REFERENCING OLD AS viejo FOR EACH ROW BEGIN INSERT INTO Histrico-Profesores VALUES (:viejo.cod_pro, :viejo.nombre, :viejo.telfono, :viejo.cod_dep, SYSDATE); END; accin

Regla ECA en SQL99


evento

Despus (AFTER) de un borrado en Profesor (evento), en cualquier contexto (no hay condicin), se insertar una tupla en HistricoProfesores (accin) construida con los valores de los atributos de la tupla borrada.

2.7 Mecanismo de actividad: disparadores.


En SQL las actualizaciones pueden ser mltiples: afectar a varias tuplas.
INSERT INTO ... AS SELECT ... DELETE FROM ... WHERE ... UPDATE .... SET ... WHERE ...

Si el evento es mltiple cmo debe ser ejecutado el disparador? una vez por cada tupla afectada una nica vez para toda la sentencia SQL

granularidad del disparador

Mecanismo de disparadores en ORACLE


Profesor
cod_pro nombre Juan C. Casamayor Rdenas Robert Fuster i Capilla Jos V. Benlloch Dualde Mara Alpuente Frasnedo Cristina Prez Guillot Jos M. Torralba Martnez Ignacio Gil Pechun Daniel Gil Toms Matilde Celma Gimnez telfono 7796 6789 5760 3560 7439 4590 3423 5679 7756 cod_dep DSIC MAT DISCA DSIC IDM OEM OEM DISCA DSIC

DELETE FROM Profesor WHERE cod_dep=DSIC

JCC RFC JBD MAF CPG JTM IGP DGT MCG

granularidad orientada a la tupla

SGBD
INSERT INTO Histrico-Profesores VALUES ( )

HistricoProfesores
JCC Juan C. Casamayor Rdenas 7796 DSIC 12/12/99 MAF Mara Alpuente Frasnedo 3560 DSIC 12/12/99 MCG Matilde Celma Gimnez 7756 DSIC 12/12/99

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER borrado_profesor AFTER DELETE ON Profesor REFERENCING OLD AS viejo FOR EACH ROW WHEN <condicin> BEGIN INSERT INTO Histrico-Profesores VALUES (:viejo.cod_pro, :viejo.nombre, :viejo.telfono, :viejo.cod_dep, SYSDATE); END; accin evento

Regla ECA en SQL99

granularidad orientada a la tupla

Despus (AFTER) de una operacin de borrado en Profesor (evento), en cualquier contexto (no hay condicin), se insertar una tupla en Histrico-Profesores (accin), por cada tupla borrada.

2.7 Mecanismo de actividad: disparadores.

Ejemplo2: cuando se realiza una actualizacin en


Profesor
granularidad orientada a la sentencia

Profesor se debe hacer un registro de seguridad en la tabla Accesos. cod_pro nombre telfono cod_dep
INSERT
SGBD

Accesos

nro usuario fecha

DELETE-UPDATE-INSERT

2.7 Mecanismo de actividad: disparadores.


CREATE OR REPLACE TRIGGER borrado_profesor AFTER INSERT OR UPDATE OR DELETE ON Profesor FOR EACH STATEMENT BEGIN INSERT INTO Accesos VALUES (nro, USER, SYSDATE); END; accin evento

granularidad orientada a la sentencia

Despus (AFTER) de una operacin (insercin, borrado o actualizacin) en Profesor (evento) se insertar una tupla en Accesos (accin) independientemente del nmero de tuplas actualizadas. Nota: USER y SYSDATE son funciones predefinidas que devuelven el identificador del usuario conectado y la fecha del sistema.

2.7 Mecanismo de actividad: disparadores.


orientada a la tupla FOR EACH ROW Granularidad de un disparador en SQL orientada a la sentencia
el disparador se ejecuta una nica vez para la sentencia. el disparador se ejecuta una vez para cada tupla.

FOR EACH STATEMENT

El valor por defecto para la granularidad es FOR EACH ROW Slo los disparadores de tipo FOR EACH ROW tienen parmetros asociados al evento.

2.7 Mecanismo de actividad: disparadores.


definicin_regla := CREATE TRIGGER nombre_regla {BEFORE | AFTER } {INSERT | DELETE | UPDATE [OF lista_atributos]} ON nombre_relacin [ REFERENCING [NEW | OLD] AS nombre_parmetro] [FOR EACH {ROW | STATEMENT} ] [WHEN ( condicin ) ] {sentencia_SQL | procedimiento_SQL}
condicin accin granularidad parmetros evento

punto de ejecucin

2.7 Mecanismo de actividad: disparadores.


Sentencias SQL:
- sentencia simple: operacin_SQL - sentencia compuesta: BEGIN ATOMIC {operacin_SQL} ... END

2.7 Mecanismo de actividad: disparadores. Ventajas de los SGBD activos:


- proporcionan mayor independencia de datos
permiten realizar funciones que en los sistemas pasivos deban ser programadas en el cdigo de las aplicaciones

- permiten integrar subsistemas


tareas propias de distintos subsistemas en los sistemas pasivos (control de accesos, gestin de vistas,...) son integradas en el mecanismo de reglas

- extienden el mbito de aplicacin de los SGBD pasivos


adems de la aplicacin clsica de los SGBD pasivos (construccin de sistemas de informacin) aparecen aplicaciones a otro tipo de problemas (sistemas expertos con grandes volmenes de datos)

2.7 Mecanismo de actividad: disparadores. Aplicaciones de los SGBD activos :


comprobacin de la integridad restauracin de la consistencia generacin de datos derivados (materializacin de vistas) control de la seguridad (accesos permitidos) definicin de las reglas de funcionamiento interno de la organizacin

2.7 Mecanismo de actividad: disparadores.

EJEMPLO3: Comprobacin de la integridad


Restriccin de integridad: Los profesores que imparten la asignatura EST1 deben ser del departamento de Estadstica (EST).

2.7 Mecanismo de actividad: disparadores. Restriccin de integridad: Los profesores que imparten la asignatura EST1 deben ser del departamento de Estadstica (EST).
SQL
CREATE ASSERTION CHECK ( NOT EXISTS (SELECT * FROM Docencia NATURAL JOIN Profesor WHERE Docencia.cod_asg = EST1 AND Profesor.cod_dep <> EST )

2.7 Mecanismo de actividad: disparadores.

En los SGBD relacionales que no son SQL completos, las restricciones de integridad que no se pueden definir en el esquema pueden ser comprobadas por medio de disparadores.

2.7 Mecanismo de actividad: disparadores. Restriccin de integridad: Los profesores que imparten la asignatura EST1 deben ser del departamento de Estadstica (EST).
Se deben analizar los eventos relevantes para la restriccin, es decir que pueden violarla, y definir los disparadores necesarios.

Operaciones sobre la relacin Docencia

Operaciones sobre la relacin Profesor

2.7 Mecanismo de actividad: disparadores. Disparadores sobre Docencia:


INSERT UPDATE (cod_asg) Docencia NEW.cod_asg=EST1 si cod_dep de NEW.cod_pro <>EST entonces RECHAZAR UPDATE (cod_pro)

Evento

Condicin
REGLA DE ACTIVIDAD (ECA)

Accin

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER control_docencia1 AFTER INSERT ON Docencia REFERENCING NEW AS nuevo FOR EACH ROW WHEN nuevo.cod_asg = EST1 BEGIN ATOMIC DECLARE X CHAR(4); BEGIN SELECT P.cod_dep INTO X FROM Profesor P WHERE P.cod-prof = :nuevo.cod-prof; IF X <> EST THEN RAISE-APPLICATION-ERROR (---, actualizacin no vlida) END IF; END condicin accin evento

SQL

2.7 Mecanismo de actividad: disparadores.


evento CREATE TRIGGER control_docencia2 AFTER UPDATE OF cod_asg, cod_pro ON Docencia REFERENCING NEW AS nuevo FOR EACH ROW WHEN nuevo.cod_asg = EST1 BEGIN ATOMIC DECLARE X CHAR(4); BEGIN SELECT P.cod_dep INTO X FROM Profesor P WHERE P.cod-prof = :nuevo.cod-prof; IF X <> EST THEN RAISE-APPLICATION-ERROR (---, actualizacin no vlida) END IF; END condicin accin

SQL

2.7 Mecanismo de actividad: disparadores. Disparadores sobre Profesor:


Profesor UPDATE (cod_dep) OLD.cod_dep=EST AND NEW.cod_dep<>EST

si NEW.cod_prof imparte EST1 entonces RECHAZAR

Evento

Condicin
REGLA DE ACTIVIDAD

Accin

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER control_docencia3 AFTER UPDATE OF cod_dep ON Profesor REFERENCING OLD AS viejo FOR EACH ROW BEGIN ATOMIC DECLARE X INTEGER; BEGIN SELECT COUNT(*) INTO X FROM Docencia D WHERE D.cod-prof = :nuevo.cod-prof AND D.cod_asg=EST1 IF X <> 0 THEN RAISE-APPLICATION-ERROR (---, actualizacin no vlida) END IF; SQL END NEW AS nuevo condicin accin evento

WHEN viejo.cod_dep = EST AND nuevo.cod_dep<>EST

Ejercicio 1: SI de control de vehculos


Ejercicio 1: Para el esquema relacional abajo disee un disparador, trigger, para controlar el borrado en Compra.
Propietario (dni: d_dni, nom: d_nom, dir: d_dir, fecha_nac: d_fecha) CP: {dni} VNN: {nom, dir, fecha_nac} Tipo_V(cod: d_cod, desc: d_desc, tasa: d_tasa) CP:{cod} VNN: {desc, tasa} Vehculo(n_mat: d_n_mat, tipo: d_tipo, ao_fab: d_ao, prop_act: d_dni) CP: {n_mat} Restricciones de integridad: VNN: {ao_fab, prop_act} (1) Todo propietario est en CAj: {prop_act} Propietario f(prop_act)dni Compra CAj: {tipo} Tipo_V f(tipo) cod (2) Todo vehculo est en Compra Compra(n_mat: d_n_mat, prop: d_dni, (3) Un propietario no puede fecha_c: d_fecha) venderse a s mismo un vehculo CP: {n_mat, fecha_c} (4) Para cada vehculo, no puede VNN: {prop} haber ninguna compra posterior a la fecha de compra por CAj: {prop} Propietario f(prop) dni parte del propietario actual CAj: {n_mat} Vehculo

Solucin Ejercicio 1
a) Disee un disparador, trigger, para controlar el borrado en Compra.
CREATE TRIGGER T1 AFTER DELETE ON COMPRA FOR EACH ROW DECLARE aux NUMBER; BEGIN SELECT COUNT(*) INTO aux FROM COMPRA C WHERE :old.prop = C.prop; IF aux = 0 THEN RAISE_APPLICATION_ERROR(-20000, 'No se puede borrar la compra, porque dejaramos un propietario sin compras'); END IF; END;

2.7 Mecanismo de actividad: disparadores.

Ejemplo4: Mantenimiento de datos derivados


En la relacin Profesor existe un atributo derivado crditos
que debe ser mantenido automticamente por el sistema.

atributo crditos de Profesor es la suma de todos los crditos que en la relacin Docencia aparecen impartidos por el profesor

Ley de derivacin del atributo crditos: el valor del

2.7 Mecanismo de actividad: disparadores.


Clave primaria Clave Ajena

Departamento cod_dep nombre director


Profesor

telfono

Asignatura cod_asg

cod_pro nombre telfono cod_dep Docencia cod_pro cod_asg crditos

nombre semestre teo prac cod_dep

crditos*
* atributo derivado

2.7 Mecanismo de actividad: disparadores.


CREATE TABLE Profesor (cod_pro CHAR(5), nombre VARCHAR(50) NOT NULL, telfono CHAR(11), cod_dep CHAR(5), crditos NUMBER (4,1) DEFAULT 0, CONSTRAINT CP_prof PRIMARY KEY (cod_pro), CONSTRAINT CAj_prof_dpto FOREIGN KEY (cod_dep) REFERENCES Departamento(cod_dep))

El atributo derivado crditos debe ser mantenido automticamente por el sistema.

2.7 Mecanismo de actividad: disparadores.


aplicar la ley de derivacin del atributo crditos en Profesor y actualizar dicho atributo: Profesor

INSERT UPDATE (crditos) DELETE UPDATE (cod_pro)

Docencia

UPDATE (crditos)

Evento

Condicin
REGLA DE ACTIVIDAD

Accin

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER total_crditos1 AFTER INSERT ON Docencia REFERENCING NEW AS nuevo FOR EACH ROW UPDATE Profesor SET crditos=crditos+:nuevo.crditos WHERE cod_pro=:nuevo.cod_pro END

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER total_crditos2 AFTER UPDATE OF crditos, cod_pro ON Docencia REFERENCING OLD AS viejo NEW AS nuevo FOR EACH ROW BEGIN ATOMIC IF :nuevo.cod_pro != :viejo.cod_prof THEN UPDATE Profesor SET crditos=crditos+:nuevo.creditos WHERE cod_pro=:nuevo.cod_pro; UPDATE Profesor SET crditos=crditos -:viejo.creditos WHERE cod_pro=:viejo.cod_pro; ELSE UPDATE Profesor SET crditos + :nuevo.crditos - :viejo.crditos; WHERE cod_pro=:nuevo.cod_pro; END IF; END;

2.7 Mecanismo de actividad: disparadores.


CREATE TRIGGER total_crditos3 AFTER DELETE ON Docencia REFERENCING OLD AS viejo FOR EACH ROW BEGIN UPDATE Profesor SET crditos=crditos - :viejo.crditos WHERE cod_pro=:viejo.cod_pro; END;

Ejercicio 2
SI de un servicio de urgencias sanitarias domiciliarias:
Personal(dni:d_dni, nombre:d_nom, categora:d_cat, tfno:d_tfn, edad: d_edad) CP: {dni} VNN: {nombre} VNN: {categora} Material(codm: d_cod, descripcin: d_desc, precio:d_precio) CP: {codm} VNN: {precio} Vehculo (matrcula: d_mat, tipo: d_tipo) CP: {matrcula} VNN: {tipo} Salida(cods:d_cod, motivo:d_mot, matrcula:d_mat, coste_material:d_coste, fecha:d_fecha) CP: {cods} CAj: {matrcula} Vehculo VNN: {motivo} VNN: {fecha} PersonalSal(cods: d_cod, dni: d_dni) CP: {cods,dni} CAj: {cods} Salida CAj: {dni} Personal MaterialSal(cods: d_cod, codm: d_cod, cantidad: d_cant) CP: {cods,codm} CAj: {cods} Salida CAj: {codm} Material

El atributo coste_material debe ser mantenido por el SGBD. a) Enumere qu operaciones sobre la BD podran afectar a esta restriccin. b) Disee un disparador para controlar la insercin en MaterialSal.

Ejercicio 3: SI de una empresa de Proyectos


Departamento(dept: d_dep, nombre: d_nom, ubicacin: d_ubi, director: d_num) CP: {dept } VNN:{director} CAj: {director} Empleado f(director)=nmero Empleado(nmero: d_num, nombre: d_nom, dir: d_dir, poblacin: d_pob, dept: d_dep, jefe: d_num, cat: d_cat) CP: {nmero} VNN: {nombre, poblacin, dept, cat} CAj: {dept} Departamento CAj: {jefe} Empleado CAj: {cat} Categora Categora(cat: d_cat, desc: d_desc, tarifa_horaria: d_ptas) CP: {cat} Proyecto(identif: d_ide, nombre: d_nom, presupuesto: d_pres, poblacin: d_pob, dept: d_dep, responsable: d_num) CP: {identif} CAj: {dept} Departamento VNN: {nombre, presupuesto, poblacin, dept, responsable} CAj: {responsable} Empleado f(responsable)=nmero Trabajo_realizado(nmero: d_num, identif: d_ide, inicio: d_inst, fin: d_inst) CP: {nmero, identif, inicio } VNN: {fin} CAj: {nmero} Empleado CAj: {identif} Proyecto

Dada la RI: El presupuesto de un proyecto en un instante de tiempo t nunca ser inferior al de un instante t anterior (siempre aumentar) a) Enumere las operaciones sobre la BD que podran violar la restriccin. b) Disee un trigger para controlar alguna de las operaciones (La

operacin que viola la restriccin debe ser abortada.)

Solucin Ejercicio 2
a) Enumere las operaciones sobre la BD que podran violar la restriccin. INSERCIN en SALIDA *(PONER A 0 EL coste_material) MODIFICACIN del atributo coste_material en SALIDA *(PROHIBIDA) INSERCIN en MATERIALSAL MODIFICACIN del atributo 'cods' de MATERIALSAL MODIFICACIN del atributo 'codm' de MATERIALSAL MODIFICACIN del atributo 'cantidad' de MATERIALSAL BORRADO en MATERIALSAL MODIFICACIN del atributo precio en MATERIAL

Solucin Ejercicio 2
b) Disee un trigger para controlar la insercin en MaterialSal CREATE TRIGGER T1 AFTER INSERT ON MATERIALSAL FOR EACH ROW DECLARE aux NUMBER; BEGIN SELECT M.precio * :new.cantidad INTO aux FROM MATERIAL M WHERE M.codm = :new.codm; UPDATE SALIDA S SET coste_material = coste_material + aux WHERE S.cods = :new.cods; END;

Solucin Ejercicio 3
a) Enumere las operaciones sobre la base de datos que podran violar la restriccin b) Disee un trigger para controlar alguna de las operaciones enumeradas en la cuestin anterior. La
MODIFICACIN del atributo PRESUPUESTO de la relacin PROYECTO

operacin que viola la restriccin debe ser abortada.


CREATE TRIGGER T1 AFTER UPDATE OF presupuesto ON proyecto FOR EACH ROW WHEN new.presupuesto < old.presupuesto; BEGIN RAISE_APPLICATION_ERROR(-20000, El presupuesto del proyecto no puede disminuir); END;

Potrebbero piacerti anche