Está en la página 1de 22

UNIVERSIDAD NACIONAL DE INGENIERIA

FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

TALLER DE HERRAMIENTAS
DE SOFTWARE

DUODECIMA SESION

DOCENTE:

Ing. Ysabel Rojas S.

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 1 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

HISTORIAL DE LAS REVISIONES


Fecha:
Autor/es - Cargo:
Revisado:
Control de cambios:
Versin:

01/03/2011
Ing. Ysabel Rojas Sols
1.0

(Indicar cambios si se
trata de una versin
de documento)

Fecha
01/03/11

Rev.1.0

Autor
Ysabel Rojas

Versin
1.0

Referencia del Cambio

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 2 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

AGENDA DECIMA SESION:


1.1 PROCEDIMIENTOS ALMACENADOS:.................................... 4
STORE PROCEDURES .............................................................. 4
2. TRANSACCIONES EN SQL SERVER:..................................... 13
TRANSACTION ............................................................................ 13
3. TRIGGERS Y DESENCADENADORES ................................. 16

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 3 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

DECIMO PRIMERA SESION


1.1 PROCEDIMIENTOS ALMACENADOS:
STORE PROCEDURES
Los procedimientos almacenados son conjuntos de sentencias en lenguaje Transact SQL
que pueden almacenarse en el propio servidor.
La potencia de los procedimientos almacenados de SQL Server radican en que permiten
almacenar funciones y procedimientos compuestos por varias instrucciones, introducir
saltos, bucles, etc. Tambin se pueden compilar procedimiento escritos en lenguaje C,
para ampliar su potencia modularmente.
EJEMPLO 1
Crear un procedimiento para recuperar el nombre de un Cliente, cuyo cdigo se pasa por
parmetro.
CREATE PROCEDURE ObtenerNombre @IDCLIENTE varchar(11) AS
SELECT NOMBRECOMPAA
FROM CLIENTES
WHERE IDCLIENTE = @IDCLIENTE
Con esta sentencia, se crea un procedimiento almacenado, de nombre ObtenerNombre, al
que se le pasa un parmetro, llamado @idcliente, de tipo varchar(11), que realiza una
consulta para obtener el nombre de la tabla clientes, cuyo cdigo coincida con el
parmetro. De esta forma, si queremos obtener el nombre del cliente cuyo cdigo sea
'8011', deberemos ejecutar el procedimiento pasndole como argumento este valor:
Las llamadas a procedimientos almacenados se pueden realizar de las siguientes formas
1) Pasando los argumentos en el mismo orden que en el que se han declarado
Exec ObtenerNombre '8011'
esta sentencia produce la siguiente la salida

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 4 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

2) Pasando los argumentos nombrados. En este caso no hace falta que los parmetros
vayan en el mismo orden.
OBTENERNOMBRE @AU_ID = 'ANTON'
EJEMPLO 2
Crear el procedimiento que me permita listar los pedidos de un cliente realizados dentro
un periodo, mostrando el vendedor que lo atendi, la fecha de pedido, fecha de envo y la
fecha de entrega

CREATE PROCEDURE LISTARPEDIDOS


(
@IDCLIENTE VARCHAR(7),
@FECHAINICIAL SMALLDATETIME,
@FECHAFINAL SMALLDATETIME
)
AS
SELECT
PEDIDOS.IDPEDIDO,CLIENTES.NOMBRECOMPAA,EMPLEADOS.NOMBRE +
EMPLEADOS.APELLIDOS AS
EMPLEADO,PEDIDOS.CARGO,PEDIDOS.FECHAPEDIDO
PEDIDOS.FECHAENVIO,PEDIDOS.FECHAENTREGA
FROM PEDIDOS
INNER JOIN CLIENTES ON PEDIDOS.IDCLIENTE=CLIENTES.IDCLIENTE
INNER JOIN EMPLEADOS ON PEDIDOS.IDEMPLEADO=EMPLEADOS.IDEMPLEADO
WHERE PEDIDOS.IDCLIENTE=@IDCLIENTE AND FECHAPEDIDO
BETWEEN @FECHAINICIAL AND @FECHAFINAL
Ejecutando el procedimiento almacenado
EXEC LISTARPEDIDOS '8011','12/05/95','22/12/96'

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 5 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

1.2 USO DE OUTPUT: PARMETROS POR REFERENCIA


Al ejecutar las anteriores sentencias, se obtiene el resultado directamente en la ventana
que se tenga abierta en SQL Server. Pero si se quiere obtener un parmetro de salida,
como resultado de la ejecucin del procedimiento, la solucin para este caso es utilizar la
palabra reservada OUTPUT para los argumentos de salida.
EJEMPLO 3
Se quiere obtener el nmero de clientes y el nmero de productos que se tiene en la base
de datos crear el procedimiento almacenado y las instrucciones de ejecucin.
Para ello se creara el procedimiento almacenado que muestra el Cdigo fuente.
CREATE PROCEDURE num_clientes_productos @clientes int OUTPUT, @Productos
int OUTPUT AS
SELECT * FROM clientes
SELECT @clientes = @@ROWCOUNT
SELECT FROM productos
SELECT @productos = @@ROWCOUNT
RETURN (0)
Bsicamente es similar a los anteriores ejemplos. Detrs de la palabra reservada
PROCEDURE damos el nombre del procedimiento almacenado, y a continuacin
proporcionamos los parmetros, junto con su tipo (que en este caso es entero), y diremos
sin stos son de salida, en cuyo caso especificamos la palabra reservada OUTPUT a
continuacin. Tras la palabra reservada AS se codifica el cuerpo del procedimiento.
Primero contamos todas las filas de la tabla clientes, realizando un SELECT * FROM
clientes. A continuacin devolvemos en el parmetro @clientes el valor obtenido,
utilizando @@ROWCOUNT
Acto seguido se realiza lo mismo para la tabla Productos. Ntese como la forma de asignar
un valor a un atributo es mediante una sentencia SELECT, igualando el parmetro al valor
La funcin @@ROWCOUNT devuelve el nmero de filas que se han seleccionado. Es
equivalente a la sentencia que aparece en el Cdigo fuente
SELECT COUNT(*) FROM Productos
Se podra sustituir por Cdigo fuente
CREATE PROCEDURE num_clientes_productos @clientes int OUTPUT, @clientes int
OUTPUT AS
SELECT @clientes = (SELECT COUNT(*) FROM clients)
SELECT @productos = (SELECT COUNT(*) FROM Productos)
RETURN (0)
Para ejecutar el anterior procedimiento, seguiremos los siguientes pasos

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 6 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

Declarar las variables que vamos a utilizar para llamar al procedimiento. La sintaxis para
declarar una variable es utilizar la palabra reservada DECLARE, seguido del nombre de la
variable y el tipo
DECLARE @num_clientes int
DECLARE @num_Productos int
Ejecutar el procedimiento. La sintaxis es utilizar la palabra reservada EXEC, seguida del
nombre del procedimiento, y los parmetros, separados por comas, especificando si son
de retorno
EXEC num_clientes_productos @num_clientes OUTPUT, @num_productos OUTPUT
Mostrar los resultados
SELECT clientes = @num_clientes, productos = @num_productos
Tras ejecutar las anteriores sentencias, obtendremos como resultado el siguiente listado

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 7 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

1.3 USO DE LA FUNCIN EXECUTE


Ejecuta una funcin definida por el usuario que devuelve valores escalares, un
procedimiento del sistema, un procedimiento almacenado definido por el usuario o un
procedimiento almacenado extendido
Admite tambin la ejecucin de una cadena de caracteres. Ejemplo
DECLARE @TABLE VARCHAR(25
SET @TABLE='CLIENTES'
EXEC ('SELECT * FROM ' + @TABLE

1.4 MODIFICAR UN PROCEDIMIENTO ALMACENADO


Si queremos modificar un procedimiento almacenado, ejecutaremos la sentencia ALTER
PROCEDURE, seguido del nombre del procedimiento. Por ejemplo, si queremos hacer
cambios el procedimiento almacenado, creado en el anterior ejemplo, escribiremos el
Cdigo fuente
ALTER PROCEDURE num_clientes_productos @clientes int OUTPUT, @productos int
OUTPUT AS
SELECT @clientes = (SELECT COUNT(*) FROM clientes where pais=alemania)
SELECT @productos = (SELECT COUNT(*) FROM productos where preciounidad>10)
RETURN (0)

1.5 ELIMINAR UN PROCEDIMIENTO ALMACENADO


Si queremos borrar un procedimiento almacenado, ejecutaremos la sentencia DROP
PROCEDURE, seguido del nombre del procedimiento. Por ejemplo, si queremos borrar el
procedimiento almacenado, creado en el anterior ejemplo, escribiremos el Cdigo fuente
DROP PROCEDURE num_clientes_clientes

Ejemplos de Procedimientos Almacenados:

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 8 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

Utilizar EXECUTE con DEFAULT


El ejemplo siguiente crea un procedimiento almacenado con un valor predeterminado para
su parametro. Cuando se ejecuta el procedimiento,el valor predeterminado se insertan
como parmetro si no se pasa ningn valor en la llamada o si se especifica el valor
predeterminado.
CREATE PROCEDURE LISTARCLIENTES(@PAIS VARCHAR(25) ='ARGENTINA')
AS
SELECT IDCLIENTE,NOMBRECOMPAA,DIRECCIN,PAS FROM CLIENTES
WHERE PAS=@PAIS
Observe las distintas formas en las que se puede utilizar la palabra clave DEFAULT
Sino se especifica el valor del parametro se asume entonces el valor por defecto es decir
se tomara entonces el valor ARGENTINA
EXEC LISTARCLIENTES DEFAULT

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 9 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

1.6 PROCEDIMIENTOS ALMACENADOS DE SISTEMA


SQL Server nos ofrece una serie de procedimientos almacenados ya implementados, es
decir, listos para ejecutar, cada uno con su propio objetivo o fin. Por ejemplo, si deseamos
saber los usuarios conectados a nuestro sistema, podemos elaborar una consulta SELECT
sobre la tabla de sistema que contiene los usuarios conectados, o como otra alternativa
ejecutar el procedimiento almacenado sp_who.

sp_who
Si escribimos sp_who, obtendremos una lista con todos los usuarios conectados,

sp_tables
Si queremos obtener una lista con todas las tablas del sistema, disponemos de otro
procedimiento almacenado denominado sp_tables.

sp_columns
Si deseamos conocer todos los atributos de una tabla, deberemos ejecutar sp_columns
seguido del nombre de la tabla.
Por ejemplo, para listar los atributos de la tabla Categorias ejecutamos

sp_columns Categorias
y obtenemos el resultado de la Figura

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 10 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

UTILIZAR EXECUTE CON UN PROCEDIMIENTO ALMACENADO EXTENDIDO


El ejemplo siguiente utiliza el procedimiento almacenado extendido XP_CMDSHELL para
enumerar un directorio de todos los archivos con una extensin de nombre de archivo .exe.

XP_CMDSHELL
Ejecuta una cadena de comandos como comando del sistema operativo y devuelve el
resultado como filas de texto.
USE MASTER
EXECUTE XP_CMDSHELL 'DIR C: *.EXE'

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 11 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

1.7 UTILIZAR COMANDOS DE RED DE WINDOWS NT


Este ejemplo muestra el uso de xp_cmdshell en un procedimiento almacenado. Este
ejemplo notifica a los usuarios (con net send) que se va a cerrar SQL Server, detiene el
servidor (con net pause) y, despus, apaga el servidor (con net stop).
CREATE PROCEDURE APAGADO10
AS
EXEC xp_cmdshell net send /domain:SQL_USERS ''SQL Server shutting down
in 10 minutes. No more connections allowed.', no_output
EXEC xp_cmdshell 'net pause sqlserver'
WAITFOR DELAY '00:05:00'
EXEC xp_cmdshell 'net send /domain: SQL_USERS ''SQL Server shutting down
in 5 minutes.', no_output
WAITFOR DELAY '00:04:00'
EXEC xp_cmdshell 'net send /domain:SQL_USERS ''SQL Server shutting down
in 1 minute. Log off now.', no_output
WAITFOR DELAY '00:01:00'
EXEC xp_cmdshell 'net stop sqlserver', no_output
Existe una gran variedad de procedimientos almacenados, como por ejemplo para crear
dispositivos, para comprobar el espacio usado por una tabla, etc. que en este nivel aun no
ser visto

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 12 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

2. TRANSACCIONES EN SQL SERVER:


TRANSACTION
Entre las habilidades de todo Sistema Gestor de Bases de Datos Relaciones tiene que
estar la de permitir al programador crear transacciones. El SQL Server nos permite trabajar
con transacciones de manera sencilla y eficaz.
Una transaccin es un conjunto de operaciones que van a ser tratadas como una nica
unidad.
La transaccin ms simple en SQL Server es una nica sentencia SQL. Por ejemplo una
sentencia como esta:
UPDATE PRODUCTOS SET PRECIOUNIDAD=20 WHERE NOMBREPRODUCTO
=QUESO LAIVE
Esta es una transaccin autocommit, una transaccin autocompletada. Cuando enviamos
esta sentencia al SQL Server se escribe en el fichero de transacciones lo que va a ocurrir y
a continuacin realiza los cambios necesarios en la base de datos. Si hay algn tipo de
problema al hacer esta operacin el SQL Server puede leer en el fichero de transacciones
lo que se estaba haciendo y si es necesario puede devolver la base de datos al estado en
el que se encontraba antes de recibir la sentencia.
Este tipo de transacciones no requieren de la intervencin humana puesto que el sistema
se encarga de todo. Sin embargo si hay que realizar varias operaciones y queremos que
sean tratadas como una unidad tenemos que crear esas transacciones de manera
explcita.
La sentencia que se utiliza para indicar el comienzo de una transaccin es BEGIN TRAN.
Si alguna de las operaciones de una transaccin falla hay que deshacer la transaccin en
su totalidad para volver al estado inicial en el que estaba la base de datos antes de
empezar. Esto se consigue con la sentencia ROLLBACK TRAN.
Si todas las operaciones de una transaccin se completan con xito hay que marcar el fin
de una transaccin para que la base de datos vuelva a estar en un estado consistente con
la sentencia COMMIT TRAN.
Un ejemplo Trabajaremos con la base de datos SUPERMERCADOSNEPTUNO en
nuestros ejemplos.Vamos a realizar una transaccin que modifica el precio de dos
productos de la base de datos.

USE SUPERMERCADOSNEPTUNO

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 13 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

DECLARE @Error int


--Declaramos una variable que utilizaremos para almacenar un posible cdigo de
error
BEGIN TRAN
--Iniciamos la transaccin
UPDATE Productos SET PrecioUnidad=2.5 WHERE NombreProducto =Queso de
cabra
--Ejecutamos la primera sentencia
SET @Error=@@ERROR
--Si ocurre un error almacenamos su cdigo en @Error
--y saltamos al trozo de cdigo que deshara la transaccin. Si, eso de ah es un
--GOTO, el demonio de los programadores, pero no pasa nada por usarlo
--cuando es necesario
IF (@Error<>0) GOTO TratarError
--Si la primera sentencia se ejecuta con xito, pasamos a la segunda
UPDATE Productos SET PrecioUnidad=2.5 WHERE NombreProducto=Queso de
cabra
SET @Error=@@ERROR
--Y si hay un error hacemos como antes
IF (@Error<>0) GOTO TratarError
--Si llegamos hasta aqu es que los dos UPDATE se han completado con
--xito y podemos guardar la transaccin en la base de datos
COMMIT TRAN
TratarError:
--Si ha ocurrido algn error llegamos hasta aqu
If @@Error<>0 THEN
BEGIN
PRINT Ha ecorrido un error. Abortamos la transaccin
--Se lo comunicamos al usuario y deshacemos la transaccin
--todo volver a estar como si nada hubiera ocurrido
ROLLBACK TRAN
END
Como se puede ver para cada sentencia que se ejecuta miramos si se ha producido o no
un error, y si detectamos un error ejecutamos el bloque de cdigo que deshace la
transaccin.
NOTA: Hay una interpretacin incorrecta en cuanto al funcionamiento de las transacciones
que esta bastante extendida. Mucha gente cree que si tenemos varias sentencias dentro
de una transaccin y una de ellas falla, la transaccin se aborta en su totalidad. Nada ms
lejos de la realidad! Si tenemos dos sentencias dentro de una transaccin.

USE SUPERMERCADOABC
BEGIN TRAN

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 14 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

UPDATE PRODUCTOS
SET PRECIOUNIDAD=2.5 WHERE NOMBREPRODUCTO=QUESO CABRA
UPDATE PRODUCTOS
SET PRECIOUNIDAD=2.5 WHERE NOMBREPRODUCTO=QUESO CABRA
COMMIT TRAN
Estas dos sentencias se ejecutarn como una sola. Si por ejemplo en medio de la
transaccin (despus del primer update y antes del segundo) hay un corte de electricidad,
cuando el SQL Server se recupere se encontrar en medio de una transaccin y, o bien la
termina o bien la deshace, pero no se quedar a medias.El error est en pensar que si la
ejecucin de la primera sentencia da un error se cancelar la transaccin. El SQL Server
slo se preocupa de ejecutar las sentencias, no de averiguar si lo hacen correctamente o si
la lgica de la transaccin es correcta. Eso es cosa nuestra. Por eso en el ejemplo que
tenemos ms arriba para cada sentencia de nuestro conjunto averiguamos si se ha
producido un error y si es as actuamos en consecuencia cancelando toda la operacin.
CREATE PROCEDURE INSERTADETALLE
@IDPEDIDO INT,
@IDPRODUCTO INT,
@CANT INT,
@PRECIO MONEY
AS
DECLARE @ERROR INT
SET NOCOUNT ON
IF NOT EXISTS(SELECT * FROM PEDIDOS WHERE IDPEDIDO=@IDPEDIDO)
PRINT 'NO EXISTE EL NUMERO DE PEDIDO PARA EL DETALLE DE PEDIDO ESPECIFICADO'
ELSE
BEGIN
BEGIN TRANSACTION
INSERT INTO [DETALLES DE PEDIDOS](IDPEDIDO,IDPRODUCTO,PRECIOUNIDAD,CANTIDAD)
VALUES(@IDPEDIDO,@IDPRODUCTO,@PRECIO,@CANT)
PRINT 'SE HA INSERTADO EL DETALLE DE PEDIDO'
SET @ERROR=@@ERROR
IF (@ERROR<>0) GOTO TRATARERROR
UPDATE PRODUCTOS SET UNIDADESENEXISTENCIA=UNIDADESENEXISTENCIA-@CANT
PRINT 'SE HA DESCARGADO EL STOCK'
SET @ERROR=@@ERROR
IF (@ERROR<>0) GOTO TRATARERROR
COMMIT TRANSACTION
TRATARERROR:
IF (@@ERROR<>0)
BEGIN
PRINT 'NO ES POSIBLE LA ACTUALIZACION'
ROLLBACK TRANSACTION
END
END
GO
INSERTADETALLE 20572,2,10,3

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 15 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

3. TRIGGERS y DESENCADENADORES

3.1 CREACION DE TRIGGERS


Los disparadores de procedimiento, ms comnmente conocidos como triggers, se
comportan como un procedimiento almacenado, a diferencia que se ejecutan cuando
ocurre un evento sobre alguna tabla.
Entendemos por evento, cualquier accin del tipo:
INSERCIN
BORRADO
ACTUALIZACIN
La sintaxis de la sentencia de creacin de triggers es la siguiente:

CREATE TRIGGER nombre ON tabla FOR accion AS codigo


Donde accin especifica el evento que debe ocurrir para que se dispare el trigger, y que
puede ser:

UPDATE: actualizacin
INSERT: insercin
DELETE: borrado

Por ejemplo, si queremos crear un trigger llamado modificacin_Cliente sobre la tabla


Cliente que muestre un mensaje cada vez que se actualiza una tupla de la tabla,
deberemos escribir el Cdigo fuente

CREATE TRIGGER modificacion_cliente


ON Cliente
FOR UPDATE AS
print 'Han actualizado la tabla Clientes'
Para comprobar el funcionamiento de este trigger, podemos actualizar cualquier fila de la
tabla de clientes, por ejemplo con la sentencia que aparece en el Cdigo fuente

UPDATE clientes SET nombre = 'Antonio Moreno' WHERE idcliente = 'anton'

Con esto conseguimos dos cosas, actualizar el nombre del cliente cuyo cdigo es el
especificado a Miguel, y obtener el mensaje que se muestra como ejecucin del trigger de
actualizacin

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 16 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

Sin embargo, los triggers en SQL Server tienen una serie de limitaciones
1. No se puede disparar un trigger dentro de otro trigger, ya que dara lugar a un bucle
infinito
2. Por esta razn, un trigger no puede ejecutar instrucciones DDL (lenguaje de
definicin de datos
3. No se pueden ejecutar sentencias como SELECT INTO o de creacin de
dispositivos dentro de un trigger

3.2 ELIMINACION DE TRIGGERS


Para borrar un trigger, deberemos ejecutar la sentencia DROP TRIGGER
Por ejemplo, si queremos borrar el trigger anteriormente creado, ejecutaremos el Cdigo
fuente

DROP TRIGGER modificacion_cliente

3.3 MODIFICACION DE TRIGGERS


Para modificar un trigger, deberemos ejecutar la sentencia ALTER TRIGGER
Por ejemplo, si queremos modificar el trigger anteriormente creado, ejecutaremos el
Cdigo fuente

ALTER TRIGGER modificacion_cliente


ON Cliente
FOR UPDATE AS
Print 'los registros de la tabla Clientes han sido actualizados'
Como ya se ha comentado, los triggers o desencadenadores son una especie de
procedimientos almacenados, que se ejecutan cuando ocurre una accin dentro de la base
de datos. As, si por ejemplo se ejecuta una insercin, una actualizacin, o un borrado de
una tabla, se ejecutaran las sentencias definidas para el trigger en concreto de esa tabla
especfica.

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 17 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

Sintaxis
CREATE TRIGGER nombre
ON tabla
FOR [DELETE | INSERT | UPDATE
AS
Sentencias
Las palabras reservadas DELETE, INSERT y UPDATE corresponden a cada una de las
acciones para las cuales se puede definir un desencadenador dentro de la tabla
especificada
El bloque de sentencias permite prcticamente cualquier tipo de ellas dentro del lenguaje
T-SQL, pero con ciertas limitaciones. Por ejemplo, no se podr utilizar la sentencia select,
ya que un trigger no puede devolver datos al usuario, sino que simplemente se ejecuta
para cambiar o comprobar los datos que se van a insertar, actualizar o borrar.

3.4 LAS TABLAS DELETED E INSERTED


Dentro de la definicin de un trigger, podemos hacer referencia a un par de tablas lgicas,
cuya estructura es similar a la tabla donde se esta ejecutando el trigger; es decir, es una
copia de la tabla en la cual se van a insertar o borrar los datos, y que contiene,
precisamente, los datos que van a ser aadidos o borrados.
La utilidad de estas dos tablas es la de realizar comprobaciones entre los datos antiguos y
los nuevos. As, por ejemplo, si queremos recuperar los datos de la tabla que estamos
borrando, dentro del trigger, se deber ejecutar el siguiente cdigo

SELECT FROM DELET

3.5 TIPOS DE DESENCADENADORES


SQL-Server permite la definicin de varios tipos de triggers, entre los cuales cabe destacar
los siguientes:
DESENCADENADORES MLTIPLES
Para una misma tabla, se pueden definir distintos triggers para la misma accin, es
decir, si definimos un trigger para insert, y resulta que dicha tabla ya tena definido
un trigger para esa misma accin, se ejecutarn ambos triggers cuando ocurra
dicho evento sobre la tabla.

DESENCADENADORES RECURSIVOS
Se permite la recursividad entre las llamadas a los triggers, es decir, un trigger
puede llamar a su vez a otro, bien de forma directa, bien de forma indirecta

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 18 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

DESENCADENADORES ANIDADOS
si un trigger cambia una tabla en la que se encuentra definido otro trigger, se
provoca la llamada de este ltimo que, si a su vez vuelve a modificar otra tabla,
puede provocar la ejecucin de otro trigger, y as sucesivamente. Si se supera el
nivel de anidamiento permitido, se cancelar la ejecucin de los triggers.

3.6 RESOLUCIN DIFERIDA DE NOMBRES


La resolucin diferida de nombres es una utilidad que permite escribir triggers que hagan
referencia a tablas que no existen en el momento de la compilacin. Por ejemplo, el
siguiente cdigo hace referencia a una tabla ABC, que no existe en el momento de escribir
el trigger.
CREATE TRIGGER TRIGGER1
ON AUTHORS
FOR INSERT, UPDATE, DELETE
AS
SELECT A.NOMBRE, A.APELLIDOS
FROM CLIENTES A INNER JOIN ABC
ON A.IDCLIENTE = X.IDCLIENTE

3.7 HABILITACION / DESHABILITACION DE TRIGGERS


A) Para DESHABILITAR un trigger se hace de la siguiente manera
ALTER TABLE DETALLES
DISABLE TRIGGER ABC
B) Para HABILITAR un trigger se hace de la siguiente manera
ALTER TABLE DETALLES
ENABLE TRIGGER ABC

3.8 LIMITACIONES DE LOS TRIGGERS


Aunque ya se han comentado algunas de las limitaciones a la hora de programar triggers,
veamos en detalle las restricciones que implica la definicin de triggers

Un trigger slo se puede aplicar a una tabla


Aunque un trigger se defina dentro una sola base de datos, puede hacer referencia
a objetos que se encuentran fuera de la misma
La misma accin del desencadenador puede utilizarse para definir ms de un
trigger sobre la misma tabla

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 19 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

La opcin SET elegida dentro de la ejecucin de un desencadenador, volver a su


estado previamente definido una vez concluya la ejecucin del mismo
As mismo, no se permite la utilizacin de las sentencias del DDL dentro de la
definicin de un trigger En una vista no se puede utilizar un desencadenador

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 20 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

EJEMPLOS DE TRIGGERS
1. El siguiente cdigo, muestra la forma de enviar un mensaje de correo electrnico
a una persona, cuando se aade una nueva oferta
CREATE TRIGGER ENVIAR_CORREO
ON OFERTA
FOR INSERT
AS
EXEC MASTER..XP_SENDMAIL 'PEPE','Tenemos una nueva oferta en nuestra base
de datos'
GO
2. En el ejemplo anterior, si adicionalmente queremos que se enve el mensaje cada
vez que se cambia algo en la tabla de ofertas, deberemos reescribir el trigger para
las acciones update y delete, como se muestra en el siguiente cdigo
DROP TRIGGER ENVIAR_CORREO
GO
CREATE TRIGGER ENVIAR_CORREO
ON OFERTA
FOR INSERT, UPDATE, DELETE
AS
EXEC MASTER..XP_SENDMAIL 'PEPE','LA TABLA DE OFERTAS HA CAMBIADO'
GO
CREATE TRIGGER TR_ACTUALIZASTOCK
ON [DETALLES DE PEDIDOS
AS
BEGIN
DECLARE @IDPROD INT
DECLARE @CANTIDAD INT
DECLARE @STOCK INT
SET @IDPROD=(SELECT IDPRODUCTO FROM INSERTED
SET @CANTIDAD=(SELECT CANTIDAD FROM INSERTED
SET @STOCK= (SELECT STOCK FROM PRODUCTOS WHERE IDPRODUCTO=@IDPROD
IF @STOCK>@CANTIDAD
BEGIN
UPDATE PRODUCTOS SET STOCK=STOCK-@CANTIDAD
WHERE
IDPRODUCTO=@IDPROD
PRINT 'SE DESCARGO EL STOCK'
END
ELSE
BEGIN
ROLLBACK
PRINT 'LA CANTIDAD DEBE SER MENOR AL STOCK'
ENDEND

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 21 de 22

UNIVERSIDAD NACIONAL DE INGENIERIA


FACULTAD DE INGENIERIA INDUSTRIAL Y DE SISTEMAS

3. Crear un trigger que no permita registrar un detalle de pedido con una cabecera
de pedidos ( impedido que no exista en la tabla pedidos
CREATE TRIGGER VALIDADETALLE
ON DETALLES
FOR INSERT
AS BEGIN
DECLARE @IDPEDIDO INT
SET @IDPEDIDO=
ISNULL((SELECT IDPEDIDO
FROM PEDIDOS
WHERE IDPEDIDO=(SELECT IDPEDIDO FROM INSERTED)),0

IF @IDPEDIDO=0
BEGIN
PRINT 'NO SE PUEDE INSERTAR UN PEDIDO'
ROLLBACK
END
END

Rev.1.0

Fecha Efectiva : 11/06/2012

CURSO: TALLER DE HERRAMIENTAS DE SOFTWARE

Pg. 22 de 22

También podría gustarte