Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Si se realizan bloqueos cuando se leen los datos y qu tipos de bloqueos se solicitan.
Duracin de los bloqueos de lectura.
Si una operacin de lectura que hace referencia a filas modificadas por otra transaccin:
1.
Se bloquea hasta que se libera el bloqueo exclusivo de la fila.
2.
Recupera la versin confirmada de la fila que exista en el momento en el que se inici la
instruccin o la transaccin.
3.
Lee la modificacin de los datos no confirmada.
La seleccin de un nivel de aislamiento de transaccin no afecta a los bloqueos adquiridos para proteger
las modificaciones de datos. Siempre se obtiene un bloqueo exclusivo en los datos modificados de una
transaccin, bloqueo que se mantiene hasta que se completa la transaccin, independientemente del
nivel de aislamiento seleccionado para la misma. En el caso de las operaciones de lectura, los niveles de
aislamiento de transaccin definen bsicamente el nivel de proteccin contra los efectos de las
modificaciones que realizan otras transacciones.
Un nivel de aislamiento menor significa que los usuarios tienen un mayor acceso a los datos
simultneamente, con lo que aumentan los efectos de la simultaneidad que pueden experimentar,
como las lecturas de datos sucios o la prdida de actualizaciones. Por el contrario, un nivel de
aislamiento mayor reduce los tipos de efectos de simultaneidad, pero requiere ms recursos del sistema
y aumenta las posibilidades de que una transaccin bloquee a otra. El nivel de aislamiento apropiado
depende del equilibrio entre los requisitos de integridad de los datos de la aplicacin y la sobrecarga de
cada nivel de aislamiento. El nivel de aislamiento superior, que es serializable, garantiza que una
transaccin recuperar exactamente los mismos datos cada vez que repita una operacin de lectura,
aunque para ello aplicar un nivel de bloqueo que puede afectar a los dems usuarios en los sistemas
multiusuario. El nivel de aislamiento menor, de lectura sin confirmar, puede recuperar datos que otras
transacciones han modificado pero no confirmado. En este nivel se pueden producir todos los efectos
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 58
secundarios de simultaneidad, pero no hay bloqueos ni versiones de lectura, por lo que la sobrecarga se
reduce.
En la tabla siguiente se muestran los efectos secundarios de la simultaneidad que permiten los distintos
niveles de aislamiento.
Nivel de aislamiento Lectura de datos sucios Lectura no repetible Fantasma
Lectura no confirmada S S S
Lectura confirmada No S S
Lectura repetible No No S
Instantnea No No No
Serializable No No No
Las transacciones se deben ejecutar en un nivel de aislamiento de lectura repetible, al menos, para
evitar las prdidas de actualizaciones que pueden producirse cuando dos transacciones recuperan la
misma fila, y a continuacin la actualizan segn los valores recuperados originalmente. Si las dos
transacciones actualizan las filas con una nica instruccin UPDATE y no basan la actualizacin en los
valores recuperados previamente, la prdida de las actualizaciones no puede producirse en el nivel de
aislamiento predeterminado de lectura confirmada.
La tabla de bloqueo en InnoDB se almacena en forma tan eficiente que no se necesitan bloqueos
escalables: generalmente varios usuarios estn habilitados a bloquear cada fila de la base de datos, o
cualquier subconjunto de filas, sin que InnoDB incurra en falta de memoria.
En los trminos de los niveles de aislamiento de transacciones SQL:1992, el nivel predeterminado en
InnoDB es REPEATABLE READ. En MySQL 5.0, InnoDB ofrece los cuatro niveles de aislamiento de
transacciones descriptos por el estndar SQL. Se puede establecer el nivel predeterminado de
aislamiento por todas las conexiones mediante el uso de la opcin --transaction-isolation en la lnea de
comandos o en ficheros de opciones. Por ejemplo, se puede establecer la opcin en la seccin [mysqld]
de my.cnf de este modo:
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 59
[mysqld]
transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED
| REPEATABLE-READ | SERIALIZABLE}
Un usuario puede cambiar el nivel de aislamiento de una sesin individual o de todas las nuevas
conexiones con la sentencia SET TRANSACTION. Su sintaxis es la siguiente:
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL
{READ UNCOMMITTED | READ COMMITTED
| REPEATABLE READ | SERIALIZABLE}
Ntese que se usan guiones en los nombres de niveles de la opcin --transaction-isolation, pero no en la
sentencia SET TRANSACTION.
El comportamiento predeterminado es establecer el nivel de aislamiento a partir de la prxima
transaccin que se inicie. Si se emplea la palabra clave GLOBAL, la sentencia establece el nivel
predeterminado de la transaccin globalmente para todas las nuevas conexiones creadas a partir de ese
punto (pero no en las existentes). Se necesita el privilegio SUPER para hacer esto. Utilizando la palabra
clave SESSION se establece el nivel de transaccin para todas las futuras transacciones ejecutadas en la
actual conexin.
Cualquier cliente es libre de cambiar el nivel de aislamiento de la sesin (incluso en medio de una
transaccin), o el nivel de aislamiento para la prxima transaccin.
Los niveles de aislamiento de transacciones globales y de sesin pueden consultarse con estas
sentencias:
SELECT @@global.tx_isolation;
SELECT @@tx_isolation;
InnoDB y AUTOCOMMIT
En InnoDB, toda la actividad del usuario se produce dentro de una transaccin. Si el modo de ejecucin
automtica (autocommit) est activado, cada sentencia SQL conforma una transaccin individual por s
misma. MySQL siempre comienza una nueva conexin con la ejecucin automtica habilitada.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 60
Si el modo de ejecucin automtica se deshabilit con SET AUTOCOMMIT = 0, entonces puede
considerarse que un usuario siempre tiene una transaccin abierta. Una sentencia SQL COMMIT o
ROLLBACK termina la transaccin vigente y comienza una nueva. Ambas sentencias liberan todos los
bloqueos InnoDB que se establecieron durante la transaccin vigente. Un COMMIT significa que los
cambios hechos en la transaccin actual se convierten en permanentes y se vuelven visibles para los
otros usuarios. Por otra parte, una sentencia ROLLBACK, cancela todas las modificaciones producidas en
la transaccin actual.
Si la conexin tiene la ejecucin automtica habilitada, el usuario puede igualmente llevar a cabo una
transaccin con varias sentencias si la comienza explcitamente con START TRANSACTION o BEGIN y la
termina con COMMIT o ROLLBACK.
Un ejemplo de lectura consistente en InnoDB
Suponiendo que se est ejecutando en el nivel de aislamiento predeterminado REPEATABLE READ,
cuando se realiza una lectura consistente -esto es, una sentencia SELECT ordinaria-, InnoDB le otorga a
la transaccin un punto en el tiempo (timepoint) del momento en que se realiz la consulta. Si otra
transaccin elimina una fila y confirma la accin en un momento posterior a dicho punto, no se ver la
fila como borrada. Las inserciones y actualizaciones se tratan del mismo modo.
Se puede obtener un timepoint ms reciente confirmando la transaccin actual y emitiendo un nuevo
SELECT. Esto se llama control de concurrencia multiversin.
Usuario A Usuario B
SET AUTOCOMMIT=0; SET AUTOCOMMIT=0;
tiempo
| SELECT * FROM t;
| empty set
| INSERT INTO t VALUES (1, 2);
|
v SELECT * FROM t;
empty set
COMMIT;
SELECT * FROM t;
empty set
COMMIT;
SELECT * FROM t;
---------------------
| 1 | 2 |
---------------------
1 row in set
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 61
En este ejemplo, el usuario A podr ver la fila insertada por B solamente cuando B haya confirmado la
insercin y A haya confirmado tambin, de modo que su timepoint avance e incluya la insercin
confirmada por B.
Si se desea ver el ms reciente estado de la base de datos, se debera emplear ya sea el nivel de
aislamiento READ COMMITTED o bien una lectura con bloqueo:
SELECT * FROM t LOCK IN SHARE MODE;
MySQL comienza cada conexin de cliente con el modo de ejecucin automtica (autocommit)
habilitado por defecto. Cuando la ejecucin automtica est habilitada, MySQL realiza la confirmacin
luego de cada sentencia SQL, si dicha sentencia no devuelve un error.
Si se tiene desactivado el modo de ejecucin automtica y se cierra una conexin sin hacer una
confirmacin explcita de una transaccin, MySQL cancelar dicha transaccin.
Si una sentencia SQL devuelve un error, la confirmacin o cancelacin dependen del error.
Las siguientes sentencias SQL (y sus sinnimos) provocan en MySQL una confirmacin implcita de la
transaccin en curso:
ALTER TABLE, BEGIN, CREATE INDEX, DROP DATABASE, DROP INDEX, DROP TABLE, LOAD
MASTER DATA, LOCK TABLES, RENAME TABLE, SET AUTOCOMMIT=1, START TRANSACTION,
TRUNCATE, UNLOCK TABLES.
Antes de MySQL 5.0.8, CREATE TABLE provocaba la confirmacin si se empleaba el registro
binario (binary logging). A partir de MySQL 5.0.8, las sentencias CREATE TABLE, TRUNCATE
TABLE, DROP DATABASE, y CREATE DATABASE provocan una confirmacin implcita.
La sentencia CREATE TABLE en InnoDB se procesa como una transaccin individual. Esto
significa que un ROLLBACK emitido por el usuario no cancelar las sentencias CREATE TABLE
hechas durante una transaccin.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 62
4.4 Instrucciones COMMIT y ROLLBACK
Por defecto, MySQL se ejecuta en modo autocommit. Esto significa que tan pronto como se ejecuta una
sentencia se actualiza (modifica) la tabla, MySQL almacenar la actualizacin en disco.
Si se estn usando tablas de transaccin segura (como InnoDB o BDB), se puede poner MySQL en modo
no-autocommit con el comando siguiente:
SET AUTOCOMMIT=0
Despus de desconectar el modo autocommit asignando cero a la variable AUTOCOMMIT, se debe usar
COMMIT para almecenar los cambios en disco o ROLLBACK si se quieren ignorar los cambios hechos
desde el principio de la transaccin.
Si se quiere desactivar el modo autocommit para una serire de sentencias, se puede usar una sentencia
START TRANSACTION:
Se puede usar BEGIN y BEGIN WORK en lugar de START TRANSACTION para iniciar unatransaccin.
START TRANSACTION fue aadido en MySQL 4.0.11; es la sintaxis SQL-99 y es el modo recomendado
para empezar una transaccin. BEGIN y BEGIN WORK estn disponibles desde MySQL 3.23.17 y 3.23.19,
respectivamente.
Si no se estn usando tablas de transaccin segura, cualquier cambio ser almacenado inmediatamente,
independientemente del estado del modo autocommit.
Si se usa una sentencia ROLLBACK despus de actualizar una tabla no transaccional, se obtendr un
error (ER_WARNING_NOT_COMPLETE_ROLLBACK) como un aviso. Todas las tablas de transaccin
segura sern restauradas, pero cualquier tabla de transaccin no segura no cambiar.
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1
WHERE type=1;
UPDATE table2 SET summmary=@A WHERE
type=1;
COMMIT;
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 63
Unidad 5. Vistas
5.1 Definicin y Objetivo de las Vistas
Una vista o tabla virtual es un objeto de la base de datos que est definida en trminos de SELECT
(regresa los datos deseados para producir la vista).
Sintaxis:
Las vistas y tablas comparten el mismo namespace de tal forma que MySQL enviar un error en caso
de que ya exista una tabla o vista con el mismo nombre.
El comando REPLACE solo es aplicable para vistas y no para tablas.
Beneficios de una vista:
Acceso simplificado a los datos
Despliega diferentes datos para usuarios diferentes
Puede preservar la estructura de la tabla original en la cual estaba basada y minimizar el
impacto en las aplicaciones
5.2 Instrucciones para la Administracin de Vistas
Para crear una vista se utiliza el comando CREATE VIEW
Para modificar la consulta select de una vista se utiliza la clausula ALTER VIEW.
CREATE [or REPLACE] VIEW view_name
[(column_list)] AS
Select statement;
ALTER VIEW ejemplo AS
SELECT id, nombre
FROM producto
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 64
La eliminacin de una vista se realiza con el comando DROP VIEW.
Sintaxis y Ejemplo:
DROP VIEW ejemplo;
DROP VIEW IF EXISTS ejemplo;
CREATE VIEW ejemplo AS
SELECT producto.nombre, proveedor.nombre
FROM producto, proveedor, provee
WHERE provee.RFC= proveedor.RFC AND
provee.idproducto= producto.id;
CREATE VIEW ejemplo (productonombre, proveedornombre) AS
SELECT producto.nombre, proveedor.nombre
FROM producto, proveedor, provee
WHERE provee.RFC= proveedor.RFC AND
provee.idproducto= producto.id;
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 65
Unidad 6. Seguridad
6.1 Esquemas de Autorizacin
Los permisos pueden darse en varios niveles:
Nivel global
Los permisos globales se aplican a todas las bases de datos de un servidor dado. Estos permisos
se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.* otorgan y quitan
slo permisos globales.
Nivel de base de datos
Los permisos de base de datos se aplican a todos los objetos en una base de datos dada. Estos
permisos se almacenan en las tablas mysql.db y mysql.host . GRANT ALL ON db_name.* y
REVOKE ALL ON db_name.* otorgan y quitan slo permisos de bases de datos.
Nivel de tabla
Los permisos de tabla se aplican a todas las columnas en una tabla dada. Estos permisos se
almacenan en la tabla mysql.tables_priv. GRANT ALL ON db_name.tbl_name y REVOKE ALL
ON db_name.tbl_name otorgan y quitan permisos slo de tabla.
Nivel de columna
Los permisos de columna se aplican a columnas en una tabla dada. Estos permisos se almacenan
en la tabla mysql.columns_priv. Usando REVOKE, debe especificar las mismas columnas que se
otorgaron los permisos.
Nivel de rutina
Los permisos CREATE ROUTINE, ALTER ROUTINE, EXECUTE, y GRANT se aplican a rutinas
almacenadas. Pueden darse a nivel global y de base de datos. Adems, excepto para CREATE
ROUTINE, estos permisos pueden darse en nivel de rutinas para rutinas individuales y se
almacenan en la tabla mysql.procs_priv.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 66
6.2 Instrucciones GRANT Y REVOKE
Creacin de Usuarios. Comando CREATE USER
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
Este comando crea nuevas cuentas MySQL. Para cada cuenta, CREATE USER crea un nuevo
registro en la tabla mysql.user que no tiene permisos. Un error ocurre si la cuenta ya existe.
La cuenta puede tener una contrasea con la clusula opcional IDENTIFIED BY. En particular,
para especificar la contrasea en texto plano, omita la palabra clave PASSWORD. Para
especificar la contrasea como el valor hasheado retornado por la funcin PASSWORD() ,
incluya la palabra clave PASSWORD.
Eliminacin de usuarios. Comando DROP USER
Sintaxis:
DROP USER user [, user] ...
El comando DROP USER borra una o ms cuentas MySQL.
DROP USER como est en MySQL 5.0.0 borra slo cuentas que no tienen permisos. En MySQL
5.0.2, se modific para eliminar permisos de cuenta tambin. Esto significa que el
procedimiento para borrar una cuenta depende en su versin de MySQL.
Asignacin de permisos. Se utiliza el comando GRANT.
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
Visualizar permisos. Comando SHOW GRANTS para determinar los permisos que tiene la
cuenta.
Eliminar permisos. Se utiliza REVOKE para revocar los permisos mostrados por SHOW GRANTS.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 67
Sintaxis de REVOKE
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
Ejercicio 1:
I. Realizar el siguiente modelo relacional en mysql.
Crear la base de datos usuarios.
Crear las tablas docentes y alumnos.
Considerando los siguientes atributos:
II. Realiza cada una de las instrucciones indicadas a continuacin, desde el cliente MySQL:
1.- Creacin de usuarios
a) grant usage on *.* to Docente IDENTIFIED BY docente;
b) grant usage on *.* to alumno identified by alumno;
c) grant usage on * to anonimo@localhost identified by clave;
2. - Asignacin de privilegios
a) grant select on usuarios.docentes To docente;
b) grant select on usuarios.alumnos to alumno;
c) grant select, insert usuarios.alumnos to alumno;
Docentes
Clave
Nombre
Direccin
Telfono
Alumnos
No_control
Nombre
Edad
Semestre
Carrera
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 68
3.- Visualizacin de privilegios y usuarios
a) show grants for alumno;
b) show grants;
c) show grants for current_user;
d) show privileges \g
4. - Visualizacin de usuario actual
a) select user();
5.- Eliminacin de usuarios y privilegios
a) drop user alumno;
b) revoke select on usuarios.alumnos from alumno;
c) revoke insert on usuarios.alumnos from alumno;
d) drop user alumno;
Ejercicio 2:
Realiza cada una de las instrucciones indicadas a continuacin, desde el administrador de MySQL.
1.- crea un nuevo usuario denominado Responsable, establece nombre, host y password, as como
privilegios globales.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 69
2.-Asigna privilegios al usuario Responsable.
3.- Inicia una ventana de MS-DOS y cambia al directorio de MySQL.
program files\mysql\mysql Server 5.0\bin
4.- Ejecuta el cliente indicando el usuario con el que se conectara:
mysql -h host -u usuario -p
Ejemplo:
mysql -h localhost -u Responsable -p
5.- Establece la contrasea correspondiente.
6.- Ejecuta las siguientes sentencias.
a) use usuarios;
b) select user();
c) show tables;
d) select * from alumnos;
e) delete * from alumnos;
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 70
f) select * from docentes;
7.- Finaliza la sesin del cliente.
8.- En el administrador desconecta de la Base de datos (Disconnect from database).
9.- Selecciona Database Registration Info. Establece el usuario Responsable.
10.- Conctate a la Base de datos.
Unidad 7. Introduccin al SQL Procedural
7.1 Procedimientos Almacenados
Un procedimiento almacenado es un elemento de base de datos reutilizable almacenado que realiza
alguna operacin en la base de datos. Un procedimiento almacenado contiene cdigo SQL que puede,
entre otras cosas, insertar, actualizar o eliminar registros. Los procedimientos almacenados tambin
pueden alterar la estructura de la base de datos. Por ejemplo, puede utilizar un procedimiento
almacenado para aadir una columna de tabla o incluir borrar una tabla.
Un procedimiento almacenado tambin puede llamar a otro procedimiento almacenado, as como
aceptar entradas y devolver mltiples valores al procedimiento llamado en forma de parmetros de
salida.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 71
Un procedimiento almacenado es reutilizable en el sentido de que se puede reutilizar una versin
compilada del procedimiento para ejecutar una operacin de base de datos varias veces. Si sabe que
una tarea de base de datos se va a ejecutar muchas veces o que distintas aplicaciones van a ejecutar la
misma tarea, el uso de un procedimiento almacenado para ejecutar dicha tarea puede agilizar las
operaciones de base de datos.
Un Procedimiento Almacenado es un programa autocontrolado escrito en lenguaje del DBMS, son
almacenados como parte de la Base de Datos y sus metadatos.
Una vez creado un procedimiento almacenado, se puede invocar directamente desde una aplicacin, o
sustituir el nombre de una tabla o vista, por el nombre de procedimiento en clusulas SELECT. Los
procedimientos almacenados pueden recibir parmetros de entrada y retornar valores a la aplicacin.
Las ventajas de usar los procedimientos almacenados incluyen:
Diseo modular.
Aplicaciones que acceden la misma Base de Datos pueden compartir los procedimientos
almacenados, eliminando el cdigo doble y reduciendo el tamao de las aplicaciones.
El fcil mantenimiento.
Cuando un procedimiento se actualiza, los cambios se reflejan automticamente en todas las
aplicaciones, sin la necesidad de recompilar y relinkear. Las aplicaciones son compiladas slo
una vez para cada cliente.
Los procedimientos almacenados son ejecutados por el servidor, no por el cliente lo que reduce
el trfico en la red y mejora el performance o desempeo, especialmente para el acceso del
cliente remoto.
Estn almacenados en los servidores y asegurados por las medidas tomadas en la instalacin, lo
que impide que los usuarios normales puedan modificarlos e incluso desconocen su existencia.
Este es un elemento de gran valor en lo que a seguridad respecta.
Declaracion de un procedimiento:
CREATE PROCEDURE <nombre> (<parmetros>)
<declaraciones locales>
<cuerpo del procedimiento>;
Eliminar un procedimiento:
Llamada a un procedimiento:
CALL <nombre procedimiento> (<argumentos>);
Modos de un procedimiento:
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 72
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 73
Seleccin de tuplas utilizando cursores
Un cursor es un apuntador a una tupla con el resultado de una consulta
Un cursor debe ser:
* Declarado para ser usado:
DECLARE CURSOR <nombre> FOR <consulta>
* Abierto para recuperar las tuplas resultado de la consulta y posicionarlo antes de la primera
OPEN <nombre cursor>
* Cerrado para indicar que se termino el procesamiento
CLOSE <nombre cursor>
* El cursor avanza de tupla en tupla usando el comando FETCH
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 74
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 75
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 76
Pasos para crear un procedimiento almacenado desde el administrador de MySQl.
1. Seleccionar Procedures
2. Seleccionar New Procedure o CTR+N
3. Editar el procedimiento:
a. Establecer el nombre del procedimiento.
b. Establecer una descripcin del procedimiento.
c. Establecer parmetros de entrada o de salida.
4. Compilar el procedimiento
5. Ejecutar el procedimiento y establecer los datos de los parmetros de entrada.
6. Visualizar el DDL.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 77
Ejemplos:
1. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_update_editorial`(IN pid_editorial BIGINT,
IN pnombre varcHAR(30), IN pdireccion varcHAR(30))
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
update editorial set nombre = pnombre, direccion = pdireccion
where id_editorial = pid_editorial;
END;
2. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_delete_autor`(IN id BIGINT)
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Comentario establecido'
BEGIN
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 78
delete from autores where id_autor = id;
END;
3. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_Insert_autor`(IN nom varCHAR(30), IN ap
varcHAR(30))
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
insert into libros(nombre, apellidos) values (nom,ap);
END;
4. - CREATE DEFINER = 'root'@'localhost' PROCEDURE `sp_select_autor`()
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
select * from autores;
END;
Ejemplo con un parmetro de
salida (out).
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 79
CREATE PROCEDURE employee count (OUT emp_count INTEGER)
BEGIN
SELECT COUNT (*) INTO emp_count FROM Employee;
END;
7.2 Disparadores (Triggers)
Es un objeto que est alojado dentro de un SGBD cuyo propsito es realizar una tarea determinada por
el usuario.
Su nombre Trigger (Disparador) significa que se va a ejecutar al momento de ocurrir un evento y
condicin determinada, y no por invocacin manual hecha por el usuario.
Cada Trigger es la base de datos deber tener un nombre diferente.
Los triggers monitorean una base de datos y toman una accin cuando ocurre una condicin dada.
Un Triggers o disparador es una rutina autnoma asociada con una tabla o vista que automticamente
realiza una accin cuando una fila en la tabla o la vista se inserta (INSERT), se actualiza (UPDATE), o
borra (DELETE).
Un Trigger nunca se llama directamente. En cambio, cuando una aplicacin o usuario intenta insertar,
actualizar, o anular una fila en una tabla, la accin definida en el disparador se ejecuta
automticamente (se dispara).
Componentes:
Evento
Condicin
Accin
Las ventajas de usar los Triggers son:
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 80
La entrada en vigor automtica de restricciones de los datos, hace que los usuarios entren slo
valores vlidos.
El mantenimiento de la aplicacin se reduce, los cambios a un triggers se refleja
automticamente en todas las aplicaciones que tienen que ver con la tabla sin la necesidad de
recompilar o relinquear.
Logs automticos de cambios a las tablas. Una aplicacin puede guardar un registro corriente
de cambios, creando un trigger que se dispare siempre que una tabla se modifique.
La notificacin automtica de cambios a la Base de Datos con alertas de evento en los triggers.
Los eventos pueden ser las sentencias INSERT, DELETE, UPDATE que modifican los datos de una tabla.
Los triggers se pueden ejecutar antes (BEFORE) y/o despus (AFTER) de que sean modificados los
datos.
Los triggers tienen dos palabras clave, OLD y NEW que se refieren a los valores que tienen las columnas
antes y despus de la modificacin. Los INSERT permiten NEW, los DELETE slo OLD y los UPDATE
ambas.
Un ejemplo de trigger seria uno asociado a la sentencia DELETE en una tabla de clientes, para impedir
que se elimine uno que tenga un saldo distinto de cero. Otro trigger seria guardar los datos que se
modifican de un cliente en otra base de datos que servira de auditora.
Ejemplo: trigger que elimina el valor del porcentaje en caso de que sea menor a 0 o mayor que 1 antes
de insertar un registro.
Estructura de un Trigger
1.- Timing (Momento)
Para una tabla: BEFORE, AFTER
CREATE TRIGGER test_before_insert
BEFORE INSERT ON test
FOR EACH ROW
BEGIN
IF NEW.percent < 0.0 OR
NEW.percent > 1.0 THEN
SET NEW.percent = NULL;
END IF;
END;
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 81
2.- Event: INSERT, UPDATE o DELETE
Tabla: ON table
3.- Type: (cuantas veces se ejecutar).
ROW varios MySQL solo utiliza Stament solo una vez por instruccin.
Usos de Triggers
Caractersticas Mejoras con Triggers
Seguridad Permite acceso a tablas de acuerdo a los valores de los
datos.
Auditoria Rastrea valores para operaciones de datos sobre tablas.
Integridad de datos Implementa complejas reglas de integridad.
Integridad referencial Implementan funcionalidad no estndar.
Replicacin de tabla Copia tablas en sincrona sobre replicas. Copias a otros
servidores.
Datos derivados Calcula valores derivados de datos automticamente:
Obtener valores de atributos calculados
Reglas de negocios
Eventos de conexin Registra eventos transparentemente.
Trigger Event Trigger Body
Trigger Event
Define el EVENTO que activar al Trigger
Afecta a las columnas deseadas:
UPDATE ON table_name
DELETE ON table_name
INSERT ON table_name
FOR EACH ROW
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 82
Trigger Body
Ejemplo:
Tablas Mutantes
Son aquellas tablas que se encuentran en un proceso de cambio (INSERT, UPDATE, DELETE).
Dado que los datos en las tablas tienen cambios pendientes, el Trigger de tipo ROW que es disparado
por dichos cambios, NO PUEDE realizar una consulta a la misma tabla.
Utilizando OLD y NEW
Con un Trigger ROW, es posible hacer referencia a los valores de una columna antes y despus del
cambio de los datos.
Operacin Valor Anterior Valor Nuevo
INSERT NULL Valor agregado
UPDATE Valor antes de actualizar Valor despus de actualizar
DELETE Valor antes de borrar NULL
Define la ACCIN que debe realizar el
trigger.
BEGIN
END
CREATE TRIGGER trigger_name
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE } ON
Table_name
FOR EACH ROW
Triggered_statement
CREATE TRIGGER Capital_bi
BEFORE INSERT ON Capital
FOR EACH ROW
SET NEW.Population =
IF (NEW. Population < 0, 0, TRUNCATE (NEW.Population, -3));
NO es posible realizar consultas (SELECT) a
la misma tabla que ser actualizada.
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 83
Todos los Trigger de una tabla son eliminados cuando la tabla es borrada.
Para crear Triggers se deben tener SUPER privilegios.
Para asignar un valor a una columna (SET NEW.column=value) se tiene que poseer el privilegio
UPDATE para la columna.
Para usar NEW.column en una expresin para hacer referencia a una nueva columna, se tiene
que poseer el privilegio SELECT para la columna.
Ejemplo:
Triggers vs Procedimientos
Trigger Procedimiento
Usa CREATE TRIGGER
Usa CREATE PROCEDURE
Invocado implcitamente
Invocado explcitamente
No se permite CALL, iniciar TRANSACCIONES,
o asociar a una VISTA o TABLA TEMPORAL
Se invoca mediante CALL
Una tabla no puede tener dos triggers para la misma combinacin de Timing and Event.
Puede existir un trigger de tipo AFTER INSERT y BEFORE INSERT, pero no puede existir dos
triggers para AFTER INSERT.
Ejemplo general
CREATE TRIGGER Capital_bu
BEFORE UPDATE ON Capital
FOR EACH ROW
BEGIN
SET @country = OLD.Country;
SET @capital_old = OLD.Capital;
SET @capital_new = NEW.Capital;
END;
DROP TRIGGER trigger_name;
Taller de Base de Datos
Clave: SCS -0432
ITSP-ISC Pgina 84
Crearemos la tabla de clientes y le ponemos algunos registros:
CREATE TABLE clientes(
id int not null auto_increment,
nombre varchar(100),
seccion varchar(10),
PRIMARY KEY(id),
KEY(nombre)
);
INSERT INTO clientes (nombre, seccion) VALUES
('Miguel','informatica'),
('Rosa','comida'),
('Maria','ropa'),
('Albert','informatica'),
('Jordi','comida');
Y una tabla que ser la que guardar los datos de la "auditoria"
CREATE TABLE auditoria_clientes
(
id int not null auto_increment,
nombre varchar(100),
anterior_seccion varchar(10),
usuario varchar(40),
modificado datetime,
primary key(id)
);
y finalmente un trigger que se disparar cada vez que alguien modifique un dato de la tabla clientes y
lo guardar en una tabla junto al nombre del usuario y la fecha.
CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes
FOR EACH ROW
INSERT INTO auditoria_clientes(name, anterior_seccion, usuario, modificado )
VALUES (OLD.nombre, OLD.seccion, CURRENT_USER(), NOW() );