Documentos de Académico
Documentos de Profesional
Documentos de Cultura
THS Decimo Segunda Sesion
THS Decimo Segunda Sesion
TALLER DE HERRAMIENTAS
DE SOFTWARE
DUODECIMA SESION
DOCENTE:
Rev.1.0
Pg. 1 de 22
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
Pg. 2 de 22
Rev.1.0
Pg. 3 de 22
Rev.1.0
Pg. 4 de 22
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
Rev.1.0
Pg. 5 de 22
Rev.1.0
Pg. 6 de 22
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
Pg. 7 de 22
Rev.1.0
Pg. 8 de 22
Rev.1.0
Pg. 9 de 22
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
Pg. 10 de 22
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
Pg. 11 de 22
Rev.1.0
Pg. 12 de 22
USE SUPERMERCADOSNEPTUNO
Rev.1.0
Pg. 13 de 22
USE SUPERMERCADOABC
BEGIN TRAN
Rev.1.0
Pg. 14 de 22
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
Pg. 15 de 22
3. TRIGGERS y DESENCADENADORES
UPDATE: actualizacin
INSERT: insercin
DELETE: borrado
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
Pg. 16 de 22
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
Rev.1.0
Pg. 17 de 22
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.
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
Pg. 18 de 22
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.
Rev.1.0
Pg. 19 de 22
Rev.1.0
Pg. 20 de 22
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
Pg. 21 de 22
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
Pg. 22 de 22