You are on page 1of 12

1

UNIVERSIDAD DON BOSCO


FACULTAD DE ESTUDIOS TECNOLOGICOS
ESCUELA DE COMPUTACION
CICLO 01-2012
GUIA DE LABORATORIO N9
Nombre de la practica: Creacin de Vistas, Procedimientos Almacenados y Disparadores
Lugar de ejecucin: Laboratorio de Informtica
Tiempo estimado: 2:30 horas
Materia: Base de datos I


I. Objetivos

Qu el estudiante:

Utilice vistas para seguridad de los datos
Cree procedimientos almacenados.
Utilizar los procedimientos almacenados para facilitar consultas en SQL Server
Utilice desencadenadores

II. Introduccin Terica

Vistas

Las vistas tiene una tendencia a ser utilizadas mucho o poco: en raras ocasiones se utilizan en su justa
medida. Las vistas se podran utilizar para:

1) Reducir la complejidad aparente de la base de datos para los usuarios finales
2) Prevenir la seleccin de columnas confidenciales a la vez que permite el acceso a otros datos
importantes En el fondo, una vista no es ms que una consulta almacenada. lo extraordinario es
que podemos combinar y hacer corresponder datos desde tablas base (o desde otras vistas) para
crear lo que, en general, funciona como cualquier otra tabla base.

Al crear una vista, Microsoft SQL Server comprueba la existencia de los objetos a los que se hace referencia
en su definicin. El nombre de la vista debe ajustarse a las normas para los identificadores. Opcionalmente,
es posible especificar un nombre de propietario para la vista. Debe establecer una convencin de
denominacin coherente para distinguir las vistas de las tablas. Por ejemplo, puede agregar la palabra
vista como sufijo de cada objeto vista que cree. De este modo podr distinguir fcilmente entre objetos
similares (tablas y vistas) al consultar la vista INFORMATION_SCHEMA.TABLES.
Sintaxis
CREATE VIEW propietario.nombreVista [(columna [,n ])] [WITH {ENCRYPTION | SCHEMABINDING |
VIEW_METADATA} [,n ]] AS instruccinSelect
[WITH CHECK OPTION]
Para poder ejecutar la instruccin CREATE VIEW es necesario ser miembro de la funcin de administradores
del sistema (sysadmin), de la funcin propietario de la base de datos (db_owner) o de la funcin
administrador de lenguaje de definicin de datos (db_ddladmin), o bien tener el permiso CREATE VIEW.
Tambin es necesario tener el permiso SELECT en todas las tablas o vistas a las que la vista haga referencia.

2

Para evitar situaciones en las que el propietario de una vista y el propietario de las tablas subyacentes sean
distintos, se recomienda que el usuario dbo (propietario de base de datos) sea el propietario de todos los
objetos de la base de datos. Especifique siempre el usuario dbo como propietario al crear el objeto pues, de
lo contrario, usted, es decir, su nombre de usuario, ser el propietario.
El contenido de una vista se especifica con una instruccin SELECT. Con algunas excepciones, las vistas
pueden ser tan complejas como se requiera. Debe especificar los nombres de columna en las situaciones
siguientes:
Alguna de las columnas de la vista se deriva de una expresin aritmtica, de una funcin integrada
o de una constante.
Hay columnas con el mismo nombre en las tablas que se van a combinar.


Ejemplo 2
ste es un ejemplo de una vista que crea una columna (Subtotal) que calcula los subtotales de un pedido a
partir de las columnas UnitPrice, Quantity y Discount.
CREATE VIEW dbo.OrderSubtotalsView (OrderID, Subtotal)
AS
SELECT OD.OrderID,
SUM(CONVERT (money,(OD.UnitPrice*Quantity*(1-Discount)/100))*100)
FROM [Order Details] OD
GROUP BY OD.OrderID
GO
En este ejemplo se consulta la vista para ver los resultados.
SELECT * FROM OrderSubtotalsView
Resultado
OrderID Subtotal
10271 48.0000
10977 2233.0000
10440 4924.1400
.
.
.
(830 filas afectadas)

Vista de tablas combinadas

3

A menudo se crean vistas para conseguir una forma ms prctica de ver informacin centralizada de dos o
ms tablas combinadas.

Modificacin y eliminacin de vistas
A menudo, las vistas se alteran como respuesta a las peticiones de informacin adicional por parte de los
usuarios o a causa de cambios en la definicin de las tablas subyacentes. Para alterar una vista puede
quitarla y volverla a crear, o bien puede ejecutar la instruccin ALTER VIEW.
Eliminacin de vistas
Si ya no necesita una vista, puede quitar su definicin de la base de datos con la instruccin DROP VIEW. Al
quitar una vista se quita su definicin y todos los permisos que tenga asignados. Adems, si los usuarios
consultan vistas que hagan referencia a la vista quitada, obtendrn un mensaje de error. Sin embargo, al
quitar una tabla que hace referencia a una vista, sta no se quita automticamente. Es necesario quitarla
de forma explcita. Se utiliza la instruccin DROP VIEW.

Ejemplo.



PROCEDIMIENTOS ALMACENADOS

Transact-SQL no es realmente un lenguaje de programacin similar a las herramientas de tercera y cuarta
generacin sin embargo permite utilizar SQL para realizar tareas complejas que requieren saltos, bucles,

4

decisiones. Transact-SQL se utiliza a menudo en la creacin de procedimientos almacenados y triggers
(desencadenadores) de tal forma que las aplicaciones clientes que se conectan a SQL Server solo se
preocupan por la presentacin de los datos para el usuario final, mientras que la lgica de los procesos se
maneja en el servidor.

El control de flujo en Transact-SQL

Construccin Descripcin
IFELSE Define una decisin.
GOTO etiqueta Define un salto incondicional
WAITFOR Establece un tiempo para la ejecucin de una instruccin. El tiempo puede ser un
intervalo de retardo o un instante especificado de ejecucin (una hora concreta del
da)
WHILE Bucle bsico de SQL
BREAK Acompaa al bucle WHILE y le indica finalizarlo inmediatamente.
CONTINUE Acompaa al bucle WHILE y le indica continuar con la siguiente iteracin.
RETURN [n] Salida incondicional del procedimiento o proceso por lotes, se puede definir un
nmero entero como estado devuelto y puede asignarse a cualquier variable.
BEGIN...END Utilizado en conjunto con IF..ELSE o WHILE para agrupar un conjunto de
instrucciones.
CASE Implementada en la instruccin SELECT y UPDATE y permite realizar consultas y
actualizaciones condicionales.

PRINT
Es una instruccin para imprimir un dato en la pantalla, la sintaxis es: PRINT "cadena"; cadena puede ser
tambin una variable de tipo varchar. Por ejemplo: PRINT Hola a todos

Los procedimientos almacenados son conjuntos de sentencias en leguaje Transact SQL que pueden
almacenarse en el propio servidor. Los procedimientos almacenados de SQL Server, son ms potentes,
porque permiten almacenar funciones y procedimientos compuestos por varias instrucciones, introducir
saltos, bucles, etc.

Creacin de procedimientos almacenados (Store Procedures) La instruccin general para crear
procedimientos almacenados es la siguiente:
CREATE PROC nombre_proc parametros
AS
INSTRUCCION SQL
Es necesario aclarar, que un procedimiento almacenado puede recibir parmetros de entrada y devolver
parmetros de salida.

Por ejemplo, podemos crear un procedimiento para recuperar el nombre de un autor, cuyo cdigo se pasa
por parmetro.

CREATE PROCEDURE ObtenerNombre @au_id varchar(11) AS
SELECT author
FROM title
WHERE title.title_no = @au_id

Con esta sentencia, se crea un procedimiento almacenado, de nombre ObtenerNombre, al que se le pasa
un parmetro, llamado @au_id, de tipo varchar, que realiza una consulta para obtener el nombre del autor
de la tabla title, cuyo cdigo coincida con el parmetro. De esta forma, si queremos obtener el nombre del
autor cuyo cdigo sea '50', deberemos ejecutar el procedimiento pasndole como argumento este valor.

5


Las llamadas a procedimientos almacenados se pueden realizar de las siguientes formas:
Pasando los argumentos en el mismo orden que en el que se han declarado.
ObtenerNombre '50'
Pasando los argumentos nombrados. En este caso no hace falta que los parmetros vayan en el mismo
orden.
ObtenerNombre @au_id = '45'

Parmetros por referencia

Si ejecutamos las anteriores sentencias, obtendremos el resultado directamente en la ventana que
tengamos abierta en SQL Server. Pero qu pasa si queremos 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.
Si por ejemplo, queremos obtener el nmero de ttulos que tenemos en la base de datos, crearemos el
procedimiento almacenado que muestra a continuacin:
CREATE PROCEDURE num_titulos @titulos int OUTPUT AS
SELECT * FROM title
SELECT @titulos = @ROWCOUNT
RETURN (0)

Vamos a estudiar el anterior ejemplo. 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 title, realizando un SELECT * FROM title. A continuacin
devolvemos en el parmetro @titulos el valor obtenido, utilizando @@ROWCOUNT.
Para ejecutar este procedimiento escribimos las siguientes sentencias:

DECLARE @titulos int
EXEC num_titulos @titulos OUTPUT
SELECT titulos = @titulos

Nos mostrar los registros de la tabla y al final el valor de la variable @titulos

Borrar Procedimientos Almacenados
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:

DROP PROCEDURE num_titulos

Desencadenadores (Triggers)
Los disparadores de procedimiento, ms comnmente conocidos como triggers, son una especie de
procedimientos almacenados, 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

6

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.

Por ejemplo, si queremos crear un trigger llamado modificacin_cliente, sobre la tabla Customers, que
muestre un mensaje cada vez que se actualiza una fila de la tabla, deberemos escribir el Cdigo:
CREATE TRIGGER modificacion_Clientes ON Customers FOR UPDATE AS
print 'Han actualizado la tabla de Customers'

Para comprobar el funcionamiento de este trigger, podemos actualizar cualquier fila de la tabla de
customers, por ejemplo con la sentencia:

Update Customers set ContactName='Maria Walters' where CustomerID='AROUT'

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

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

Del mismo modo, para borrar un trigger, deberemos ejecutar la sentencia DROP TRIGGER trigger.
Por ejemplo, si queremos borrar el trigger anteriormente creado, ejecutaremos
DROP TRIGGER modificacion_Clientes

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 est 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 deleted

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.

7

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.

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.
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.

III. Requerimientos


N Cantidad Descripcin
1 1 Gua de Laboratorio #9 de BD
2 1 Memoria USB
3 1 Maquina con SQL Server 2008


IV. Procedimiento


Parte 1: Iniciando sesion desde SQL Server Managment Studio

1. Hacer clic en el botn Inicio
2. Hacer clic en la opcin Todos los programas y hacer clic en Microsoft SQL Server 2008 R2
3. Cargue SQL Server 2008 R2.

Para conectarse con el servidor de base de datos elija los siguientes parmetros de autenticacin:
Tipo de servidor: Database Engine
Nombre del servidor: SALA02-PCNumMaquina
Nota: NumMaquina es el numero de maquina local
Autenticacin: SQL Server Authentication
Login: sa
Password: 123456

4. Luego de clic en el botn conectar y asi ingresar a la ventana del SQL Server Managment
Studio.
5. Luego seleccionara del men estndar la opcin (Nueva Consulta/New Query) para
empezar a trabajar con las sentencia de T-SQL.
6. Localice el icono de guardar, con el fin de guardar el nuevo archivo de sentencias T-SQL
(Practica9_BDD.sql).


8

Parte 2: Ejemplos de Vistas

Ejercicio 1
1. En este ejercicio va a crear una vista para administrar las peticiones diarias relativas a la base de
datos Northwind.
2. Utilice la informacin de la tabla siguiente para crear una vista que muestre los productos de un
proveedor en particular.
3. Opcin Valor Seleccionar la base de datos Northwind
4. Seleccionar la tabla Products

5. Seleccionar columnas
ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, Discontinued
6. Definir restriccin WHERE SupplierID = 14
7. Consulte la vista para asegurarse de que ha recibido el conjunto de resultados esperado.

Ejercicio 2

1. Tomado en cuenta la misma base de datos Northwind, debe crear una vista donde se muestren las
ventas de un producto las cuales se han realizado el pedido en el ao 1997, los que podra mostrar
son los siguientes:
a. Nombre del producto
b. Fecha de pedido
c. Fecha de envi

Ejercicios:

La base de datos a utilizar es: Northwind

Crear las siguientes vistas:

a. Mostrar el cdigo del producto, el nombre del producto y el precio por unidad de todos los
productos de la empresa.

b. Mostrar todos los productos cuya categora sea Beverages.

c. Cuantos productos existen por cada categora

d. Mostrar el promedio de los precios unitarios de produce y confections

e. Mostrar todos los empleados de London, mostrando, su cdigo, nombre, apellido, fecha de
nacimiento y titulo.

f. Cuantos territorios hay por cada regin.

Parte 3: Ejemplos de Procedimientos almacenados
7. Utilice la bases de datos NorthWind para esta practica
8. Vamos a crear un procedimiento almacenado que ingrese un nuevo registro a la tabla
Categories solo si el ID que se le enva como parmetro no existe.



9


9. Ejecutemos el procedimiento anterior comprobando si funciona correctamente
exec sp_Insertar_Categories 1, 'Alimentos'
exec sp_Insertar_Categories 9, 'Alimentos'
10. En el siguiente procedimiento hacemos uso de la sentencia CASE para verificar si existen
clientes en una determinada ciudad pasada como parmetro.


11. Ejecutemos el procedimiento anterior comprobando si funciona correctamente
exec sp_Hay_Clientes 'Barcelona'
exec sp_Hay_Clientes 'New York'

12. Ejecucin dinmica de sentencias: la instruccin EXEC. Como hemos visto, la instruccin
exec se utiliza para ejecutar un procedimiento almacenado, pero no slo eso, sino que
adems sirve para evaluar una expresin de tipo carcter. Por ejemplo, el siguiente cdigo
muestra como ejecutar un select de todas los Clientes.
Exec ('select * from customers')

Esto puede resultar muy til para montar sentencias en tiempo de ejecucin, cuyos valores
no conocemos a priori, o para los cuales deseamos realizar un tratamiento distinto
dependiendo de los valores que tomen.
El siguiente cdigo mostrara un procedimiento almacenado que se encarga de realizar
bsquedas de clientes. Recibe dos parmetros, uno es la ciudad y otro es el cdigo postal.
Si se especifica nicamente la ciudad, se realizar una bsqueda de todos los clientes que
sean de esta ciudad, mientras que si especifica el cdigo postal, se realizar una bsqueda,
adems, por este atributo.

10



13. Si ejecutamos el anterior procedimiento almacenado, sin especificar ninguno de los
parmetros, obtendremos todos los clientes
exec sp_Clientes null, null

14. Si especificamos el parmetro city = Madrid, obtendremos todos los clientes de la ciudad
de Madrid
exec sp_Clientes 'Madrid', null

15. Si adems especificamos el parmetro codigo postal, obtendremos lo siguiente.
exec sp_Clientes 'Madrid', '28023'


Parte 4: Ejemplos de Desencadenadores

1. Crearemos un desencadenador para la tabla [Order Details] que se disparar cuando se
inserte o se actualice la tabla y verificar si la cantidad de productos a ordenar es mayor a
la cantidad de productos en existencia.


11


2. Insertemos dos registros en la tabla para comprobar el funcionamiento del trigger.
insert into [order details] values (10248,1, 14, 10, 0)
insert into [order details] values (10248,5, 14, 10, 0)

En primera sentencia nos aparece un mensaje de transaccin realizada con xito
En cambio en la segunda sentencia como no hay existencia suficiente se presenta un error
y el trigger cancela el insert con ROLLBACK TRANSACTION.

V. Anlisis de resultados

CREATE DATABASE bodega
GO
USE bodega
GO
CREATE TABLE PRODUCTO
(
idprod char(7) PRIMARY KEY,
descripcion varchar(25),
existencias int
precio decimal(10,2) not null, --precio costo
preciov decimal(10,2) not null, --precio venta
)
CREATE TABLE PEDIDO
(
idpedido char(7),
idprod char(7),
cantidad int
FOREIGN KEY(idprod) REFERENCES PRODUCTO(idprod)
)

La tabla producto contiene informacin general de los productos y la tabla pedido contiene la informacin
del pedido que se realiza de un cierto producto

Ejercicios:

Procedimientos almacenados:

1. Crear un procedimiento almacenado que ingrese los valores en la tabla PRODUCTOS, y deber
verificar que el cdigo y nombre del producto no exista para poder insertarlo, en caso que el cdigo
y el nombre del producto ya exista enviar un mensaje que diga ESTE PRODUCTO YA HA SIDO
INGRESADO.

2. Crear un procedimiento almacenado que permita realizar un pedido EN LA TABLA PEDIDO, este
procedimiento deber verificar si el cdigo del producto ingresado existe en la tabla PRODUCTO en
caso de que no se encuentre deber mostrar un mensaje as como se muestra a continuacin ESTE
PRODUCTO NO EXISTE , adems si la cantidad a pedir del producto es mayor a la existencia del
producto deber enviar un mensaje que diga EXISTENCIA DEL PRODUCTO INSUFICIENTE, en caso
que la cantidad a pedir sea menor o igual deber modificar el valor de la existencia



12

Disparadores:

1. Crear un desencadenador que se active cada vez que se inserte un registro en la tabla pedidos y
otro para la tabla producto.
2. Crear un desencadenador para la tabla producto, que se active cada vez que se inserte un
registro o se actualice la columna precio, la condicin para aceptar al insercin o la actualizacin
es que el precio costo no debe ser mayor que el precio venta.
3. Crear un desencadenador para la tabla pedidos que cada vez que se realice un pedido
descuente la existencia de la tabla productos, en caso que la cantidad del pedido supere a la
existencia debe deshacer la transaccin.

VI. Referencia Bibliogrfica

Microsoft SQL Server 2008, Gua Prctica, Francisco Charte Ojeda; Anaya Multimedia.

You might also like