UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS LABORATORIO DE BASES DE DATOS 1



Documentos relacionados
Si queremos modificar la contraseña de sys, una vez que accedamos al sistema como sys, escribiremos la sentencia:

Aplicaciones de las vistas Concepto de vista Vistas en SQL Vistas en SQL.

El usuario puede utilizar esta tabla derivada como una tabla más, en sus consultas.

SQL (Structured Query Language)

T12 Vistas y tablas temporales

- Bases de Datos - - Diseño Físico - Luis D. García

A.1. Definiciones de datos en SQL

MANUALITO MS-SQL SERVER

GALA CONCEPTO COMMIT, ROOLBACK SAVEPOINTS (SAVE TRANSACTION) No Consultas. Definiciones Transacciones ( L33 )

ADMINISTRACIÓN DE BASE DE DATOS

Un ejemplo teórico de trigger podría ser éste:

Consultas con combinaciones

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

Base de datos relacional

UNIVERSIDAD DEL ISTMO CAMPUS IXTEPEC LIC. INFORMATICA GRUPO 508 PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

El lenguaje de manipulación de datos (DML) es una parte fundamental de SQL.

CONSULTAS BASICAS EN SQL SERVER

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

COMANDOS DE SQL, OPERADORES, CLAUSULAS Y CONSULTAS SIMPLES DE SELECCIÓN

Restricciones de Integridad

SQL PROCEDURAL Triggers y Stored Procedures. Ing. Gustavo A. Correa Reina UNCPBA 2008

Iniciando con Oracle. Índice de contenido. Ingresando a Oracle. Cambiando Su Contraseña. Ingresando un Comando SQL en SQL*Plus

Base de datos Procedimientos Almacenados y Funciones

INTRODUCCION. entidades. Modelo lógico de la base de datos. Matricula. carne. codigo_curso. año semestre nota. propiedades

LAS SUBCONSULTAS SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA. Tema 9. Reglas de Integridad

Diseño de bases de datos

1. DML. Las subconsultas

Trabajos de Ampliación. Bases de datos NoSQL.

Bases de datos relacionales y el modelo entidad-relación

PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:

Vistas en postgresql

Sub consultas avanzadas

Laboratorio Informix. Stored Procedures Triggers

Tema: Disparadores Parte I.

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Formato para prácticas de laboratorio

5- Uso de sentencias avanzadas

FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA. Tema 8. Elementos Básicos

Es un lenguaje de consulta estructurado establecido claramente como lenguaje de alto nivel estándar para sistemas de base de datos relacionales.

CONSULTAS DE RESUMEN SQL SERVER Manual de Referencia para usuarios. Salomón Ccance CCANCE WEBSITE

Administración de la producción. Sesión 10: Gestor de Base de Datos (Access)

MANUAL BÁSICO DEL LENGUAJE SQL

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

Bases de Datos 2. Teórico

Administradores de Bases de Datos Studio.NET 2005 Y SQL Server Barrios

Ejercicios - Persistencia en Android: ficheros y SQLite

INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INTRODUCCIÓN INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES INSTRUCCIONES DE DEFINICIÓN DE TABLAS E ÍNDICES

Base de Datos Práctica 1.

UNIVERSIDAD AUTONOMA DE LOS ANDES UNIANDES LENGUAJE SQL. SQL es un estándar un lenguaje estructurado para consultas

Microsoft SQL Server 2005

GESTIÓN DOCUMENTAL PARA EL SISTEMA DE CALIDAD

Base de datos Lenguaje SQL

Tema: Procedimientos almacenados y cursores. Facultad : Ingeniería Escuela : Computación Asignatura: SQL SERVER. GUÍA 2 Pág. 1

BASES DE DATOS SQL MÁS S DE SQL (DML) OPERADOR UNION (L30) <SELECT1> UNION <SELECT2> UNION <SELECTN> Copyright 2006, 2007 Instituto Gala

m047a Curso Programando una Base de Datos SQL Server 2008, 36 h Creación B.D. y Constraints

MANUAL DE AYUDA HERRAMIENTA DE APROVISIONAMIENTO

TRANSACT-SQL, DISEÑO Y PROGRAMACIÓN DE BASES DE DATOS EN SQL SERVER 2008

Oracle básico (IV): Programación en PL/SQL

Programación SQL. Lucio Salgado Diciembre 2008

SQL Server FEMEPA SQL Server 2000

Capítulo 1: Introducción a los Sistemas de Gestión de Bases de Datos (SGBD)

INSTITUCIÓN EDUCATIVA GABRIEL GARCIA MÁRQUEZ BASE DE DATOS. DESARROLLO DE SOFTWARE Página 1 de 28 SQL SQL

TEMA 6: MODIFICACIÓN DE LA BASE DE DATOS EN SQL

Guía de Laboratorio Base de Datos I.

Bases de Datos Relacionales

CURSORES EN SQL SERVER

Bases de Datos: Structured Query Language (SQL)

Creación y Gestión de Tablas. Copyright Oracle Corporation, All rights reserved.

Resumen. El rol del lenguaje SQL en los SGBDR y en la Relacional. cjimenez@inf.udec.cl, tamrstro@inf.udec.cl

Guías _SGO. Gestione administradores, usuarios y grupos de su empresa. Sistema de Gestión Online

Tema: PROCEDIMIENTOS ALMACENADOS.

CONCEPTOS DE PROCESAMIENTO DE TRANSACCIONES

Procedimientos Almacenados con InterBase

Nociones de performance

Introducción a los Sistemas de Gestión de Bases de Datos

Procedimientos, Funciones, Trigger y Cursores en ORACLE

Tema 4. Manipulación de datos con SQL

Programación de Consultas SQL ADO.Net LDP / DUOC-AV

Guía Taller I Conexión con la Base de Datos Introducción a PostgreSQL

Restricciones (constraints) FOREIGN KEY

Capítulo 12: Indexación y asociación

Hacer clic sobre la figura, para extraer todos los registros o presionar la tecla F2.

Integridad y Seguridad en los sistemas de Bases de Datos. Javier Escobar Luis Ramirez Omar Asprino

PRÁCTICA III. DISPARADORES EN SQL (II)

ESCUELA DE CIENCIAS BASICAS TECNOLOGIA E INGENIERIA Programación de sitios web Act 11: Reconocimiento de la unidad 3

Cómo creo las bandejas del Registro de Entrada /Salida y de Gestión de Expedientes?

Manual PARA EL ADMINISTRADOR DE LA WEB DE PRÁCTICAS PRE PROFESIONALES Y PASANTÍAS

Base de datos en Excel

Gestión de Retales WhitePaper Noviembre de 2009

PHPMYADMIN Y MYSQL. Para gestionar la base de datos MySQL, lo haremos desde la aplicación PhpMyAdmin.

CURSO DE SQL SERVER 2005

Base de datos I Facultad de Ingeniería. Escuela de computación.

m047a Curso Programando una Base de Datos SQL Server 2008, 36 h

SQL (Structured Query Language)- DML

Implementación de funciones definidas por el usuario

Guía práctica de SQL

6 - Recuperar algunos registros (where)

Formato para prácticas de laboratorio

Transcripción:

UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEM LABORATORIO DE BES DE DATOS 1 Prof. Marco Aedo Práctica de Laboratorio Nº 6 I. OBJETIVOS ÍNDICES Y VIST Comprender la utilidad de los índices y su implementación Comprender el uso de las vistas y su implementación II. MARCO TEÓRICO 1. Definición El índice de un libro nos permite localizar información de una manera rápida sin la necesidad de hacer una búsqueda intensiva por todas las páginas del libro. El índice es una estructura adicional al contenido del libro en que se encuentran ordenados los temas del mismo, junto con un número que indica la página exacta en que se encuentra cada uno de ellos. Por supuesto, la información contenida en el libro es la misma con índice o sin él. El índice sólo influye en la velocidad con que se encuentra la información buscada. En el mundo de las bases de datos relacionales, los índices son estructuras que se pueden crear asociadas a tablas con el objetivo de acelerar algunas sentencias SQL ejecutadas sobre ellas. La ausencia o presencia de un índice asociado a una tabla no influye en la sintaxis de las sentencias SQL ejecutadas sobre esa tabla. SQLServer hace uso de los índices para incrementar el rendimiento cuando: - Busca registros con valores específicos en columnas indexadas. - Accede a una tabla en el orden de las columnas del índice. 2. Selección De Índices Los índices son creados para aumentar la eficiencia en los accesos a las tablas de la base de datos. A cambio se paga con el espacio extra ocupado por los índices y el tiempo necesario para mantenerlos. Aunque los índices agilizan la recuperación de los datos de las tablas, sin embargo ralentizan las actualizaciones y ocupan espacio en disco, ya que, cuando se realizan actualizaciones de una tabla de la base de datos, cada uno de los índices basados en esa tabla necesita también una actualización. Antes de crear un índice se debe determinar si es necesario, es decir, se debe estimar si el beneficio en el rendimiento que se obtendrá supera al costo derivado de su mantenimiento. El usuario sólo debe crear aquellos índices que considere necesarios y SQL Server se encargará de usarlos y mantenerlos automáticamente. El mantenimiento implica la modificación necesaria

del índice cuando se añaden, modifican o eliminan registros de la tabla. Por tanto, es importante utilizar los índices que se necesiten realmente y se deben borrar si no van a necesitarse de nuevo. 3. Creación de Índices Para la creación de índices usaremos la sentencia CREATE INDEX cuya sintaxis básica es: CREATE INDEX nombre_del_índice ON tabla(campo[c DESC],...) Por ejemplo, si queremos acelerar las consultas cuando busquemos a un proveedor por su nombre, podemos crear un índice asociado al campo nompro de la tabla proveedor. CREATE INDEX indice_proveedores ON proveedor(nompro) Cuando se crea una tabla es mejor insertar los registros antes de crear el índice. Si se crea antes el índice, SQLServer deberá actualizarlo cada vez que se inserte un registro. 4. Índices compuestos Un índice compuesto es aquél creado sobre más de un campo de la tabla. Los índices compuestos pueden acelerar la recuperación de información cuando la condición de la consulta correspondiente referencia a todos los campos indexados o sólo a los primeros. Por tanto, el orden de las columnas usado en la definición del índice es importante; generalmente, los campos por los que se accede con mayor frecuencia se colocan antes en la creación de índices. Supongamos que tenemos una tabla Libros con los campos: código, título, autor, editorial y género y creamos un índice compuesto sobre los campos género, título y editorial: CREATE INDEX indicelibros ON libros (genero, titulo, editorial) Dicho índice acelerará la recuperación de información de las consultas cuya condición incluya referencias al campo género, a los campos género y título o a los campos género, título y editorial Por ejemplo: SELECT codigo FROM libros WHERE genero= Novela AND titulo= Sin noticias de Gurb SELECT codigo FROM libros WHERE genero= Novela AND titulo= Sin noticias de Gurb AND editorial= Planeta Sin embargo no mejorará el acceso cuando las consultas no incluyan referencias a los primero campos del índice. Por ejemplo: SELECT codigo FROM libros WHERE titulo= Sin noticias de Gurb ; SELECT codigo FROM libros WHERE genero= Novela AND editorial= Planeta 5. Estructura de los índices Cuando se crea un índice, SQL Server recupera los campos indexados de la tabla y los ordena. A continuación almacena en una estructura especial los valores de los campos indexados junto con un identificador (ROWID) del registro correspondiente. Por lo general se usan árboles B* balaceados para igualar el tiempo necesario para acceder a

cualquier fila. 6. Eliminación de Índices Son varias las razones por las que puede interesar elimina un índice: - El índice no se necesitará más. - Por las características de la tabla el índice no mejora la eficiencia. - Necesitamos cambiar los campos que se indexan. - Necesitamos rehacer un índice muy fragmentado. Para eliminar un índice usaremos la sentencia: DROP INDEX nombre_del_índice Ejemplo: DROP INDEX Proveedor.indice_proveedores Se debe tener en cuenta que cuando se borra una tabla también se borran todos los índices asociados. ACTIVIDADES 1. Crearemos el fichero crear_tabla_libros con la siguiente información: create table libros( codigo varchar(8) constraint codigolibro_no_nulo not null constraint codigolibro_clave_primaria primary key, titulo varchar(40) constraint titulo_libro_no_nulo not null, autor varchar(30) constraint autor_libro_no_nulo not null, editorial varchar(20) constraint editorial_libro_no_nulo not null, genero varchar(15) ) Como resultado de la ejecución de este fichero se crea la tabla libros definiendo codigo como llave primaria. Name Null? Type ----------------------------------------- -------- --------------------- CODIGO NOT NULL VARCHAR(5) TITULO NOT NULL VARCHAR(40) AUTOR NOT NULL VARCHAR(30) EDITORIAL NOT NULL VARCHAR(20) GENERO VARCHAR(15) 2. Encontrar el código del libro, el título del libro y el nombre del autor que imprime la editorial Diksiyo. (Darse cuenta del tiempo que toma el SGBD para encontrar tal nombre de editorial) SELECT codigo, titulo, autor, editorial FROM libros where editorial= Diksiyo 3. Crear un índice para que acelere las consultas cuando se busque a una editorial por su nombre. CREATE INDEX indice_editoriales ON libros(editorial) 4. Volver a realizar el paso Nro. 2. (Darse cuenta del tiempo que toma el SGBD para encontrar tal nombre de editorial, teniendo en cuenta que se ha creado un índice para tal campo) 5. Crear un índice compuesto para acelerar la recuperación de información de las consultas cuya condición incluya referencias el campo género, a los campos género y título o a los campos género, título y editorial

CREATE INDEX indicelibros ON libros (genero, titulo, editorial) 6. Encontrar el código y nombre del libro Muerte sin sombra : (Darse cuenta del tiempo que toma el SGBD para encontrar este título del libro) SELECT codigo, titulo FROM libros WHERE titulo= Muerte sin sombra 7. Encontrar el código y nombre de la novela Muerte sin sombra : (Darse cuenta del tiempo que toma el SGBD para encontrar este título del libro) SELECT codigo, titulo FROM libros WHERE genero= Novela AND titulo= Muerte sin sombra 8. Encontrar todas las novelas de la editorial Cornucopia : SELECT * FROM libros WHERE genero= Novela AND editorial= Cornucopia 9. Encontrar la novelas de la editorial Cornucopia titulada Muerte sin sombra SELECT * FROM libros WHERE genero= Novela AND titulo= Muerte sin sombra AND editorial= Cornucopia III. MARCO TEÓRICO 1. Definición VIST Una vista es una tabla lógica cuya información se deriva de una tabla, de un conjunto de ellas o bien de otras vistas de la base de datos. Si el contenido de las tablas cambia, este cambio se ve reflejado en las vistas. Dicho de otra forma: es una expresión que describe una tabla sin crearla (a veces se le llama tabla virtual). Una vista no contiene ningún dato, en lugar de ello ésta es definida sobre una o más tablas base. Se puede usar vistas para: - Seleccionar un subconjunto de registros de una tabla base. - Incluir únicamente un subconjunto de las columnas de una tabla base. - Juntar registros relacionados de múltiples tablas base. - Combinar subconjuntos de registros de múltiples tablas usando la operación de unión. 2. Creación de Vistas Para la creación de vistas usaremos la sentencia CREATE VIEW cuya sintaxis básica es: CREATE VIEW nombre_de_la_índice Consulta_SQL; Supongamos la vista VentasParis, que representa el conjunto de suministros realizados sólo con integrantes procedentes de Paris. CREATE VIEW VentasParis SELECT ventas.codpro,codp,ventas.codpj,cantidad FROM proveedor,pieza,proyecto,ventas WHERE proveedor.ciudad='paris' AND pieza.ciudad='paris' AND proyecto.ciudad='paris' AND proveedor.codpro=ventas.codpro AND pieza.codpie=ventas.codp AND proyecto.codpj=ventas.codpj En la cláusula se especifica la consulta que determina qué filas y columnas de la tabla o tablas almacenadas forman parte de la vista.

3. Consulta de Vistas Se trata las vistas como una tabla cualquiera. Así por ejemplo, podemos consultar la relación VentasParis y de ella mostrar los códigos de proveedores que suministran al proyecto J3. SELECT DISTINCT codpro FROM VentasParis WHERE codpj='j3' 4. Modificación de Vistas Se pueden usar los comandos DELETE, INSERT, UPDATE sólo en determinadas ocasiones, la razón es que puesto que la vista no existe como tabla base (tabla almacenada), para el caso de insertar una nueva tupla, la cuestión es dónde encajaría esa tupla. En otros casos se plantea como habría que completar algunos atributos de la tuplas. Por ejemplo supongamos la vista siguiente: CREATE VIEW PiezasParis SELECT codpie,nompie,color,peso FROM pieza WHERE pieza.ciudad= Paris Si hacemos una inserción del tipo: INSERT INTO PiezasParis VALUES ( P8, Pieza ocho, Rojo,10) La vista PiezaParis cumple las condiciones para actualizar la tabla piezas, pero inserta NULL como valor para ciudad. Bastaría con añadir un campo más en la inserción con el valor Paris pero el atributo ciudad no pertenece a la vista. Por tanto habría que redefinir la vista para que incluyera ciudad. La sentencia para borrar una vista es: DROP VIEW Nombre_vista Para eliminar la vista de nuestro ejemplo, la sentencia sería: DROP VIEW VentasParis 5. Re Creación de Vistas Se puede cambiar la definición de una vista, con la sentencia ALTER VIEW. ALTER VIEW PiezasParis SELECT codpie codigo,nompie Nombre,color,peso FROM pieza WHERE pieza.ciudad= Paris La sintaxis de usar ALTER VIEW es la misma de CREATE VIEW. La ventaja para usar ALTER VIEW (en lugar de borrar la vista y crearla de nuevo) es que los procedimientos almacenados, triggers y permisos que referencia la vista no son afectados. 6. El Catálogo SQL y la información del esquema Cada SQL Server tiene un conjunto de tablas del sistema que almacena información descriptiva sobre las estructuras de las tablas, vistas, y otros objetos de la BD. Las tablas tienen el prefijo sys. Se puede acceder a estas tablas directamente, sin embargo, para muchos propósitos, es mejor acceder a la información a través de sus vistas. Por ejemplo, la siguiente consulta producirá una lista de todas las tablas y vistas accesibles en la base de datos: SELECT * FROM INFORMATION_SCHEMA.TABLES ORDER BY TABLE_NAME

UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEM LABORATORIO DE BES DE DATOS 1 Prof. Marco Aedo Práctica de Laboratorio Nº 7 I. OBJETIVOS PROCEDIMIENTOS ALMACENADOS Y TRIGGERS II. Comprender el uso de los procedimientos almacenados y su implementación Comprender el uso de los triggers y su implementación MARCO TEÓRICO 1. Definición Procedimientos Almacenados (Stored Procedures o SP) Un procedimiento almacenado es creado con la sentencia CREATE PROCEDURE y es ejecutado con la sentencia EXECUTE (o una función de una interfaz de BD, como OLE DB). Se puede usar cualquier cantidad de sentencias SQL en un procedimiento almacenado, excepto las siguientes: CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER y CREATE VIEW. Un procedimiento almacenado trabaja como un procedimiento en un lenguaje de alto nivel, y puede tener parámetros de entrada y salida, variables locales, asignaciones, operaciones con la DB (DML y DDL), etc. 2. Creación de Procedimientos Almacenados CREATE PROCEDURE ListarPiezasConPesoMayorA @Peso Dec (5,2) SELECT * FROM pieza WHERE peso > @Peso Un procedimiento almacenado es siempre creado en la base de datos actual. Para ejecutar este procedimiento, se puede usar la sentencia: EXECUTE ListarPiezasConPesoMayorA 0 La palabra EXECUTE es opcional si el procedimiento almacenado es la única o la primera sentencia en un lote (batch) de sentencias. 3. Modificando SP La sentencia ALTER PROCEDURE nos permite cambiar el código del procedimiento almacenado sin cambiar los permisos que han sido otorgados al procedimiento. ALTER PROCEDURE tiene una sintaxis similar a la sentencia CREATE PROCEDURE. El siguiente ejemplo muestra como se podría modificar el procedimiento anteriormente creado: ALTER PROCEDURE ListarPiezasConPesoMayorA @Peso Dec (5,2) SELECT * FROM pieza

WHERE Ciudad IS NOT NULL AND peso >= @Peso Ahora ejecutemos la sentencia: EXECUTE ListarPiezasConPesoMayorA 0 Se puede renombrar un procedimiento almacenado con el procedimiento almacenado del sistema sp_rename, el cual toma tres argumentos: el nombre antiguo, el nuevo nombre y el tipo de objeto ( object es el tipo de objeto para el procedimiento almacenado, y es opcional). El siguiente ejemplo renombra el procedimiento ListarPiezasConPesoMayorA: sp_rename ListarPiezasConPesoMayorA, ListarTodasLasPiezasConPesoMayorA EXECUTE ListarTodasLasPiezasConPesoMayorA 0 4. Eliminando SP Puedes borrar un procedimiento almacenado con la sentencia DROP PROCEDURE: DROP PROCEDURE ListarTodasLasPiezasConPesoMayorA 5. Mostrando información sobre procedimientos almacenados Tres procedimientos almacenados del sistema muestran información sobre procedimientos almacenados: - sp_help nombre_del_procedimiento: Muestra el propietario del procedimiento y cuando fue creado. sp_help ListarPiezasConPesoMayorA - sp_helptext nombre_del_procedimiento: Muestra el código para el procedimiento. sp_helptext ListarPiezasConPesoMayorA - sp_depends nombre_del_procedimiento: Muestra una lista de objetos a los cuales hace referencia el procedimiento sp_depends ListarPiezasConPesoMayorA_ 6. Parámetros sobre SP Un procedimiento almacenado puede tener hasta 1024 parámetros. Cada declaración de parámetro tiene la siguiente forma básica: @nombre_del_parametro tipo_de_dato Un nombre de parámetro empieza con @, y los siguientes caracteres pueden ser letras unicode, dígitos, o los símbolos @, $, # o _. No se podría empezar un parámetro con el nombre @@ ya que SQLServer usa esta notación para algunas funciones. Se puede definir un valor de entrada por defecto a ser usado si ningún argumento es otorgado cuando el procedimiento es llamado. En el ejemplo anterior podemos modificarlo para dar un valor por defecto que podría seleccionar una pieza con peso mayor que cero: CREATE PROCEDURE ListarPiezasConPesoMayorA @Peso Dec (5,2) = 0.001 SELECT * FROM pieza WHERE peso > @Peso

Con esta definición se puede llama al procedimiento simplemente usando la siguiente sentencia, lo cual es equivalente a llamar al procedimiento con 0.001 como argumento: EXECUTE ListarPiezasConPesoMayorA Todos los parámetros pueden servir como parámetros de entrada. Para usar un parámetro como uno de salida, adicionemos la palabra clave Output a su declaración (después del valor por defecto, si es que lo tiene), como se muestra a continuación: CREATE PROCEDURE ConseguirPesoDePieza @CodigoPieza varchar(3), @PesoPieza Dec (5,2) Output Set @PesoPieza = (SELECT peso FROM pieza WHERE codpie = @CodigoPieza ) Cuando se llama a un procedimiento que tiene un parámetro de salida, se DEBE dar una variable para el argumento y usar la palabra clave Output después del argumento en la sentencia EXECUTE. declare @PesoDeLaPieza dec(5,2) EXECUTE ConseguirPesoDePieza P4, @PesoDeLaPieza Output Una manera alternativa para especificar argumentos cuando se llama a procedimientos almacenados es usar el nombre del parámetro correspondiente como es definido en el procedimiento. Veamos: declare @PesoDeLaPieza dec(5,2) EXECUTE ConseguirPesoDePieza 7. Retornando un conjunto como resultado @CodigoPieza = P4, @PesoPieza = @PesoDeLaPieza Output Un procedimiento almacenado retorna un conjunto para cada sentencia SELECT ejecutada que no es usada como una subconsulta (es decir, en lugar de un valor simple) y que no están asignadas todas las columnas en la consulta a variables o parámetros. Por ejemplo el siguiente procedimiento retorna dos conjuntos de resultados. CREATE PROCEDURE ListarVentasBajasYAltas SELECT * FROM ventas WHERE cantidad<100 SELECT * FROM ventas WHERE cantidad>1000 Veamos el resultado de ejecutar: EXECUTE ListarVentasBajasYAltas TRIGGERS

I. MARCO TEÓRICO 1. Definición Los dos principales mecanismos que ofrece Microsoft SQL Server 2000 para exigir las reglas de empresa y la integridad de datos son: las restricciones y los desencadenadores. Un desencadenador es un procedimiento almacenado de tipo especial que actúa automáticamente cuando se modifican los datos de la tabla. Los desencadenadores se invocan en respuesta a las instrucciones INSERT, UPDATE y DELETE. Un desencadenador puede consultar otras tablas e incluir instrucciones de Transact-SQL complejas. El desencadenador y la instrucción que lo activa se tratan como una sola transacción que puede deshacerse desde el desencadenador. Si se detecta un error grave (por ejemplo, no hay suficiente espacio en disco), se deshace automáticamente toda la transacción. Los desencadenadores tienen varias utilidades: Los desencadenadores pueden realizar cambios en cascada por medio de tablas relacionadas de la base de datos; sin embargo, estos cambios pueden ejecutarse de manera más eficaz mediante restricciones de integridad referencial en cascada. Los desencadenadores pueden exigir restricciones más complejas que las restricciones CHECK. A diferencia de éstas, los desencadenadores pueden hacer referencia a columnas de otras tablas. Por ejemplo, un desencadenador puede utilizar una instrucción SELECT de otra tabla para comparar con los datos insertados o actualizados y para realizar acciones adicionales, como modificar los datos o mostrar un mensaje de error definido por el usuario. Los desencadenadores también pueden evaluar el estado de una tabla antes y después de realizar una modificación de datos y actuar en función de la diferencia. Varios desencadenadores del mismo tipo (INSERT, UPDATE o DELETE) en una tabla permiten realizar distintas acciones en respuesta a una misma instrucción de modificación. 2. Detalles Un trigger es un tipo especial de procedimientos almacenados que es ejecutado automáticamente cuando una sentencia INSERT, UPDATE, o DELETE actualiza uno o más registros en una tabla. SQL Server llama a un trigger para cada operación especificada sobre una tabla en particular. Generalmente los triggers son asociados con tablas base (no vistas), sin embargo, existe una clase especial de trigger, que usa además vistas. Los triggers son siempre invocados por SQL Server, no se puede usar la sentencia EXECUTE para llamar a un trigger. Los triggers también no tienen parámetros y no retornan valor. 3. Creación de triggers Primero debemos de crear una tabla base en la que se guarde una bitácora de acciones sobre piezas: CREATE TABLE BitacoraDePiezas( codpie varchar(3), accion varchar(30), usuario varchar(20), fecha datetime ) Se puede crear un trigger usando la sentencia CREATE TRIGGER como se muestra a continuación. CREATE TRIGGER ActualizacionDePieza

ON pieza FOR update INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Update, Current_User, Current_TimeStamp FROM Inserted SELECT * FROM pieza SELECT * FROM BitacoraDePiezas SELECT * FROM Inserted SELECT * FROM deleted Este ejemplo muestra los elementos esenciales de una definición de un trigger. El nombre del trigger es el que aparece después de la palabra clave CREATE TRIGGER. La cláusula ON especifica una simple tabla base con la que está asociada el trigger. La cláusula FOR especifica para qué acción se ejecutará el trigger; se puede usar una o más palabras claves como INSERT, UPDATE o DELETE (como sinónimo a FOR se puede usar AFTER). Después de la cláusula se puede codificar un procedimiento almacenado. Una vez que este ejemplo es creado, SQL Server automáticamente invoca al procedimiento almacenado del trigger cada vez que una actualización sobre la tabla pieza es realizada. En este ejemplo, el trigger consiste de un simple INSERT y adiciona registros a la tabla BitacoraDePiezas. El valor de codpie de la tabla pieza es el nuevo valor insertado en la tabla BitacoraDePiezas. Las otras tres columnas mantienen un tipo de acción (que es update), el usuario que realizó la acción y la fecha y hora. Las tablas temporales Inserted y Deleted tienen la misma estructura de columnas como la tabla base sobre la cual el trigger es definido. Veamos como funciona el trigger, actualizando algunos registros: UPDATE pieza SET nompie= Tuerca ABC WHERE nompie= Tuerca Y luego UPDATE pieza SET nompie='clavo XYZ' WHERE nompie='clavo' AND peso>5 No es necesario crear la tabla: Inserted para usar el trigger. SQL Server maneja tablas residentes en memoria automáticamente usadas por triggers. También el registro de las operaciones de INSERT y DELETE sobre pieza pueden ser usados creando los siguientes dos triggers. CREATE TRIGGER InsercionDePieza ON pieza FOR insert INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Insert, Current_User, Current_TimeStamp FROM Inserted SELECT * FROM pieza SELECT * FROM BitacoraDePiezas SELECT * FROM Inserted SELECT * FROM deleted CREATE TRIGGER EliminacionDePieza ON pieza FOR delete INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha )

SELECT codpie, Delete, Current_User, Current_TimeStamp FROM Deleted SELECT * FROM pieza SELECT * FROM BitacoraDePiezas SELECT * FROM Inserted SELECT * FROM deleted Nótese que en este último trigger se usa el identificador Deleted que se refiere a la tabla residente en memoria que contiene todos los registros antiguos para la tabla. Veamos como funciona el trigger, insertando y borrando un registro: INSERT INTO pieza VALUES ( P50, Mi pieza, Naranja,30, Arequipa ) DELETE FROM pieza where codpie= P50 Ahora borremos nuestros triggers recientemente creados: DROP TRIGGER ActualizacionDePieza DROP TRIGGER InsercionDePieza DROP TRIGGER EliminacionDePieza Como una alternativa para crear un trigger para cada tipo de operación, se puede crear un simple trigger para las tres operaciones y usar algunas técnicas de programación para manejar cada tipo de operación apropiadamente. El siguiente ejemplo lista los tres tipos de sentencias en la cláusula FOR y usa sentencias de condición para insertar apropiadamente valores en la tabla BitacoraDePiezas: CREATE TRIGGER OperacionesSobrePieza ON pieza FOR insert, update, delete DECLARE @NumeroDeInserciones Int DECLARE @NumeroDeEliminaciones Int SET @NumeroDeInserciones = (SELECT COUNT(*) FROM Inserted ) SET @NumeroDeEliminaciones = (SELECT COUNT(*) FROM Deleted ) If ( @NumeroDeInserciones > 0 ) Begin INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Case When ( @NumeroDeEliminaciones > 0 ) Then Update Else Insert End, Current_User, Current_TimeStamp FROM Inserted End Else If ( @NumeroDeEliminaciones > 0 ) Begin INSERT INTO BitacoraDePiezas ( codpie, accion, usuario, fecha ) SELECT codpie, Delete, Current_User, Current_TimeStamp FROM Deleted End En este ejemplo se puede ver que la tabla temporal Inserted tiene filas cada vez que una sentencia INSERT o UPDATE afecta una o más filas. Para la sentencia UPDATE, la tabla temporal Deleted tiene los valores de las filas antiguas y la tabla temporal Inserted tiene los nuevos valores de las filas. En este ejemplo también refleja otro importante aspecto de los triggers: Un trigger para una operación UPDATE o DELETE sobre una tabla es invocada si ninguna fila es afectada por la sentencia (porque ninguna fila satisface la cláusula Where).

INSERT INTO pieza VALUES ( P50, Otra pieza, Marron,50, Chile ) UPDATE pieza SET codpie= P96 WHERE codpie= P50 DELETE FROM pieza where codpie= P96 4. Verificando cambios para una columna específica Para un trigger INSERT o UPDATE es posible codificar si una columna es actualizada, usando el comando test: if update(nombre_de_clumna) en el cuerpo del trigger si la sentencia INSERT o UPDATE explícitamente lista una o más columnas en particular. El siguiente ejemplo muestra como usar este test: CREATE TRIGGER ActualizacionDeStatusDeProveedor ON proveedor FOR update If update( status ) INSERT into BitacoraDeStatusDeProveedor ( codpro, accion, status, usuario, fecha ) SELECT codpro, Update, status, Current_User, Current_TimeStamp FROM Inserted EndIf Para la ejecución correcta del trigger se necesita la siguiente tabla: CREATE TABLE BitacoraDeStatusDeProveedor ( codpro varchar(3), accion varchar(30), status numeric, usuario varchar(20), fecha datetime ) Ejecutemos las siguientes sentencias: select * from proveedor UPDATE proveedor SET nompro= Juan Reynoso WHERE ciudad= Lima SELECT * FROM BitacoraDeStatusDeProveedor UPDATE proveedor SET status=2 WHERE ciudad= Lima SELECT * FROM BitacoraDeStatusDeProveedor Con la función Columns_Update() se puede conocer que columnas son actualizadas para las sentencias INSERT o UPDATE. 5. Alterando y borrando triggers Para cambiar la definición de un trigger, se puede borrar y luego re-crearlo, o usar la sentencia ALTER TRIGGER. Para borrar un trigger, se usa la sentencia DROP TRIGGER: DROP TRIGGER ActualizacionDeStatusDeProveedor 6. Habilitando y deshabilitando triggers La sentencia ALTER TABLE permite habilitar y deshabilitar triggers: ALTER TABLE proveedor DISABLE TRIGGER ActualizacionDeStatusDeProveedor Operaciones: UPDATE proveedor SET status=2 WHERE ciudad= Lima SELECT * FROM BitacoraDeStatusDeProveedor 7. Mostrando información sobre triggers Cuatro procedimientos almacenados muestran información sobre estos: - sp_help nombre_trigger: Muestra el propietario y la fecha de creación del trigger. - sp_helptext nombre_trigger: Muestra el código para el trigger. - sp_helptrigger nombre_tabla: Muestra una listra de triggers definidos para una tabla. - sp_depends nombre_trigger: Muestra la lista de objetos a los cuales el trigger hace referencia.