U de M. Modulo de Base de Datos UNIVERSIDAD DE MANAGUA MODULO: BASE DE DATOS CATEDRATICO: Msc.Ing. Leonel Martínez Uso exclusivo para estudiantes de la U de M. Prohibida su reproducción. INDICE Manual básico de Base de Datos IINTRODUCCIÓN A LAS BASE DE DATOS ................................................................................... 3 1.1 GENERALIDADES DE BASE DE DATOS .......................................................................................... 3 ¿Por qué utilizar una base de datos? ............................................................................................ 3 Administración de bases de datos ................................................................................................. 3 1.2 DEFINICIÓN DE BASE DE DATOS .................................................................................................... 4 1.2 OBJETIVOS DE LOS SISTEMAS DE BASES DE DATOS. .......................................................................... 6 1.3 ABSTRACCIÓN DE LA INFORMACIÓN. .............................................................................................. 7 1.4 MODELOS DE DATOS. .................................................................................................................... 8 1.6 INDEPENDENCIA DE LOS DATOS ................................................................................................... 12 1.7 LENGUAJE DE DEFINICIÓN DE DATOS............................................................................................. 13 1.8 LENGUAJE DE MANIPULACIÓN DE DATOS ....................................................................................... 13 1.9 MANEJADOR DE BASES DE DATOS ................................................................................................ 13 1.10 ADMINISTRADOR DE BASES DE DATOS ................................................................................. 14 1.11 USUARIOS DE LAS BASES DE DATOS. ............................................................................................ 15 1.12 ESTRUCTURA GENERAL DEL SISTEMA. ......................................................................................... 15 1.13 BASE DE DATOS RELACIONALES ................................................................................................. 17 1.14 Conceptos Prácticos de Base de Datos Relacional ...................................................................... 20 RELACIONES ................................................................................................................................... 21 II. DISEÑO DE BASE DE DATOS ............................................................................................... 27 2.1 RELACIONES Y CONSULTAS SQL .................................................................................................. 27 RELACIONES ..................................................................................................................................... 27 SQL..................................................................................................................................................... 27 ACTUALIZAR DATOS EN TRANSACT SQL ................................................................................ 42 UPDATE............................................................................................................................................ 42 UPDATE INNER JOIN ...................................................................................................................... 42 BORRAR DATOS EN TRANSACT SQL ......................................................................................... 43 DELETE ............................................................................................................................................ 43 PROCEDIMIENTOS ALMACENADOS EN TRANSACT SQL ..................................................... 44 TRIGGERS EN TRANSACT SQL ................................................................................................... 46 TRIGGER DML. ................................................................................................................................ 46 TRIGGER DDL .................................................................................................................................. 50 2.2 DISEÑO Y CREACIÓN DE LA BASE DE DATOS ................................................................................. 52 2.3 CREACIÓN DE LA BASE DE DATOS A TRAVÉS DE CÓDIGO SQL(SCRIPTS) ......................................... 56 2.3.1 Creación las tablas a través de código SQL(Scripts) ....................................................... 56 2.3.2 Creación de Reglas por medio de código SQL ................................................................... 62 2.2.3 Creación de Funciones por medio de código SQL ............................................................. 62 2.3.4 Creación de Trigger por medio de código SQL ................................................................. 64 2.3.5 Creación de Procedimientos por medio de código SQL ..................................................... 66 2.4 CREACIÓN DE LA BASE DE DATOS POR MEDIO DEL ENTORNO CORPORATIVO ................................. 68 2.4.1 Crear una Base de Datos con el Administrador Corporativo de SQL SERVER 2005 y Access......................................................................................................................................... 68 2.4.2 Crear las Tablas de la Base de Datos con el Administrador Corporativo .......................... 68 2.4.3 Cómo crear un procedimiento almacenado (SQL Server Management Studio) ................ 69 2.4.4 Cómo crear Trigger (SQL Server Management Studio) .................................................... 69 III. INSTALACION DE SQL SERVER 2005 ............................................................................ 70 IV. MANTENIMIENTO Y RESPALDO ................................................................................... 84 Elaborado por: Msc.Ing. Leonel Martínez 1 Manual básico de Base de Datos V. ADMINISTRACION DE LA BASE DE DATOS..................................................................... 84 VI. CASOS DE BASE DE DATOS CON ACCESS Y SQL SERVER 2005.............................. 84 6.1 CASO 1: SISTEMA DE FACTURACION VENTA E INVENTARIO ........................................... 85 6.2 CASO 2: SUPONGA EL CASO DE UN SISTEMA DE UNA CLÍNICA HOSPITALARIA QUE ESTÁ ADSCRITA AL INSS 85 6.3 CASO 3. TOMANDO EN CUENTA EL CASO DE UN SISTEMA DE REGISTRO ACADÉMICO DE UNA UNIVERSIDAD PRIVADA Y DE UN CENTRO DE EDUCACIÓN DE PRIMARIA Y SECUNDARIA PRIVADA .......... 85 6.4 CASO 4. CONSTRUYA LA BASE DE DATOS PARA UN SISTEMA DE RECURSOS HUMANOS. ................ 86 6.5 CASO 5. CONSTRUYA EN ASP 2005 O SUPERIOR Y EN VISUAL BASIC 6.0 LAS INTERFACES BÁSICAS PARA EL INGRESO DE DATOS PARA EL SISTEMA DE FACTURACIÓN VENTA E INVENTARIO. ..................... 86 VII. AUDITORIA DE BASE DE DATOS ................................................................................... 86 Elaborado por: Msc.Ing. Leonel Martínez 2 Manual básico de Base de Datos I. INTRODUCCIÓN A LAS BASE DE DATOS 1.1 Generalidades de Base de Datos Una base de datos (cuya abreviatura es BD) es una entidad en la cual se pueden almacenar datos de manera estructurada, con la menor redundancia posible. Diferentes programas y diferentes usuarios deben poder utilizar estos datos. Por lo tanto, el concepto de base de datos generalmente está relacionado con el de red ya que se debe poder compartir esta información. De allí el término base. "Sistema de información" es el término general utilizado para la estructura global que incluye todos los mecanismos para compartir datos que se han instalado. ¿Por qué utilizar una base de datos? Una base de datos proporciona a los usuarios el acceso a datos, que pueden visualizar, ingresar o actualizar, en concordancia con los derechos de acceso que se les hayan otorgado. Se convierte más útil a medida que la cantidad de datos almacenados crece. Una base de datos puede ser local, es decir que puede utilizarla sólo un usuario en un equipo, o puede ser distribuida, es decir que la información se almacena en equipos remotos y se puede acceder a ella a través de una red. La principal ventaja de utilizar bases de datos es que múltiples usuarios pueden acceder a ellas al mismo tiempo. Administración de bases de datos Rápidamente surgió la necesidad de contar con un sistema de administración para controlar tanto los datos como los usuarios. La administración de bases de datos se realiza con un sistema llamado DBMS (Database management system [Sistema de administración de bases de datos]). El DBMS es un conjunto de servicios (aplicaciones de software) para administrar bases de datos, que permite: un fácil acceso a los datos el acceso a la información por parte de múltiples usuarios Elaborado por: Msc.Ing. Leonel Martínez 3 Manual básico de Base de Datos la manipulación de los datos encontrados en la base de datos (insertar, eliminar, editar) El DBMS puede dividirse en tres subsistemas: El sistema de administración de archivos: para almacenar información en un medio físico El DBMS interno: para ubicar la información en orden El DBMS externo: representa la interfaz del usuario 1.2 Definición de Base de Datos Una base de datos es una colección de información organizada de forma que un programa de ordenador pueda seleccionar rápidamente los fragmentos de datos que necesite. Una base de datos es un sistema de archivos electrónico. Las bases de datos tradicionales se organizan por campos, registros y archivos. Un campo es una pieza única de información; un registro es un sistema completo de campos; y un archivo es una colección de registros. Por ejemplo, una guía de teléfono es análoga a un archivo. Contiene una lista de registros, cada uno de los cuales consiste en tres campos: nombre, dirección, y número de teléfono. Dato: Conjunto de caracteres con algún significado, pueden ser numéricos, alfabéticos, o alfanuméricos. Información: Es un conjunto ordenado de datos los cuales son manejados según la necesidad del Elaborado por: Msc.Ing. Leonel Martínez 4 Manual básico de Base de Datos usuario, para que un conjunto de datos pueda ser procesado eficientemente y pueda dar lugar a información, primero se debe guardar lógicamente en archivos. Conceptos básicos de archivos computacionales. Campo: Es la unidad más pequeña a la cual uno puede referirse en un programa. Desde el punto de vista del programador representa una característica de un individuo u objeto. Registro: Colección de campos de iguales o de diferentes tipos. Archivo: Colección de registros almacenados siguiendo una estructura homogénea. Base de datos: Es una colección de archivos interrelacionados, son creados con un DBMS. El contenido de una base de datos engloba a la información concerniente(almacenadas en archivos) de una organización, de tal manera que los datos estén disponibles para los usuarios, una finalidad de la base de datos es eliminar la redundancia o al menos minimizarla. Los tres componentes principales de un sistema de base de datos son el hardware, el software DBMS y los datos a manejar, así como el personal encargado del manejo del sistema. Sistema Manejador de Base de Datos. (DBMS) Un DBMS es una colección de numerosas rutinas de software interrelacionadas, cada una de las cuales es responsable de una tarea específica. El objetivo primordial de un sistema manejador base de datos es proporcionar un contorno que sea a la vez conveniente y eficiente para ser utilizado al extraer, almacenar y manipular información de la base de datos. Todas las peticiones de acceso a la base, se manejan centralizadamente por medio del DBMS, por lo que este paquete funciona como interface entre los usuarios y la base de datos. Esquema de base de datos: Es la estructura por la que esta formada la base de datos, se especifica por medio de un conjunto de definiciones que se expresa mediante un lenguaje especial llamado lenguaje de definición de datos. (DDL) Administrador de base de datos (DBA): Es la persona o equipo de personas profesionales responsables del control y manejo del sistema de base de datos, generalmente tiene(n) experiencia en DBMS, diseño de bases de datos, Sistemas operativos, comunicación de datos, hardware y programación. Los sistemas de base de datos se diseñan para manejar grandes cantidades de información, la manipulación de los datos involucra tanto la definición de estructuras para el almacenamiento de la información como la provisión de mecanismos para la manipulación de la información, además un sistema de base de datos debe de tener implementados mecanismos de seguridad que garanticen la integridad de la información, a pesar de caídas del sistema o intentos de accesos no autorizados. Elaborado por: Msc.Ing. Leonel Martínez 5 Manual básico de Base de Datos Un objetivo principal de un sistema de base de datos es proporcionar a los usuarios finales una visión abstracta de los datos, esto se logra escondiendo ciertos detalles de como se almacenan y mantienen los datos. 1.2 Objetivos de los sistemas de bases de datos. Los objetivos principales de un sistema de base de datos es disminuir los siguientes aspectos: Redundancia e inconsistencia de datos. Puesto que los archivos que mantienen almacenada la información son creados por diferentes tipos de programas de aplicación existe la posibilidad de que si no se controla detalladamente el almacenamiento, se pueda originar un duplicado de información, es decir que la misma información sea más de una vez en un dispositivo de almacenamiento. Esto aumenta los costos de almacenamiento y acceso a los datos, además de que puede originar la inconsistencia de los datos - es decir diversas copias de un mismo dato no concuerdan entre sí -, por ejemplo: que se actualiza la dirección de un cliente en un archivo y que en otros archivos permanezca la anterior. Dificultad para tener acceso a los datos. Un sistema de base de datos debe contemplar un entorno de datos que le facilite al usuario el manejo de los mismos. Supóngase un banco, y que uno de los gerentes necesita averiguar los nombres de todos los clientes que viven dentro del código postal 78733 de la ciudad. El gerente pide al departamento de procesamiento de datos que genere la lista correspondiente. Puesto que esta situación no fue prevista en el diseño del sistema, no existe ninguna aplicación de consulta que permita este tipo de solicitud, esto ocasiona una deficiencia del sistema. Aislamiento de los datos. Puesto que los datos están repartidos en varios archivos, y estos no pueden tener diferentes formatos, es difícil escribir nuevos programas de aplicación para obtener los datos apropiados. Anomalías del acceso concurrente. Para mejorar el funcionamiento global del sistema y obtener un tiempo de respuesta más rápido, muchos sistemas permiten que múltiples usuarios actualicen los datos simultáneamente. En un entorno así la interacción de actualizaciones concurrentes puede dar por resultado datos inconsistentes. Para prevenir esta posibilidad debe mantenerse alguna forma de supervisión en el sistema. Problemas de seguridad. La información de toda empresa es importante, aunque unos datos lo son más que otros, por tal motivo se debe considerar el control de acceso a los mismos, no todos los usuarios pueden visualizar alguna información, por tal motivo para que un sistema de base de datos sea confiable debe mantener un grado de seguridad que garantice la Elaborado por: Msc.Ing. Leonel Martínez 6 Manual básico de Base de Datos autentificación y protección de los datos. En un banco por ejemplo, el personal de nóminas sólo necesita ver la parte de la base de datos que tiene información acerca de los distintos empleados del banco y no a otro tipo de información. Problemas de integridad. Los valores de datos almacenados en la base de datos deben satisfacer cierto tipo de restricciones de consistencia. Estas restricciones se hacen cumplir en el sistema añadiendo códigos apropiados en los diversos programas de aplicación. 1.3 Abstracción de la información. Una base de datos es en esencia una colección de archivos relacionados entre sí, de la cual los usuarios pueden extraer información sin considerar las fronteras de los archivos. Un objetivo importante de un sistema de base de datos es proporcionar a los usuarios una visión abstracta de los datos, es decir, el sistema esconde ciertos detalles de cómo se almacenan y mantienen los datos. Sin embargo para que el sistema sea manejable, los datos se deben extraer eficientemente. Existen diferentes niveles de abstracción para simplificar la interacción de los usuarios con el sistema; Interno, conceptual y externo, específicamente el de almacenamiento físico, el del usuario y el del programador. Nivel físico. Es la representación del nivel más bajo de abstracción, en éste se describe en detalle la forma en cómo de almacenan los datos en los dispositivos de almacenamiento(por ejemplo, mediante señaladores o índices para el acceso aleatorio a los datos). Nivel conceptual. El siguiente nivel más alto de abstracción, describe que datos son almacenados realmente en la base de datos y las relaciones que existen entre los mismos, describe la base de datos completa en términos de su estructura de diseño. El nivel conceptual de abstracción lo usan los administradores de bases de datos, quienes deben decidir qué información se va a guardar en la base de datos. Consta de las siguientes definiciones: 1. Definición de los datos: Se describen el tipo de datos y la longitud de campo todos los elementos direccionables en la base. Los elementos por definir incluyen artículos elementales (atributos), totales de datos y registros conceptuales (entidades). 2. Relaciones entre datos: Se definen las relaciones entre datos para enlazar tipos de registros relacionados para el procesamiento de archivos múltiples. Elaborado por: Msc.Ing. Leonel Martínez 7 Manual básico de Base de Datos En el nivel conceptual la base de datos aparece como una colección de registros lógicos, sin descriptores de almacenamiento. En realidad los archivos conceptuales no existen físicamente. La transformación de registros conceptuales a registros físicos para el almacenamiento se lleva a cabo por el sistema y es transparente al usuario. Nivel de visión. Nivel más alto de abstracción, es lo que el usuario final puede visualizar del sistema terminado, describe sólo una parte de la base de datos al usuario acreditado para verla. El sistema puede proporcionar muchas visiones para la misma base de datos. La interrelación entre estos tres niveles de abstracción se ilustra en la siguiente figura. 1.4 Modelos de datos. Para introducirnos en este tema, empezaremos definiendo que es un modelo. Modelo: Es una representación de la realidad que contiene las características generales de algo que se va a realizar. En base de datos, esta representación la elaboramos de forma gráfica. ¿Qué es modelo de datos? Es una colección de herramientas conceptuales para describir los datos, las relaciones que existen entre ellos, semántica asociada a los datos y restricciones de consistencia. Los modelos de datos se dividen en tres grupos: Modelos lógicos basados en objetos. Modelos lógicos basados en registros. Modelos físicos de datos. Elaborado por: Msc.Ing. Leonel Martínez 8 Manual básico de Base de Datos Modelos lógicos basados en objetos. Se usan para describir datos en los niveles conceptual y de visión, es decir, con este modelo representamos los datos de tal forma como nosotros los captamos en el mundo real, tienen una capacidad de estructuración bastante flexible y permiten especificar restricciones de datos explícitamente. Existen diferentes modelos de este tipo, pero el más utilizado por su sencillez y eficiencia es el modelo Entidad-Relación. Modelo Entidad-Relación. Denominado por sus siglas como: E-R; Este modelo representa a la realidad a través de entidades, que son objetos que existen y que se distinguen de otros por sus características, por ejemplo: un alumno se distingue de otro por sus características particulares como lo es el nombre, o el numero de control asignado al entrar a una institución educativa, así mismo, un empleado, una materia, etc. Las entidades pueden ser de dos tipos: Tangibles : Son todos aquellos objetos físicos que podemos ver, tocar o sentir. Intangibles: Todos aquellos eventos u objetos conceptuales que no podemos ver, aun sabiendo que existen, por ejemplo: la entidad materia, sabemos que existe, sin embargo, no la podemos visualizar o tocar. Las características de las entidades en base de datos se llaman atributos, por ejemplo el nombre, dirección teléfono, grado, grupo, etc. son atributos de la entidad alumno; Clave, número de seguro social, departamento, etc., son atributos de la entidad empleado. A su vez una entidad se puede asociar o relacionar con más entidades a través de relaciones. Pero para entender mejor esto, veamos un ejemplo: Consideremos una empresa que requiere controlar a los vendedores y las ventas que ellos realizan; de este problema determinamos que los objetos o entidades principales a estudiar son el empleado (vendedor) y el artículo (que es el producto en venta), y las características que los identifican son: Empleado: Artículo: Nombre Puesto Salario Descripción Costo Clave R.F.C. La relación entre ambas entidades la podemos establecer como Venta. Bueno, ahora nos falta describir como se representa un modelo E-R gráficamente, la representación es muy sencilla, se emplean símbolos, los cuales son: Elaborado por: Msc.Ing. Leonel Martínez 9 Manual básico de Base de Datos Símbolo Representa Así nuestro ejemplo anterior quedaría representado de la siguiente forma: Existen más aspectos a considerar con respecto a los modelos entidad relación, estos serán considerados en el tema Modelo Entidad Relación. Modelos lógicos basados en registros. Se utilizan para describir datos en los niveles conceptual y físico. Estos modelos utilizan registros e instancias para representar la realidad, así como las relaciones que existen entre estos registros (ligas) o apuntadores. A diferencia de los modelos de datos basados en objetos, se usan para especificar la estructura lógica global de la base de datos y para proporcionar una descripción a nivel más alto de la implementación. Los tres modelos de datos más ampliamente aceptados son: Modelo Relacional Modelo de Red Modelo Jerárquico * Modelo relacional. En este modelo se representan los datos y las relaciones entre estos, a través de una colección de tablas, en las cuales los renglones (tuplas) equivalen a los cada uno de los registros que contendrá la base de datos y las columnas corresponden a las características(atributos) de cada registro localizado en la tupla; Elaborado por: Msc.Ing. Leonel Martínez 10 Manual básico de Base de Datos Considerando nuestro ejemplo del empleado y el artículo: Tabla del empleado Ahora te preguntaras ¿cómo se representan las relaciones entre las entidades en este modelo? Existen dos formas de representarla; pero para ello necesitamos definir que es una llave primaria: Es un atributo el cual definimos como atributo principal, es una forma única de identificar a una entidad. Por ejemplo, el RFC de un empleado se distingue de otro por que los RFC no pueden ser iguales. Ahora sí, las formas de representar las relaciones en este modelo son: 1. Haciendo una tabla que contenga cada una de las llaves primarias de las entidades involucradas en la relación. Tomando en cuenta que la llave primaria del empleado es su RFC, y la llave primaria del artículo es la Clave. 2. Incluyendo en alguna de las tablas de las entidades involucradas, la llave de la otra tabla. Elaborado por: Msc.Ing. Leonel Martínez 11 Manual básico de Base de Datos * Modelo de red. Este modelo representa los datos mediante colecciones de registros y sus relaciones se representan por medio de ligas o enlaces, los cuales pueden verse como punteros. Los registros se organizan en un conjunto de gráficas arbitrarias. Ejemplo: Para profundizar en este tema visitemos: Modelo de datos de red. * Modelo jerárquico. Es similar al modelo de red en cuanto a las relaciones y datos, ya que estos se representan por medio de registros y sus ligas. La diferencia radica en que están organizados por conjuntos de arboles en lugar de gráficas arbitrarias. Para profundizar más en el tema visita: Modelo de datos jerárquico. Modelos físicos de datos. Se usan para describir a los datos en el nivel más bajo, aunque existen muy pocos modelos de este tipo, básicamente capturan aspectos de la implementación de los sistemas de base de datos. Existen dos clasificaciones de este tipo que son: Modelo unificador Memoria de elementos. 1.6 Independencia de los datos Se refiere a la protección contra los programas de aplicación que puedan originar modificaciones cuando se altera la organización física o lógica de la base de datos. Existen 2 niveles de independencia de datos. Independencia física de datos: Es la capacidad de modificar el esquema físico sin provocar que se vuelvan a escribir los programas de aplicación. Elaborado por: Msc.Ing. Leonel Martínez 12 Manual básico de Base de Datos Independencia lógica de datos: Capacidad de modificar el esquema conceptual sin provocar que se vuelvan a escribir los programas de aplicación. 1.7 Lenguaje de definición de datos El lenguaje de definición de datos, denominado por sus siglas como: DDL(Data definition Language). Permite definir un esquema de base de datos por medio de una serie de definiciones que se expresan en un lenguaje especial, el resultado de estas definiciones se almacena en un archivo especial llamado diccionario de datos. 1.8 Lenguaje de manipulación de datos La manipulación de datos se refiere a las operaciones de insertar, recuperar, eliminar o modificar datos; dichas operaciones son realizadas a través del lenguaje de manipulación de datos (DML, Data Manipulation Language), que es quién permite el acceso de los usuarios a los datos. Existen básicamente 2 tipos de lenguajes de manipulación de datos: Procedimentales: Los LMD requieren que el usuario especifique que datos se necesitan y cómo obtenerlos. No procedimentales: Los LMD requieren que el usuario especifique que datos se necesitan y sin especificar cómo obtenerlos. 1.9 Manejador de Bases de Datos El sistema manejador de bases de datos es la porción más importante del software de un sistema de base de datos. Un DBMS es una colección de numerosas rutinas de software interrelacionadas, cada una de las cuales es responsable de alguna tarea específica. Las funciones principales de un DBMS son: Crear y organizar la Base de datos. Establecer y mantener las trayectorias de acceso a la base de datos de tal forma que los datos puedan ser accesados rápidamente. Manejar los datos de acuerdo a las peticiones de los usuarios. Registrar el uso de las bases de datos. Interacción con el manejador de archivos. Elaborado por: Msc.Ing. Leonel Martínez 13 Manual básico de Base de Datos Esto a través de las sentencias en DML al comando de sistema de archivos. Así el Manejador de base de datos es responsable del verdadero almacenamiento de los datos. el el Respaldo y recuperación. Consiste en contar con mecanismos implantados permitan la recuperación fácilmente de los datos en de ocurrir fallas en el sistema de base de datos. que caso Control de concurrencia. Consiste en controlar la interacción entre concurrentes para no afectar la inconsistencia de los datos. los usuarios Seguridad e integridad. Consiste en contar con mecanismos que permitan el control de la consistencia de los datos evitando que estos se vean perjudicados por cambios no autorizados o previstos. El DBMS es conocido también como Gestor de Base de datos. La figura muestra el DBMS como interfase entre la base de datos física y las peticiones del usuario. El DBMS interpreta las peticiones de entrada/salida del usuario y las manda al sistema operativo para la transferencia de datos entre la unidad de memoria secundaria y la memoria principal. En sí, un sistema manejador de base de datos es el corazón de la base de datos ya que se encarga del control total de los posibles aspectos que la puedan afectar. 1.10 Administrador de Bases de Datos Denominado por sus siglas como: DBA, Database Administrator. Es la persona encargada y que tiene el control total sobre el sistema de base de datos, sus funciones principales son: Definición de esquema. Es el esquema original de la base de datos se crea escribiendo un conjunto de definiciones que son traducidas por el compilador de DDL a un conjunto de tablas que son almacenadas permanentemente en el diccionario de datos. Elaborado por: Msc.Ing. Leonel Martínez 14 Manual básico de Base de Datos Definición de la estructura de almacenamiento del método de acceso. Estructuras de almacenamiento y de acceso adecuados se crean escribiendo un conjunto de definiciones que son traducidas por el compilador del lenguaje de almacenamiento y definición de datos. Concesión de autorización para el acceso a los datos. Permite al administrador de la base de datos regular las partes de las bases de datos que van a ser accedidas por varios usuarios. Especificación de limitantes de integridad. Es una serie de restricciones que se encuentran almacenados en una estructura especial del sistema que es consultada por el gestor de base de datos cada vez que se realice una actualización al sistema. 1.11 Usuarios de las bases de datos. Podemos definir a los usuarios como toda persona que tenga todo tipo de contacto con el sistema de base de datos desde que este se diseña, elabora, termina y se usa. Los usuarios que accesan una base de datos pueden clasificarse como: Programadores de aplicaciones. Los profesionales en computación que interactúan con el sistema por medio de llamadas en DML (Lenguaje de Manipulación de Datos), las cuales están incorporadas en un programa escrito en un lenguaje de programación (Por ejemplo, COBOL, PL/I, Pascal, C, etc.) Usuarios sofisticados. Los usuarios sofisticados interactúan con el sistema sin escribir programas. En cambio escriben sus preguntas en un lenguaje de consultas de base de datos. Usuarios especializados. Algunos usuarios sofisticados escriben aplicaciones de base de datos especializadas que no encajan en el marco tradicional de procesamiento de datos. Usuarios ingenuos. Los usuarios no sofisticados interactúan con el sistema invocando a uno de los programas de aplicación permanentes que se han escrito anteriormente en el sistema de base de datos, podemos mencionar al usuario ingenuo como el usuario final que utiliza el sistema de base de datos sin saber nada del diseño interno del mismo por ejemplo: un cajero. 1.12 Estructura general del sistema. Un sistema de base de datos se encuentra dividido en módulos cada uno de los cuales controla una parte de la responsabilidad total de sistema. En la mayoría de los casos, Elaborado por: Msc.Ing. Leonel Martínez 15 Manual básico de Base de Datos el sistema operativo proporciona únicamente los servicios más básicos y el sistema de la base de datos debe partir de esa base y controlar además el manejo correcto de los datos. Así el diseño de un sistema de base de datos debe incluir la interfaz entre el sistema de base de datos y el sistema operativo. Los componentes funcionales de un sistema de base de datos, son: Gestor de archivos. Gestiona la asignación de espacio en la memoria de las estructuras de datos usadas para representar información. del disco y Manejador de base de datos. Sirve de interfaz entre los datos y los programas de aplicación. Procesador de consultas. Traduce las proposiciones instrucciones de bajo nivel. usuario en una forma más eficiente. en lenguajes de Además convierte la consulta solicitud a del Compilador de DDL. Convierte las que contienen de datos. proposiciones DDL en un conjunto de tablas metadatos, estas se almacenan en el diccionario Archivo de datos. En él se organización. encuentran almacenados físicamente los datos de una Diccionario de datos. Contiene de datos. la información referente a la estructura de la base Índices. Permiten un específicos. rápido acceso a registros que contienen Una forma gráfica de representar los componentes mencionados y la relación que existe entre ellos sería la siguiente. Elaborado por: Msc.Ing. Leonel Martínez 16 valores antes Manual básico de Base de Datos 1.13 Base de Datos Relacionales Una base de datos relacional es una base de datos que cumple con el modelo relacional, el cual es el modelo más utilizado en la actualidad para modelar problemas reales y administrar datos dinámicamente. Tras ser postuladas sus bases en 1970 por Edgar Frank Codd, de los laboratorios IBM en San José (California), no tardó en consolidarse como un nuevo paradigma en los modelos de base de datos. Elaborado por: Msc.Ing. Leonel Martínez 17 Manual básico de Base de Datos Características Una base de datos relacional se compone de varias tablas o relaciones. No pueden existir dos tablas con el mismo nombre. Cada tabla es a su vez un conjunto de registros, filas o tuplas. Cada registro representa un objeto del mundo real. Cada una de estos registros consta de varias columnas, campos o atributos. No pueden existir dos columnas con el mismo nombre en una misma tabla. Los valores almacenados en una columna deben ser del mismo tipo de dato. Todas las filas de una misma tabla poseen el mismo número de columnas. No se considera el orden en que se almacenan los registros en las tablas. No se considera el orden en que se almacenan las tablas en la base de datos. La información puede ser recuperada o almacenada por medio de sentencias llamadas «consultas». ELEMENTOS Relaciones base y derivadas En una base de datos relacional, todos los datos se almacenan y se acceden a ellos por medio de relaciones. Las relaciones que almacenan datos son llamados "relaciones base" y su implementación es llamada "tabla". Otras relaciones no almacenan datos, pero que son calculadas al aplicar operaciones relacionales. Estas relaciones son llamadas "relaciones derivadas" y su implementación es llamada "vista" o "consulta". Las relaciones derivadas son convenientes ya que expresan información de varias relaciones actuando como si fuera una sola. Restricciones Una restricción es una condición que obliga el cumplimiento de ciertas condiciones en la base de datos. Algunas no son determinadas por los usuarios, sino que son inherentemente definidas por el simple hecho de que la base de datos sea relacional. Algunas otras restricciones las puede definir el usuario, por ejemplo, usar un campo con valores enteros entre 1 y 10. Las restricciones proveen un método de implementar reglas en la base de datos. Las restricciones restringen los datos que pueden ser almacenados en las tablas. Usualmente se definen usando expresiones que dan como resultado un valor booleano, indicando si los datos satisfacen la restricción o no. Las restricciones no son parte formal del modelo relacional, pero son incluidas porque juegan el rol de organizar mejor los datos. Las restricciones son muy discutidas junto con los conceptos relacionales. Elaborado por: Msc.Ing. Leonel Martínez 18 Manual básico de Base de Datos Dominios Un dominio describe un conjunto de posibles valores para cierto atributo. Como un dominio restringe los valores del atributo, puede ser considerado como una restricción. Matemáticamente, atribuir un dominio a un atributo significa "todos los valores de este atributo deben de ser elementos del conjunto especificado". Distintos tipos de dominios son: enteros, cadenas de texto, fecha, etc... Clave única Cada tabla puede tener uno o más campos cuyos valores identifican de forma única cada registro de dicha tabla, es decir, no pueden existir dos o más registros diferentes cuyos valores en dichos campos sean idénticos. Este conjunto de campos se llama clave única. Pueden existir varias claves únicas en una determinada tabla, y a cada una de éstas suele llamársele candidata a clave primaria. Clave primaria Una clave primaria es una clave única elegida entre todas las candidatas que define unívocamente a todos los demás a tributos de la tabla, para especificar los datos que serán relacionados con las demás tablas. La forma de hacer esto es por medio de claves foráneas. Sólo puede existir una clave primaria por tabla y ningún campo de dicha clave puede contener valores NULL. Clave foránea Una clave foránea es una referencia a una clave en otra tabla. Las claves foráneas no necesitan ser claves únicas en la tabla donde están y si a donde están referenciadas. Por ejemplo, el código de departamento puede ser una clave foránea en la tabla de empleados, pero obviamente se permite que haya varios empleados en un mismo departamento, pero existirá solo un departamento. Clave índice Las claves índices surgen con la necesidad de tener un acceso más rápido a los datos. Los índices pueden ser creados con cualquier combinación de campos de una tabla. Las consultas que filtran registros por medio de estos campos, pueden encontrar los registros de forma no secuencial usando la clave índice. Las bases de datos relacionales incluyen múltiples técnicas de ordenamiento, cada una de ellas es óptima para cierta distribución de datos y tamaño de la relación. Los índices generalmente no se consideran parte de la base de datos, pues son un detalle agregado. Sin embargo, las claves índices son desarrolladas por el mismo grupo de programadores que las otras partes de la base de datos. Elaborado por: Msc.Ing. Leonel Martínez 19 Manual básico de Base de Datos Procedimientos almacenados Un procedimiento almacenado es código ejecutable que se asocia y se almacena con la base de datos. Los procedimientos almacenados usualmente recogen y personalizan operaciones comunes, como insertar un registro dentro de una tabla, recopilar información estadística, o encapsular cálculos complejos. Son frecuentemente usandos por un API por seguridad o simplicidad. Los procedimientos almacenados no son parte del modelo relacional, pero todas las implementaciones comerciales los incluyen... Estructura La base de datos se organiza en dos marcadas secciones; el esquema y los datos (o instancia). El esquema es la definición de la estructura de la base de datos y principalmente almacena los siguientes datos: El nombre de cada tabla El nombre de cada campo El tipo de dato de cada campo La tabla a la que pertenece cada campo Las bases de datos relacionales pasan por un proceso al que se le conoce como normalización, el resultado de dicho proceso es un esquema que permite que la base de datos sea usada de manera óptima. Los datos o instancia es el contenido de la base de datos en un momento dado. Es en sí, el contenido de todos los registros. 1.14 Conceptos Prácticos de Base de Datos Relacional Llave candidata. Una llave candidata de una relación es un conjunto no vacío de atributos que identifican unívoca y mínimamente cada tupla. Por la propia definición de relación, siempre hay al menos una llave candidata, ya que al ser una relación un conjunto, no existen dos tuplas repetidas. Llave primaria. Es aquella llave candidata que el usuario escogerá, por consideraciones ajenas al modelo relacional, para identificar a las tuplas de la relación. Llaves alternativas. Son aquellas llaves candidatas que no han sido escogidos como llave primaria. Llave externa Elaborado por: Msc.Ing. Leonel Martínez 20 Manual básico de Base de Datos Primero definiremos el concepto de dominio primario. Se dice que un dominio es primario si sobre el se ha definido una llave primaria. Ahora definiremos el concepto de llave externa. Una llave externa es un atributo definido sobre un dominio primario y que no es llave primaria. Este concepto es útil para definir la asociación entre dos entidades. Reglas de integridad del modelo Integridad de dominio La integridad de dominio se introduce para controlar la sintaxis y la semántica de un dato cualquiera y concierne al tipo de definición del dominio Así por ejemplo, los valores de FechaNac pueden establecerse sobre el tipo de dato o dominio date con un formato "dd/mm/aa". Integridad de relación La integridad de relación, se refiere a los valores de los atributos que conforman la llave primaria. La integridad de relación garantiza que los valores de los atributos que conforman la llave primaria deben ser únicos y no se deben permitir los valores nulos. Por razones de diseño y de rendimiento, hasta donde sea posible, se recomienda que la llave primaria de cada relación esté constituida por un solo atributo. Integridad referencial La integridad referencial se refiere a la restricción que debe darse entre los valores de los atributos que conforman la llave primaria de una relación primaria y los valores que estos atributos pueden tomar como llave externa en una relación secundaria. RELACIONES Definición Una relación R se define como un subconjunto del producto cartesiano de n dominios D 1, ..., Dn, es decir R D1 D2 ... Dn Dada una serie de conjuntos D1, D2, ..., Dn (no necesariamente distintos), el producto cartesiano de estos n conjuntos, denotado por D1 D2 ... Dn, es el conjunto de todas las n tuplas posibles <d1, d2, ..., dn> tales que d1 pertenece a D1, d2 pertenece a D2, ..., dn pertenece a Dn. En la siguiente figura se muestra el producto cartesiano de dos conjuntos NumProd y Color. NumProd Color NumProd Color Rojo P001 Blanco P010 Verde Elaborado por: Msc.Ing. Leonel Martínez 21 P001 P001 P001 P010 P010 P010 Rojo Blanco Verde Rojo Blanco Verde Manual básico de Base de Datos Como una relación es un subconjunto del producto cartesiano D1 D2 ... Dn, la siguiente es una relación NumProd P001 P010 Color Blanco Verde Una relación se representa en forma de tabla. Los conjuntos D1, D2, ..., Dn son los dominios de R. Cada fila de la tabla representa una n tupla (o sencillamente una tupla) de la relación. El valor de n es el grado de R. El conjunto de tuplas de una relación se llama cardinalidad de la relación. Una relación (o tabla) siempre tiene un nombre La cabecera de la tabla es el esquema de la relación, el cual define la estructura de la tabla. En la siguiente figura se muestra una relación llamada PRODUCTO de grado 5 y de cardinalidad 6. Los cinco dominios son conjuntos de valores que representan, respectivamente, los números, nombres, marcas, colores y tallas de los productos. PRODUCTO NumProd P001 P002 P010 P015 P098 P123 NomProd Camisa Pantalon Pantalon Short Blusa Camisa Marca Giovanni Bongo Russo Longlife Princesa de Gales Piere Cardin Color Blanco Azul Verde Rojo Amarillo Verde Talla 14 28 32 30 16 12 El dominio “color”, por ejemplo, es el conjunto de todos los colores válidos; nótese que pueden haber colores válidos en este dominio que no aparecen en la relación en un instante dado. Se les dice unarias a las relaciones de grado uno. Las relaciones de grado dos son binarias, ..., y las relaciones de grado n son n-arias. No se define ningún orden entre las tuplas de una relación, porque una relación es un conjunto y los conjuntos no son ordenados. Sin embargo, hay situaciones donde es conveniente garantizar un orden particular. También, el orden de las columnas carece de importancia. PRODUCTO NumProd P123 P010 P015 P002 P098 P001 Marca Piere Cardin Russo Longlife Bongo Princesa de Gales Giovanni NomProd Camisa Pantalon Short Pantalon Blusa Camisa Elaborado por: Msc.Ing. Leonel Martínez 22 Talla 12 32 30 28 16 14 Color Verde Verde Rojo Azul Amarillo Blanco Manual básico de Base de Datos LLAVES Llave candidada Una llave candidata de una relación es un conjunto no vacío de atributos que identifican unívoca y mínimamente cada tupla. Por la propia definición de relación, siempre hay al menos una llave candidata, ya que al ser una relación un conjunto, no existen dos tuplas repetidas. En la relación PRODUCTO, el atributo NumProd identifica de forma única a cada una de las tuplas de la relación, por lo tanto puede ser considerada una llave candidata para identificar unívoca y mínimamente cada tupla de la relación. Consideremos la siguiente relación: ESTUDIANTE Cedula Carnet 4567892 95-12512-5 2489246 94-34205-3 5878263 95-64332-0 Nombre Elisa Díaz Manuel Arias Vilma Brenes FechaNac 16/09/72 05/12/75 30/01/74 Carrera Ingeniería en Computación Ingeniería Civil Ingeniería en Computación Podemos observar que tanto el atributo Cedula como el atributo Carnet identifican de forma única a cada una de las tuplas de la relación, por lo tanto ambas pueden ser consideradas llaves candidatas. El atributo Carrera no identifica de forma única a cada una de las tuplas de la relación, por lo tanto no puede ser considerada una llave candidata. Llave primaria Es aquella llave candidata que el usuario escogerá - por consideraciones ajenas al modelo relacional - para identificar a las tuplas de la relación. Puesto que una relación puede tener más de una llave candidata, solo una de ellas puede ser escogida como llave primaria. Supongamos que por razones de carácter preferencial o aleatorio decidimos escoger Carnet como llave primaria de la relación ESTUDIANTE. Definición Un atributo (o conjunto) K de una relación R es una llave para R si y solo si este satisface las dos propiedades siguientes, independientes del tiempo: Unicidad: En cualquier momento dado, no existen dos tuplos R que tengan el mismo valor para K. Minimalidad: Si K es compuesta (conjunto de atributos), entonces ningún componente de K puede ser eliminado sin destruir la propiedad de unicidad. En la relación ESTUDIANTE, decimos que Cedula es una llave porque no existen dos tuplos en la relación que tengan el mismo valor. Lo mismo para Carnet. Una llave primaria puede constar de una combinación de más de un atributo si es que ninguno de estos identifica de forma única a cada registro de la relación. Elaborado por: Msc.Ing. Leonel Martínez 23 Manual básico de Base de Datos Supongamos que el departamento de Cultura y Deportes de la Universidad lleva el registro de aquellas actividades culturales y deportivas a las cuales se inscribe un estudiante, así como la cuota mensual que paga el estudiante. Para ello, el departamento de Cultura y Deportes definió la siguiente relación: ACTIVIDAD Carnet 95-08745-3 96-12489-0 94-14565-1 95-08745-3 92-14465-4 Actividad Natación Atletismo Ballet Música Ballet Cuota 200 50 120 200 120 Como puede apreciarse, un mismo estudiante puede participar en más de una actividad, por lo tanto el atributo Carnet no identifica de forma única a cada una de las tuplas de la relación. Sin embargo, la combinación de Carnet y Actividad si identifican de forma única las tuplas de la relación ACTIVIDAD. Cuota no es parte de la llave de la relación ACTIVIDAD. NOTA: El concepto de llave es aplicable a relaciones base, no a vistas de una relación. Llaves alternativas Son aquellas llaves candidatas que no han sido escogidos como llave primaria. En el ejemplo de la relación ESTUDIANTE, la llave candidata Cedula se convierte automáticamente en llave alternativa al no ser escogida como llave primaria. En el esquema de la relación las llaves primarias se representan subrayando el o los atributos que la componen. ESTUDIANTE(Cedula, Carnet, Nombre, FechaNac, Carrera) ACTIVIDAD(Carnet, Actividad, Cuota) NOTA: Las llaves alternativas se pueden identificar colocando a la par del atributo la palabra clave (LLA). Ejercicio 1: Suponga que tenemos la siguiente relación: APARTAMENTO Edificio NumHab A B C A C NumApart 2 3 3 2 4 Alquiler 001 150 001 123 300 Defina: El esquema de la relación El grado de la relación Elaborado por: Msc.Ing. Leonel Martínez 24 150.00 100.00 70.00 150.00 70.00 Manual básico de Base de Datos La cardinalidad de la relación El dominio de los atributos de la relación Llaves candidatas Llave primaria Llaves alternativas Por qué el atributo NumHab no forma parte de las llaves ? Ejercicio 2: Suponga que tenemos la siguiente relación: CUENTA Cuenta Cliente 122564 Juan Carlos Ortiz 102568 Martha María Pérez 038978 Mercedes Castro 221465 Alberto Morales 444589 Zaida Rodriguez 213365 Roberto Aguilera 414597 Luis Alberto Padilla 586621 Mercedes Castro 657894 Zaida Rodriguez Saldo 150.00 100.00 70.00 1150.00 2370.00 150.00 670.00 510.00 210.00 Sucursal Los Robles Ciudad Jardín Los Robles Portezuelo Bello Horizonte León Bello Horizonte Los Robles Bello Horizonte Defina: El esquema de la relación El grado de la relación La cardinalidad de la relación Dominio del atributo Saldo Llaves candidatas Llave primaria Llaves alternativas Por qué Cliente no es llave? Llave externa En el modelo relacional, la relación entre dos tablas (o relaciones) se establece implícitamente por la presencia de un campo común en ambas tablas. Por ejemplo, las dos relaciones siguientes se enlazan al incluir la llave primaria de la relación SUCURSAL, Sucursal, en la relación CUENTA. SUCURSAL(Sucursal, Nombre, Dirección, Ciudad) CUENTA(Sucursal, NumCta, FechaAper, Saldo) El campo Sucursal en la relación CUENTA se llama en la terminología relacional llave externa. Implícitamente queda establecida una relación 1:M entre SUCURSAL y CUENTA mediante Sucursal, puesto que Sucursal es la llave principal en SUCURSAL, pero es la llave externa en CUENTA. En otras palabras, un modelo relacional de bases de datos se compone de tablas (o relaciones) y las relaciones entre ellas se establecen implícitamente mediante llaves externas. Elaborado por: Msc.Ing. Leonel Martínez 25 Manual básico de Base de Datos Definición Una llave externa es un atributo (posiblemente compuesto) de una relación R2 cuyos valores son necesarios para igualar los valores de la llave primaria de una relación R1. En este caso a R1 se le conoce como relación primaria y a R2 como relación secundaria. NOTA: La llave externa se puede identificar colocando a la par del atributo la palabra clave (LLE). CUENTA(Sucursal (LLE), NumCta, FechaAper, Saldo) Elaborado por: Msc.Ing. Leonel Martínez 26 Manual básico de Base de Datos La integridad referencial es una restricción de comportamiento ya que viene impuesta por el mundo real y es el usuario quien la define al describir el esquema relacional; es también de tipo implícita, ya que se define en el esquema y el modelo la reconoce sin necesidad de que se programe. II. DISEÑO DE BASE DE DATOS 2.1 Relaciones y Consultas SQL Relaciones En una BD compuesta es necesario RELACIONAR las tablas, existen diferentes formas de relacionar las tablas: 1º Un dato, o elemento de la tabla principal, solo se puede relacionar con un dato de la tabla secundaria. El nombre de este tipo de relación es (UNO a UNO) (1 a 1) 1:1 1 Empleados 1 1 Cargos 1 se pone el 1 para leerlo en ambas partes. 2º Un elemento de la tabla principal se puede relacionar con muchos elementos de la tabla secundaria. - 1 a muchos 1:N Socios 1 N Películas Alquiler 3º Un elemento de la tabla principal pueden relacionarse con muchos elementos de la tabla secundaria. Pero un elemento de la tabla secundaria también puede relacionarse con muchos elementos de la tabla principal. Muchos a Muchos Profesor N:N N N Asignaturas Impartir SQL Bases de datos-SQL-Sentencias SQL-Introducción Elaborado por: Msc.Ing. Leonel Martínez 27 Manual básico de Base de Datos El lenguaje de consulta estructurado (SQL) es un lenguaje de base de datos normalizado, utilizado por los diferentes motores de bases de datos para realizar determinadas operaciones sobre los datos o sobre la estructura de los mismos. Pero como sucede con cualquier sistema de normalización hay excepciones para casi todo, de hecho, cada motor de bases de datos tiene sus peculiaridades y lo hace diferente de otro motor, por lo tanto, el lenguaje SQL normalizado (ANSI) no nos servirá para resolver todos los problemas, aunque si se puede asegurar que cualquier sentencia escrita en ANSI será interpretable por cualquier motor de datos. Componentes del SQL El lenguaje SQL está compuesto por comandos, cláusulas, operadores y funciones de agregado. Estos elementos se combinan en las instrucciones para crear, actualizar y manipular las bases de datos. Comandos Existen dos tipos de comandos SQL: o DLL que permiten crear y definir nuevas bases de datos, campos e índices. o DML que permiten generar consultas para ordenar, filtrar y extraer datos de la base de datos. Comandos DLL Comando Descripción CREATE Utilizado para crear nuevas tablas, campos e índices DROP Empleado para eliminar tablas e índices ALTER Utilizado para modificar las tablas agregando campos o cambiando la definición de los campos. Comandos DML Comando Descripción SELECT Utilizado para consultar registros de la base de datos que satisfagan un criterio determinado INSERT Utilizado para cargar lotes de datos en la base de datos en una única operación. UPDATE Utilizado para modificar los valores de los campos y registros especificados DELETE Utilizado para eliminar registros de una tabla de una base de datos Elaborado por: Msc.Ing. Leonel Martínez 28 Manual básico de Base de Datos Cláusulas Las cláusulas son condiciones de modificación utilizadas para definir los datos que desea seleccionar o manipular. Cláusula Descripción FROM Utilizada para especificar la tabla de la cual se van a seleccionar los registros WHERE Utilizada para especificar las condiciones que deben reunir los registros que se van a seleccionar GROUP BY Utilizada para separar los registros seleccionados en grupos específicos HAVING Utilizada para expresar la condición que debe satisfacer cada grupo ORDER BY Utilizada para ordenar los registros seleccionados de acuerdo con un orden específico Operadores Lógicos Operador Uso AND Es el "y" lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas. OR Es el "o" lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos es cierta. NOT Negación lógica. Devuelve el valor contrario de la expresión. Operadores de Comparación Operador Uso < Menor que > Mayor que <> Distinto de <= Menor o igual que >= Mayor o igual que = Igual que BETWEEN Utilizado para especificar un intervalo de valores. LIKE Utilizado en la comparación de un modelo In Utilizado para especificar registros de una base de datos Elaborado por: Msc.Ing. Leonel Martínez 29 Manual básico de Base de Datos Funciones de Agregado Las funciones de agregado se usan dentro de una cláusula SELECT en grupos de registros para devolver un único valor que se aplica a un grupo de registros. Función Descripción AVG Utilizada para calcular el promedio de los valores de un campo determinado COUNT Utilizada para devolver el número de registros de la selección SUM Utilizada para devolver la suma de todos los valores de un campo determinado MAX Utilizada para devolver el valor más alto de un campo especificado MIN Utilizada para devolver el valor más bajo de un campo especificado Orden de ejecución de los comandos Dada una sentencia SQL de selección que incluye todas las posibles cláusulas, el orden de ejecución de las mismas es el siguiente: 1. Cláusula FROM 2. Cláusula WHERE 3. Cláusula GROUP BY 4. Cláusula HAVING 5. Cláusula SELECT 6. Cláusula ORDER BY Elaborado por: Msc.Ing. Leonel Martínez 30 Manual básico de Base de Datos CONSULTAS DE SELECCIÓN La sentencia SELECT nos permite consultar los datos almacenados en una tabla de la base de datos. El formato de la sentencia select es: SELECT [ALL | DISTINCT ][ TOP expression [ PERCENT ] [ WITH TIES ] ] <nombre_campos> FROM <nombre_tabla> [ INNER | LEFT [OUTER]| RIGHT [OUTER] | CROSS] [JOIN ] <nombre_tabla> ON <condicion_join>[ AND|OR <condicion>] [WHERE <condicion> [ AND|OR <condicion>]] [GROUP BY <nombre_campos>] [HAVING <condicion>[ AND|OR <condicion>]] [ORDER BY <nombre_campo> [ASC | DESC] El siguiente ejemplo muestra una consulta sencilla que obtiene el código y la "familia" de una tabla llamada familias (representaría familias de productos por ejemplo). SELECT CO_FAMILIA, FAMILIA FROM FAMILIAS El uso del asterisco indica que queremos que la consulta devuelva todos los campos que existen en la tabla. SELECT * FROM FAMILIAS Ahora vamos a realizar una consulta obteniendo además de los datos de familias, los datos de las categorías y los productos. SELECT FROM FAMILIAS * INNER JOIN CATEGORIAS ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA INNER JOIN PRODUCTOS ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA La combinación se realiza a través de la clausula INNER JOIN, que es una clasula exclusiva, es decir las familias que no tengan categorías y productos asociados no se devolverán. Si queremos realizar la consulta para que no sea exclusiva, tenemos que utilizar LEFT JOIN. El uso de la palabra reservada OUTER es opcional. Elaborado por: Msc.Ing. Leonel Martínez 31 Manual básico de Base de Datos SELECT * FROM FAMILIAS LEFT OUTER JOIN CATEGORIAS ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA LEFT OUTER JOIN PRODUCTOS ON PRODUCTOS.CO_CATEGORIA = CATEGORIAS.CO_CATEGORIA Los registros que no tengan datos relacionados en una consulta LEFT JOIN devolverán en valor null en los campos que correspondan a las tablas en las que no tienen dato. También podemos forzar un producto cartesiano (todos con todos) a través de CROSS JOIN. SELECT * FROM FAMILIAS CROSS JOIN CATEGORIAS La cláusula WHERE La cláusula WHERE es la instrucción que nos permite filtrar el resultado de una sentencia SELECT. SELECT CO_FAMILIA, FAMILIA FROM FAMILIAS WHERE CO_FAMILIA = 1 Por supuesto, podemos especificar varias condiciones para el WHERE: SELECT * FROM FAMILIAS WHERE CO_FAMILIA = 1 OR CO_FAMILIA = 2 Podemos agrupar varios valores para una condición en la clausula IN: SELECT * FROM FAMILIAS WHERE CO_FAMILIA IN ( 1 , 2) Elaborado por: Msc.Ing. Leonel Martínez 32 Manual básico de Base de Datos La clausula WHERE se puede utilizar conjuntamente con INNER JOIN, LEFT JOIN ... SELECT FAMILIAS.CO_FAMILIA, FAMILIAS.FAMILIA FROM FAMILIAS INNER JOIN CATEGORIAS ON CATEGORIAS.CO_FAMILIA = FAMILIAS.CO_FAMILIA WHERE FAMILIAS.CO_FAMILIA > 1 Siempre que incluyamos un valor alfanumerico para un campo en la condición WHERE este debe ir entre comillas simples: SELECT * FROM FAMILIAS WHERE FAMILIA = 'FAMILIA 1' Para consultar campos alfanuméricos, es decir, campos de texto podemos utilizar el operador LIKE conjuntamente con comodines. SELECT * FROM FAMILIAS WHERE FAMILIA LIKE 'FAM%' Los comodines que podemos utilizar en son los siguientes: % , representa cualquier cadena de texto de cero o más caracteres de cualquier longitud. _ , representa un carácter. [a-d], representa cualquier carácter del intervalo a-d. [abcd], representa cualquier carácter del grupo abcd. [^a-d], representa cualquier carácter diferente del intervalo a-d. [^abcd], representa cualquier carácter distinto del grupo abcd. También podemos obtener los valores distintos utilizando DISTINCT. SELECT DISTINCT FAMILIA -- Devuelve los distintos valores de FAMILIA FROM FAMILIAS Podemos limitar el número de registros que devuelve la consulta a través de la clausula TOP. La clausula TOP admite como parámetros un valor numérico entero o un porcentaje (sólo a partir de la versión 2005) Elaborado por: Msc.Ing. Leonel Martínez 33 Manual básico de Base de Datos SELECT TOP 10 * -- Devuelve 10 registros FROM FAMILIAS SELECT TOP 50 PERCENT * -- Devuelve el 50% de los registros FROM FAMILIAS La clausula TOP se puede combinar con WITH TIES en consultas agregadas. La cláusula ORDER BY Podemos especificar el orden en el que serán devueltos los datos a través de la cláusula ORDER BY. SELECT CO_FAMILIA, FAMILIA FROM FAMILIAS ORDER BY FAMILIA DESC También podemos indicar el índice del campo en la lista de selección en lugar de su nombre : SELECT CO_FAMILIA, FAMILIA FROM FAMILIAS ORDER BY 2 DESC -- Ordena por FAMILIA Consultas agregadas Elaborado por: Msc.Ing. Leonel Martínez 34 Manual básico de Base de Datos La cláusula GROUP BY La clausula GROUP BY combina los registros devueltos por una consulta SELECT obteniendo uno o varios valores agregados(suma, valor mínimo y máximo ...). Para cada registro se puede crear un valor agregado si se incluye una función SQL agregada, como por ejemplo Sum o Count, en la instrucción SELECT. Su sintaxis es: SELECT [ALL | DISTINCT ] <nombre_campo> [{,<funcion_agregado>}] [TOP <n> [WITH TIES]] [{,<nombre_campo>}] FROM <nombre_tabla>|<nombre_vista> [{,<nombre_tabla>|<nombre_vista>}] [WHERE <condición> [{ AND|OR <condición>}]] [GROUP BY <nombre_campo> [{,<nombre_campo >}]] [HAVING <condición>[{ AND|OR <condición>}]] [ORDER BY <nombre_campo>|<indice_campo> [ASC | DESC] [{,<nombre_campo>|<indice_campo> [ASC | DESC ]}]] Si se utiliza GROUP BY pero no existe una función SQL agregada en la instrucción SELECT se obtiene el mismo resultado que con una consulta SELECT DISTINCT. Los valores Null en los campos GROUP BY se agrupan y no se omiten. No obstante, los valores Null no se evalúan en ninguna de las funciones SQL agregadas. Todos los campos de la lista de campos de SELECT deben incluirse en la cláusula GROUP BY o como argumentos de una función SQL agregada. El siguiente ejemplo realiza una "cuenta" de los datos que hay en la tabla PRODUCTOS. SELECT COUNT(*) FROM PRODUCTOS Este otro ejemplo, muestra la suma del PRECIO de cada uno de los productos que componen un pedido, para calcular el total del pedido agrupados por los datos del cliente. SELECT CLIENTES.NOMBRE, CLIENTES.APELLIDO1, CLIENTES.APELLIDO2, SUM(PRECIO) -- Total del pedido FROM DETALLE_PEDIDO INNER JOIN PEDIDOS Elaborado por: Msc.Ing. Leonel Martínez 35 Manual básico de Base de Datos ON DETALLE_PEDIDO.CO_PEDIDO = PEDIDOS.CO_PEDIDO INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE GROUP BY CLIENTES.NOMBRE, CLIENTES.APELLIDO1, CLIENTES.APELLIDO2 Siempre que incluyamos una clausula WHERE en una consulta agregada esta se aplica antes de calcular el valor agregado. Es decir, si sumamos el valor de las ventas por producto, la suma se calcula después de haber aplicado el filtro impuesto por la clausula WHERE. SELECT CLIENTES.NOMBRE, CLIENTES.APELLIDO1, CLIENTES.APELLIDO2, SUM(PRECIO) -- Total del pedido FROM DETALLE_PEDIDO INNER JOIN PEDIDOS ON DETALLE_PEDIDO.CO_PEDIDO = PEDIDOS.CO_PEDIDO INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE -- La clausula WHERE se aplica antes de realizar el calculo WHERE CLIENTES.NOMBRE != 'UN NOMBRE' GROUP BY CLIENTES.NOMBRE, CLIENTES.APELLIDO1, CLIENTES.APELLIDO2 Elaborado por: Msc.Ing. Leonel Martínez 36 Manual básico de Base de Datos La cláusula HAVING Es posible que necesitemos calcular un agregado, pero que no necesitemos obtener todos los datos, solo los que cumplan una condición del agregado. Por ejemplo, podemos calcular el valor de las ventas por producto, pero que solo queramos ver los datos de los producto que hayan vendido más o menos de una determinada cantidad. En estos casos debemos utilizar la clausula HAVING. Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la cláusula GROUP BY que satisfaga las condiciones de la cláusula HAVING. Se utiliza la cláusula WHERE para excluir aquellas filas que no desea agrupar, y la cláusula HAVING para filtrar los registros una vez agrupados. HAVING es similar a WHERE, determina qué registros se seleccionan pero después de calcular el agregado. Una vez que los registros se han agrupado utilizando GROUP BY, HAVING determina cuáles de ellos se van a mostrar. HAVING permite el uso de funciones agregadas. SELECT CLIENTES.NOMBRE, CLIENTES.APELLIDO1, CLIENTES.APELLIDO2, SUM(PRECIO) -- Total del pedido FROM DETALLE_PEDIDO INNER JOIN PEDIDOS ON DETALLE_PEDIDO.CO_PEDIDO = PEDIDOS.CO_PEDIDO INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE -- La clausula WHERE se aplica antes de realizar el calculo WHERE CLIENTES.NOMBRE != 'UN NOMBRE' GROUP BY CLIENTES.NOMBRE, CLIENTES.APELLIDO1, CLIENTES.APELLIDO2 HAVING SUM(PRECIO) > 100 Elaborado por: Msc.Ing. Leonel Martínez 37 Manual básico de Base de Datos Funciones agregadas. Transact SQL pone a nuestra disposición múltiples funciones agregadas, las más comunes son: MAX MIN COUNT SUM AVG AVG Calcula la media aritmética de un conjunto de valores contenidos en un campo especificado de una consulta. Su sintaxis es la siguiente AVG(<expr>) En donde expr representa el campo que contiene los datos numéricos para los que se desea calcular la media o una expresión que realiza un cálculo utilizando los datos de dicho campo. La media calculada por Avg es la media aritmética (la suma de los valores dividido por el número de valores). La función Avg no incluye ningún campo Null en el cálculo. SELECT CLIENTES.NOMBRE, CLIENTES.APELLIDO1, CLIENTES.APELLIDO2, AVG(PRECIO) -- Promedio del pedido FROM DETALLE_PEDIDO INNER JOIN PEDIDOS ON DETALLE_PEDIDO.CO_PEDIDO = PEDIDOS.CO_PEDIDO INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE GROUP BY CLIENTES.NOMBRE, Elaborado por: Msc.Ing. Leonel Martínez 38 Manual básico de Base de Datos CLIENTES.APELLIDO1, CLIENTES.APELLIDO2 Coun Calcula el número de registros devueltos por una consulta. Su sintaxis es la siguiente: COUNT(<expr>) En donde expr contiene el nombre del campo que desea contar. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL). Puede contar cualquier tipo de datos incluso texto. Aunque expr puede realizar un cálculo sobre un campo, Count simplemente cuenta el número de registros sin tener en cuenta qué valores se almacenan en los registros. La función Count no cuenta los registros que tienen campos null a menos que expr sea el carácter comodín asterisco (*). Si utiliza un asterisco, Count calcula el número total de registros, incluyendo aquellos que contienen campos null. Count(*) es considerablemente más rápida que Count(Campo). SELECT COUNT(*) FROM PEDIDOS SELECT CLIENTES.NOMBRE, COUNT(*) FROM PEDIDOS INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE GROUP BY CLIENTES.NOMBRE Max, Min Devuelven el mínimo o el máximo de un conjunto de valores contenidos en un campo especifico de una consulta. Su sintaxis es: MIN(<expr>) MAX(<expr>) Elaborado por: Msc.Ing. Leonel Martínez 39 Manual básico de Base de Datos En donde expr es el campo sobre el que se desea realizar el cálculo. Expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL). SELECT CLIENTES.NOMBRE, MIN(PEDIDOS.FX_ALTA), MAX(PEDIDOS.FX_ALTA) FROM PEDIDOS INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE GROUP BY CLIENTES.NOMBRE Sum Devuelve la suma del conjunto de valores contenido en un campo especifico de una consulta. Su sintaxis es: SUM(<expr>) En donde expr representa el nombre del campo que contiene los datos que desean sumarse o una expresión que realiza un cálculo utilizando los datos de dichos campos. Los operandos de expr pueden incluir el nombre de un campo de una tabla, una constante o una función (la cual puede ser intrínseca o definida por el usuario pero no otras de las funciones agregadas de SQL). SELECT CLIENTES.NOMBRE, SUM(PEDIDOS.TOTAL_PEDIDO) FROM PEDIDOS INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE GROUP BY CLIENTES.NOMBRE Uso de Select TOP con consultas agregadas. Podemos utilizar SELECT TOP con consultas agregadas como con cualquier otra instrucción Transact SQL. Elaborado por: Msc.Ing. Leonel Martínez 40 Manual básico de Base de Datos En estos casos, la clausula TOP se aplica después de calcular el agregado, devolviendo las N filas indicadas. En este escenario es posible que queramos obtener los N valores que satisfagan una condición. Por ejemplo, queremos si queremos obtener los tres primeros clientes con mayores pedidos, usaríamos una consulta parecida a esta: SELECT CLIENTES.NOMBRE, SUM(DETALLE_PEDIDO.PRECIO) TOP 3 FROM DETALLE_PEDIDO INNER JOIN PEDIDOS ON DETALLE_PEDIDO.CO_PEDIDO = PEDIDOS.CO_PEDIDO INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE GROUP BY CLIENTES.NOMBRE ORDER BY 2 -- SUM(DETALLE_PEDIDO.PRECIO_UNIDAD) Sin embargo, puede darse el caso, de que el cuarto cliente devuelto por la consulta tenga un valor agregado idéntico al tercero, (es decir, están empatados). El uso de TOP 3 discriminaría el cuarto registro. Para evitar este comportamiento, y que la consulta devuelva también al cuarto cliente utilizamos la clausula WITH TIES. SELECT TOP CLIENTES.NOMBRE, SUM(DETALLE_PEDIDO.PRECIO) 3 FROM DETALLE_PEDIDO INNER JOIN PEDIDOS ON DETALLE_PEDIDO.CO_PEDIDO = PEDIDOS.CO_PEDIDO INNER JOIN CLIENTES ON PEDIDOS.CO_CLIENTE = CLIENTES.CO_CLIENTE GROUP BY CLIENTES.NOMBRE ORDER BY 2 -- SUM(DETALLE_PEDIDO.PRECIO_UNIDAD) Elaborado por: Msc.Ing. Leonel Martínez 41 WITH TIES Manual básico de Base de Datos ACTUALIZAR DATOS EN TRANSACT SQL Update Para la actualización de datos Transact SQL dispone de la sentencia UPDATE. La sentencia UPDATE permite la actualización de uno o varios registros de una única tabla. La sin taxis de la sentencia UPDATE es la siguiente UPDATE <nombre_tabla> SET <campo1> = <valor1> {[,<campo2> = <valor2>,...,<campoN> = <valorN>]} [ WHERE <condicion>]; El siguiente ejemplo muestra el uso de UPDATE. UPDATE CLIENTES SET NOMBRE = 'Devjoker', APELLIDO1 = 'Herrarte', APELLIDO2 = 'Sánchez' WHERE CO_CLIENTE = 10 Un aspecto a tener en cuenta, sobre todo si has trabajado con ORACLE, es que SQL graba los cambios inmediatamente sin necesidad de hacer COMMIT. Por supuesto podemos gestionar nosotros las transacciones pero es algo que hay que hacer de forma explícita con la instrucción BEGIN TRAN y que se verá en capítulos posteriores de este tutorial. Update INNER JOIN En ocasiones queremos actualizar los datos de una tabla con los datos de otra (muy común para des normalizar un modelo de datos). Habitualmente, usamos subconsultas para este propósito, pero Transact SQL permite la utilización de la sentencia UPDATE INNER JOIN. UPDATE CLIENTES SET NOMBRE = FICHERO_CLIENTES.NOMBRE, APELLIDO1 = FICHERO_CLIENTES.APELLIDO1, APELLIDO2 = FICHERO_CLIENTES.APELLIDO2 FROM CLIENTES Elaborado por: Msc.Ing. Leonel Martínez 42 Manual básico de Base de Datos INNER JOIN FICHERO_CLIENTES ON FICHERO_CLIENTES.CO_CLIENTE = CLIENTES.CO_CLIENTE BORRAR DATOS EN TRANSACT SQL Delete Para borrar datos de una tabla debemos utilizar la sentencia DELETE. Para ejecutar los ejemplos de este capítulo debemos ejecutar el siguiente script, que crea la tabla "DATOS" y carga registros en ella. CREATE TABLE DATOS ( Id int identity not null, dato varchar(100), fx_alta datetime, constraint PK_DATOS PRIMARY KEY (Id) ) GO DECLARE @i int, @dato varchar(100) set @i = 0 WHILE (@i <100) BEGIN SET @i = @i +1 set @dato = 'Dato:' + cast(@i as varchar) INSERT INTO DATOS (dato, fx_alta) VALUES (@dato, getdate()) END GO SELECT * from DATOS Elaborado por: Msc.Ing. Leonel Martínez 43 Manual básico de Base de Datos Para borrar los registros de la tabla "DATOS" ejecutaremos la siguiente instrucción. Nótese que no se especifica ninguna condición WHERE por lo que se borran todos los datos de la tabla. DELETE FROM DATOS Lógicamente podemos especificar que registros queremos borrar a través de la clausula WHERE. DELETE FROM DATOS WHERE Id=12 Cuando borramos datos de una tabla, podemos obtener el número de filas que han sido afectadas por la instrucción a través de la variable @@RowCount. El siguiente ejemplo ilustra el uso de @@RowCount. DELETE FROM DATOS WHERE Id=17 SELECT @@ROWCOUNT Procedimientos almacenados en Transact SQL Un procedimiento es un programa dentro de la base de datos que ejecuta una acción o conjunto de acciones específicas. Un procedimiento tiene un nombre, un conjunto de parámetros (opcional) y un bloque de código. En Transact SQL los procedimientos almacenados pueden devolver valores (numérico entero) o conjuntos de resultados. Para crear un procedimiento PROCEDURE. almacenado debemos emplear la sentencia CREATE CREATE PROCEDURE <nombre_procedure> [@param1 <tipo>, ...] AS -- Sentencias del procedure Para modificar un procedimiento almacenado debemos emplear la sentencia ALTER PROCEDURE. Elaborado por: Msc.Ing. Leonel Martínez 44 Manual básico de Base de Datos ALTER PROCEDURE <nombre_procedure> [@param1 <tipo>, ...] AS -- Sentencias del procedure El siguiente ejemplo muestra un procedimiento almacenado, denominado spu_addCliente que inserta un registro en la tabla "CLIENTES". CREATE PROCEDURE spu_addCliente @nombre varchar(100), @apellido1 varchar(100), @apellido2 varchar(100), @nifCif varchar(20), @fxNaciento datetime AS INSERT INTO CLIENTES (nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES (@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento) Para la ejecutar un procedimiento almacenado debemos utilizar la sentencia EXEC. Cuando la ejecución del procedimiento almacenado es la primera instrucción del lote, podemos omitir el uso de EXEC. El siguiente ejemplo muestra la ejecución del procedimiento almacenado anterior. DECLARE @fecha_nacimiento datetime set @fecha_nacimiento = convert(datetime, '13/05/1975', 103) EXEC spu_addCliente 'Pedro', '00000002323', @fecha_nacimiento 'Herrarte', 'Sanchez', Siempre es deseable que las instrucciones del procedure estén dentro de un bloque TRY CATCH y controlados por una transacción. ALTER PROCEDURE spu_addCliente @nombre varchar(100), @apellido1 varchar(100), @apellido2 varchar(100), Elaborado por: Msc.Ing. Leonel Martínez 45 Manual básico de Base de Datos @nifCif varchar(20), @fxNaciento datetime AS BEGIN TRY BEGIN TRAN INSERT INTO CLIENTES (nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES (@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento) COMMIT END TRY BEGIN CATCH ROLLBACK PRINT ERROR_MESSAGE() END CATCH TRIGGERS EN TRANSACT SQL Un trigger( o desencadenador) es una clase especial de procedimiento almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos. SQL Server proporciona los siguientes tipos de triggers: Trigger DML, se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista. Trigger DDL, se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL. Trigger DML. Los trigger DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista. La sintaxis general de un trigger es la siguiente. Elaborado por: Msc.Ing. Leonel Martínez 46 Manual básico de Base de Datos CREATE TRIGGER <Trigger_Name, sysname, Trigger_Name> ON <Table_Name, sysname, Table_Name> AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE> AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here END Antes de ver un ejemplo es necesario conocer las tablas inserted y deleted. Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted y deleted. SQL Server 2005 crea y administra automáticamente ambas tablas. La estructura de las tablas inserted y deleted es la misma que tiene la tabla que ha desencadenado la ejecución del trigger. La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en ella están los valores resultantes después de la inserción o actualización. Es decir, los datos insertados. Inserted estará vacía en una operación DELETE. En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores anteriores a la ejecución de la actualización o borrado. Es decir, los datos que serán borrados. Deleted estará vacía en una operación INSERT. ¿No existe una tabla UPDATED? No, hacer una actualización es lo mismo que borrar (deleted) e insertar los nuevos (inserted). La sentencia UPDATE es la única en la que inserted y deleted tienen datos simultáneamente. No se puede modificar directamente los datos de estas tablas. El siguiente ejemplo, graba un histórico de saldos cada vez que se modifica un saldo de la tabla cuentas. CREATE TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN Elaborado por: Msc.Ing. Leonel Martínez 47 Manual básico de Base de Datos -- SET NOCOUNT ON impide que se generen mensajes de texto -- con cada instrucción SET NOCOUNT ON; INSERT INTO HCO_SALDOS (IDCUENTA, SALDO, FXSALDO) SELECT IDCUENTA, SALDO, getdate() FROM INSERTED END La siguiente instrucción provocará que el trigger se ejecute: UPDATE CUENTAS SET SALDO = SALDO + 10 WHERE IDCUENTA = 1 Una consideración a tener en cuenta es que el trigger se ejecutará aunque la instrucción DML (UPDATE, INSERT o DELETE ) no haya afectado a ninguna fila. En este caso inserted y deleted devolverán un conjunto de datos vacio. Podemos especificar a qué columnas de la tabla debe afectar el trigger. ALTER TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN -- SET NOCOUNT ON impide que se generen mensajes de texto -- con cada instrucción SET NOCOUNT ON; IF UPDATE(SALDO) -- Solo si se actualiza SALDO BEGIN INSERT INTO HCO_SALDOS Elaborado por: Msc.Ing. Leonel Martínez 48 Manual básico de Base de Datos (IDCUENTA, SALDO, FXSALDO) SELECT IDCUENTA, SALDO, getdate() FROM INSERTED END END Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de nuestro trigger hacemos un RollBack Tran, no solo estaremos echando atrás nuestro trigger sino también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la transacción de Insert, Delete o Update volverá toda hacia atrás. ALTER TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN -- SET NOCOUNT ON impide que se generen mensajes de texto -- con cada instrucción SET NOCOUNT ON; INSERT INTO HCO_SALDOS (IDCUENTA, SALDO, FXSALDO) SELECT IDCUENTA, SALDO, getdate() FROM INSERTED ROLLBACK END En este caso obtendremos el siguiente mensaje de error: La transacción terminó en el desencadenador. Se anuló el lote. Podemos activar y desactivar Triggers a través de las siguientes instrucciones. -- Desactiva el trigger TR_CUENTAS Elaborado por: Msc.Ing. Leonel Martínez 49 Manual básico de Base de Datos DISABLE TRIGGER TR_CUENTAS ON CUENTAS GO -- activa el trigger TR_CUENTAS ENABLE TRIGGER TR_CUENTAS ON CUENTAS GO -- Desactiva todos los trigger de la tabla CUENTAS ALTER TABLE CUENTAS DISABLE TRIGGER ALL GO -- Activa todos los trigger de la tabla CUENTAS ALTER TABLE CUENTAS ENABLE TRIGGER ALL Trigger DDL Los trigger DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL. La sintaxis general de un trigger es la siguiente. CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety> ON DATABASE FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE> AS BEGIN ... END La siguiente instrucción impide que se ejecuten sentencias DROP TABLE y ALTER TABLE en la base de datos. CREATE TRIGGER TR_SEGURIDAD ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS BEGIN Elaborado por: Msc.Ing. Leonel Martínez 50 Manual básico de Base de Datos RAISERROR ('No está permitido borrar ni modificar tablas !' , 16, 1) ROLLBACK TRANSACTION END Elaborado por: Msc.Ing. Leonel Martínez 51 U de M. Modulo de Base de Datos 2.2 Diseño y Creación de la Base de Datos Diccionario de Datos El Diccionario de Datos es un formato donde se especifican las características de cada uno de los componentes de la Base de Datos. En el ejemplo siguiente se presenta la información de las tablas básicas de una Base de Datos de un Sistema de Facturación Venta e Inventario CLIENTECREDITO CAMPOS TITULO CodClienteCred Nombres Fecha Rama Dirección Teléfono Celular Fax ApdoPostal CorreoElectronico PaginaWeb Fecha Código cliente Nombre/Razón Social FechaNac/Fecha creación Area/Rama Dirección Teléfono Celular Fax ApdoPostal CorreoElectronico Pagina Web FechaIngreso TIPO Numero Texto Fecha/Hora Texto Texto Texto Texto Texto Texto HiperVin Hipervin Fecha/Hora CLIENTECONTADO CAMPOS TITULO TIPO TAM Dirección Teléfono Texto Texto 100 11 CodCliente Nombres Identificaci ón Dirección Teléfono CodigoCliente Nombres Identificación Numero Texto Texto 10 30 40 TAM 10 30 40 100 11 11 11 50 FORM MASC Fecha Corta 00/00/00 “C”-0999999 REQUE SI SI SI VAL DESCRIPCION LLP (IDENTIDAD) < Hoy SI SI FechaActual() FORM MASC REQUER. VAL SI SI SI SI SI DESCRIPCION LLP. INCREMENTA AUTOM. IDENTIDAD Manual básico de Base de Datos Email Fecha CorreoElec FechaIngreso PROVEEDOR CAMPOS CodProveedor RazonSocial Dirección Teléfono Fax ApdoPostal Email PaginaWeb Hipervin Fecha/Hora TITULO CodProveedor Nombre/RazonSocial Dirección Teléfono Fax ApdoPostal Email PaginaWeb PROVEEDOR – PRODUCTOS CAMPOS TITULO IdProvServ CodProveedor IdProvServ CodProveedor Descripción Observaciones Descripción Observaciones CodProducto CodProducto PRODUCTOS CAMPOS TITULO CodProducto CodProducto Descripción Descripción UnidadMedida Unidad de Medida Características Características Presentacion Presentación Fotografía Fotografía Categoría Categoría VENTASCONTADO CAMPOS TITULO Elaborado por: Msc.Ing. Leonel Martínez FechaActual() TIPO TAM FORM MASC REQ VAL DESCRIPCION TIPO TAM FORM MASC REQ VAL DESCRIPCION Texto Texto Texto Texto Texto Texto HiperVin HiperVin Autonum Texto Numero Texto Texto 5 50 100 5 5 “PV”-0999 “PV”-0999 SI SI MASC REQ. “P”-0999 50 50 SI TIPO TAM Texto Texto Texto Texto 25 25 40 40 SI SI Objeto OLE Texto 25 SI TIPO TAM Numero 5 FORM SI SI SI SI FORM 53 “P”-0999 MASC SI REQ LLP. Se increpen. Auto LLP LLE. LLE VAL DESCRIPCION VAL DESCRIPCION Se incre. Autom. LLP Manual básico de Base de Datos CodFactura CodCliente NumEmpleado FechaVenta FormaPago NoFactura Cliente Subtotal Descuento IGV Total Subtotal Descuento IGV Total Numero Empleado FechaVenta FormaPago DETALLEVENTASCONTADO CAMPOS TITULO IdDetalle IdDetalle Numero Texto Numero Fecha/Hora 10 10 Texto 20 “T”-0999 Moneda Moneda Moneda Moneda SI SI Moneda Moneda Moneda Moneda SI SI TIPO TAM Numero Numero 10 5 Texto Numero Moneda Moneda 25 VENTASCREDITO CAMPOS TITULO CodFacturaCred NoFacturaCred TIPO TAM NumEmpleado FechaVenta Duración Codigo Cliente Numero Empleado Texto Numero 10 FechaVenta DuracionCredito Fecha/Hora CodFactura CodProducto Descripción Cantidad Precio Monto CodClienteCred NoFactura CodProducto Descripción Cantidad Precio MontoProducto Elaborado por: Msc.Ing. Leonel Martínez SI SI SI SI Autonum. Numero Numero 10 FORM LLP. SE INSERTARA LLE. CLIENTESCONT LLE. EMPLEADO SE LLENARA DE TABLA AUXILIAR. TIPOPAGO MASC REQ “P”-0999 SI SI SI SI SI SI SI FORM 54 DESCRIPCION Se incrementa Automáticamente. LLP. SE INSERTARA LLE Productos. >0 >0 MASC REQ “C”-0999999 “T”-0999 SI SI SI SI Entero VAL SI VAL DESCRIPCION LLP. SE INSERTARA LLE. CLIENTECREDITO LLE. EMPLEADO Manual básico de Base de Datos Crédito Subtotal Subtotal Descuento Descuento IGV IGV TotalCredito Total DETALLEVENTASCREDITO CAMPOS TITULO IdDetalleCred IdDetalleCred CodFacturaCred CodProducto Descripción Cantidad Precio Monto NoFacturaCred CodProducto Descripción Cantidad Precio MontoProducto Elaborado por: Msc.Ing. Leonel Martínez Moneda Moneda Moneda Moneda Moneda Moneda SI Moneda Moneda SI TIPO TAM Numero Numero Texto 10 5 25 Autonum. FORM Numero Moneda Moneda SI MASC REQ “P”-0999 SI SI SI SI SI SI SI 55 VAL >0 >0 DESCRIPCION Se incrementa Automáticamente. LLE VENTASCREDITO LLE Productos. U de M. Modulo de Base de Datos 2.3 Creación de la Base de Datos a través de código SQL(Scripts) Use master go IF EXISTS (SELECT * FROM master..sysdatabases WHERE name = N'BDUML') DROP DATABASE SIGA GO CREATE DATABASE BDUML GO USE BDUML GO 2.3.1 Creación las tablas a través de código SQL(Scripts) CREATE TABLE CatCircunscripcion( IdCircunscripcion char(2)primary key, strNombreCircunscripcion varchar(80)) GO CREATE TABLE CatDepartamento( IdDepartamento char(2) primary key, strNombreDepartamento nvarchar(80) not null ) GO CREATE TABLE CatUnidad_Administrativa( IdUnidadAdmin nvarchar (16) primary key, [id] char (4) NULL , strNombreUnidadAdmin nvarchar (150) NULL , bolActivo bit default(1), strIP nvarchar (30) NULL , strComputadora nvarchar (50) NULL , strMac nvarchar (30) NULL , strLogin nvarchar (20) NULL , dtFecha datetime default getdate() ) GO Create Table catTipo_Requisa( IdTipoRequisa int identity(1,1)primary key, strNombreTipoReq nvarchar(50) not null, strObservaciones nvarchar(50), bolVigente bit ) go Manual básico de Base de Datos CREATE TABLE catTipo_SolCompra( --Tipo de Solicitudes de Compra IDTipoSolCompra tinyint identity(1,1)primary key, strTipoSolCompra nvarchar(60) not null, strObservaciones nvarchar(250) ) go Create Table catEstados( IdEstado tinyint identity(1,1)primary key, strNombreEstado nvarchar(50) not null, bolAplicaEnRequisa bit not null, bolAplicaEnSolCompra bit not null, bolAplicaEnSolUsuario bit not null, strDescripcion nvarchar(250) ) go Create Table catTipo_Compra( IDTipoCompra tinyint identity(1,1)primary key, strTipoDeCompra nvarchar(30), intLimiteInferior money, intLimiteSuperior money ) GO CREATE TABLE CatForma_Pago ( IdFormaPago char(2)primary key, strNombreFormaPago nvarchar(80) not null, strDescripcion nvarchar(250) ) go CREATE TABLE CatCargo( IdCargo char(4) primary key, strNombreCargo nvarchar(100) not null, strDescripcionDeCargo nvarchar(250) ) GO CREATE TABLE tblTipo_Grupo_Usuarios ( IdTipoGrupo char(2) primary key, strNombre_Tipo nvarchar(40), strDescripcionTipoGrupo nvarchar(250) ) go 57 Manual básico de Base de Datos --ALTER TABLE nvarchar(50) tblTipo_Grupo_Usuarios CREATE TABLE tblGrupo_Usuarios_Sistema ( IdGrupoSistema char(2) primary key, IdTipoGrupo char(2), strNombreGrupo nvarchar(40), strDescripcionGrupo nvarchar(50), constraint fk_pertenece_a foreign tblTipo_Grupo_Usuarios(IdTipoGrupo) ) go ADD strDescripcionTipoGrupo key(IdTipoGrupo) references CREATE TABLE tblPermiso ( IdPermiso char(2) primary key, strNombreEspecifico nvarchar(100), strDescripcionPermiso nvarchar(250) ) go CREATE Table tblPermiso_Grupo ( IdPermiso char(2), IdGrupoSistema char(2), constraint pk_asignacion_tblPermiso primary key(IdPermiso,IdGrupoSistema), constraint fk_tiene_permitido foreign key(IdPermiso)references tblPermiso(IdPermiso), constraint fk_el_grupo foreign key(IdGrupoSistema) references tblGrupo_Usuarios_Sistema(IdGrupoSistema) ) GO CREATE TABLE tblEmpleado( IdEmpleado nvarchar(18)primary key, IdUnidadAdmin nvarchar(16) references CatUnidad_Administrativa(IdUnidadAdmin) NOT NULL, strCedula nvarchar(16), strPNombre nvarchar(20) NOT NULL, strSNombre nvarchar(20), strPApellido nvarchar(20)NOT NULL, strSApellido nvarchar(20), imgFotografia image, strTelefono nvarchar(8), dtFechaNaciento smalldatetime, strTituloCortesia nvarchar(30), strDireccion nvarchar(150), bolEsTemporal bit NOT NULL, dtFechaContratacion smalldatetime, dtFechaSalida smalldatetime, strExtensionTel varchar(3), strObservaciones nvarchar(250), 58 Manual básico de Base de Datos chrSexo char(1), IdCargo char(4) NOT NULL references CatCargo(IdCargo), strSuperiorInmediato nvarchar(18), strAgregado_por nvarchar(18), dtFechaAgregacion datetime NOT NULL, strUsuarioUltModificacion nvarchar(18), dtFechaUltimaModificacion datetime) GO --Algunos usuarios podran tener acceso a los modulos con los que se fusionara el sistema CREATE TABLE tblUsuario_Sistema ( IdUsuario nvarchar(18)primary key, IdEmpleado nvarchar(18) references tblEmpleado(IdEmpleado), IdGrupoSistema char(2) NOT NULL, strAlias nvarchar(20)NOT NULL, strPasswordOpEsp nvarchar(32)NULL, strDescripcion_Usuario nvarchar(250), strAgregado_por nvarchar(18), dtFechaAgregacion datetime NOT NULL default getdate(), strUsuarioUltModificacion nvarchar(18), dtFechaUltimaModificacion datetime, bolUsuarioPresupuesto bit not null default 0, bolUsuarioUCA bit not null default 0, bolUsuarioContabilidad bit not null default 0, bolUsuarioActivoFijo bit not null default 0, bolConectado bit not null default 0, bolActivo bit not null default 1, constraint fk_GrupoSistema foreign key(IdGrupoSistema) tblGrupo_Usuarios_Sistema(IdGrupoSistema) ) GO references /**********EL RESTO DE TABLAS A CREAR SERIA EL SIGUIENTE ********/ CREATE TABLE catSegmento( IdSegmento char (2) Not Null, strNombreSegmento nvarchar(250) NOT NULL, strDescripcion nvarchar(250), CONSTRAINT PK_Segmento PRIMARY KEY(IdSegmento) ) GO CREATE UNIQUE INDEX idSegmento ON catSegmento(idSegmento) GO CREATE TABLE catFamilia( IdSegmento char(2) Not Null, IdFamilia char(2) Not Null, strNombreFamilia nvarchar (100) Not Null, strDescripcion nvarchar(250), CONSTRAINT PK_catFamilia PRIMARY KEY (IdSegmento,IdFamilia), CONSTRAINT FK_catFamilia_catSegmento_IdSegmento FOREIGN KEY (IdSegmento) REFERENCES catSegmento(IdSegmento) ON DELETE CASCADE ON UPDATE CASCADE 59 Manual básico de Base de Datos ) GO CREATE GO CREATE GO CREATE GO INDEX [{indexcatfamilia}] ON catFamilia(IdSegmento) INDEX IdFamilia ON catFamilia(IdFamilia) INDEX IdSegmento ON catFamilia(IdSegmento) CREATE TABLE catClase( IdSegmento char(2) Not Null, IdFamilia char(2) Not Null, IdClase char(2) Not Null, strNombreClase nvarchar(80), strDescripcion nvarchar(250), CONSTRAINT PK_catClase PRIMARY KEY NONCLUSTERED (idSegmento,idFamilia,idClase), CONSTRAINT FK_catClase_catFamilia_idSegmento_idFamilia FOREIGN KEY(idSegmento,idFamilia) REFERENCES catFamilia(idSegmento,idFamilia) ) GO CREATE INDEX [{IndexClase}] ON catClase(IdSegmento,IdFamilia) GO CREATE INDEX IdClase ON catClase(IdClase) GO CREATE INDEX IdFamilia ON catClase(IdFamilia) GO CREATE INDEX IdSegemento ON catClase(IdSegmento) GO --***** INICIO DEL BIEN CREATE TABLE catBien( IdSegmento char (2) NOT NULL , IdFamilia char (2) NOT NULL , IdClase char (2) NOT NULL , IdBien char (2) NOT NULL , strBien nvarchar (100) NOT NULL , Idgasto char (3), IdCuentaMayor char(4) , IdSubCuenta nvarchar(12), CONSTRAINT PK_catBien PRIMARY KEY(IdSegmento,IdFamilia,IdClase,IdBien), CONSTRAINT FK_catBien_catClase_IdSegmento_IdFamilia_IdClase FOREIGN KEY (IdSegmento,IdFamilia,IdClase) REFERENCES catClase(IdSegmento,IdFamilia,IdClase) ) GO CREATE INDEX [{IndexBien}] ON catBien(IdSegmento,IdFamilia,IdClase) GO CREATE INDEX IdBien ON catBien(IdBien) GO CREATE INDEX IdClase ON catBien(IdClase) GO CREATE INDEX IdFamilia ON catBien(IdFamilia) GO CREATE INDEX IdSegmento ON catBien(IdSegmento) GO --****INICIO DEL CATALOGO 60 Manual básico de Base de Datos CREATE TABLE catCatalogo( IdSegmento char (2) NOT NULL , IdFamilia char (2) NOT NULL , IdClase char (2) NOT NULL , IdBien char (2) NOT NULL , Idconsecutivo char (3), Idbos nvarchar(12) primary key, --Codigo del bien o servicio strNombre nvarchar(100) not null, strDescripcion nvarchar(250), strUnidadMedida nvarchar(25), strFabricante nvarchar(50), dtfechaInventario datetime DEFAULT GETDATE(), strPresentacion nvarchar(50), strCaracteristicas nvarchar(250), imgImagen image, bolEsServicio bit, bolEsActivoFijo bit default 0, bolDescontinuado bit default 0, strCodigoBarras nvarchar(50), CONSTRAINT FK_catCatalogo_catBien_IdSegmento_IdFamilia_IdClase_IdBien FOREIGN KEY (IdSegmento,IdFamilia,IdClase,IdBien) REFERENCES catBien(IdSegmento,IdFamilia,IdClase,IdBien), CONSTRAINT CK_Idconsecutivo CHECK (Idconsecutivo LIKE'[0-9][0-9][19]'), CONSTRAINT CK_Idbos CHECK (Idbos LIKE'[0-9][0-9][0-9][0-9][09][0-9][0-9][0-9][0-9][0-9][0-9]' OR Idbos LIKE'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][09][0-9][1-9]') ) GO CREATE INDEX [{IndexCatalogo}] ON catCatalogo(IdSegmento,IdFamilia,IdClase,IdBien) GO CREATE INDEX IdBos ON catCatalogo(IdBos) GO CREATE INDEX IdBien ON catCatalogo(IdBien) GO CREATE INDEX IdClase ON catCatalogo(IdClase) GO CREATE INDEX IdFamilia ON catCatalogo(IdFamilia) GO CREATE INDEX IdSegmento ON catCatalogo(IdSegmento) GO CREATE TABLE tblRequisa_Materiales( IdRequisa nvarchar(7) primary key, IdUnidadAdmin nvarchar(16) not null, IdSolicitante nvarchar(18) references tblUsuario_Sistema(IdUsuario), strSolicitanteDesignado nvarchar(18) references tblEmpleado(IdEmpleado), intTipo_Requisa int not null, intEstado_Requisa tinyint not null, strObservaciones nvarchar (250), strNo_Expediente nvarchar(16) NULL , strPers_q_tiene_asig_Vehiculo nvarchar (18) references tblEmpleado(IdEmpleado), dtFech_Hora_Solicitud datetime DEFAULT(GETDATE()), dtFech_Hora_Aprobacion datetime, constraint fk_tblRequisa_Materiales_CatEstados_intEstado_Requisa foreign key(intEstado_Requisa) references catEstados(IdEstado), 61 Manual básico de Base de Datos constraint fk_Tipo foreign key(intTipo_Requisa) references CatTipo_Requisa(IdTipoRequisa), constraint fk_EstadoReq foreign key(intEstado_Requisa) references catEstados(IdEstado), constraint fk_IdUnidadAdmin foreign key(IdUnidadAdmin) references CatUnidad_Administrativa(IdUnidadAdmin) ) GO CREATE TABLE tblDetalle_Requisa( IdRequisa nvarchar(7), Idbos nvarchar(12), intCantidad int not null, intExistencia_Segun_Inv int null, intCantidad_Aprobada int, intCantidad_a_Comprar int, monPrecio_Estimado money null, bolRecibido bit not null default 0, constraint pk_DetalleReq primary key(IdRequisa,Idbos), constraint fk_Requisa foreign key(IdRequisa)references tblRequisa_Materiales(IdRequisa), constraint fk_detalle foreign key(Idbos) references CatCatalogo(Idbos) ) GO 2.3.2 Creación de Reglas por medio de código SQL SET NOCOUNT ON GO USE BDUML GO CREATE RULE RL_Cedula as @Cedula IS NULL OR @Cedula like '[0-9][0-9][0-9][-][0-9][0-9][0-9][09][0-9][0-9][-][0-9][0-9][0-9][0-9][A-Z]' go sp_bindrule 'RL_Cedula','tblEmpleado.strCedula' go sp_bindrule 'RL_Cedula','tblDetalle_SolNuevoUsuario.strCedula' GO CREATE RULE RL_Sexo as @Sexo like '[FM]' go sp_bindrule 'RL_Sexo','tblEmpleado.chrSexo' go 2.2.3 Creación de Funciones por medio de código SQL USE BDUML GO -====================================================================== ======================= -- Obtener el tipo de compra dado un monto 62 Manual básico de Base de Datos -====================================================================== ======================= IF EXISTS (SELECT * FROM sysobjects WHERE name = N'ftn_GetTipoDeCompra') DROP FUNCTION ftn_GetTipoDeCompra GO CREATE FUNCTION ftn_GetTipoDeCompra(@TOTAL money) RETURNS int AS BEGIN DECLARE @Tipo tinyint SELECT @Tipo=IDTipoCompra FROM catTipo_Compra WHERE (intLimiteSuperior >= @TOTAL and intLimiteInferior < @TOTAL ) or (intLimiteSuperior = 0 and intLimiteInferior < @TOTAL ) RETURN(isnull(@Tipo,1)) END GO -====================================================================== ======================= -- Obtener el nomre de un tipo de compra dado el id de la misma ====================================================================== IF EXISTS (SELECT * FROM sysobjects WHERE name = N'ftn_GetstrTipoDeCompra') DROP FUNCTION ftn_GetstrTipoDeCompra GO CREATE FUNCTION ftn_GetstrTipoDeCompra(@COD tinyint) RETURNS NVARCHAR(30) AS BEGIN DECLARE @Tipo NVARCHAR(30) SELECT @Tipo=strTipoDeCompra FROM catTipo_Compra WHERE IDTipoCompra=@COD RETURN(@Tipo) END GO -====================================================================== ======================= -- Obtener las existencias de un articulo ====================================================================== ======================= IF EXISTS (SELECT * FROM sysobjects WHERE name = N'ftn_GetExistencia') DROP FUNCTION ftn_GetExistencia GO CREATE FUNCTION ftn_GetExistencia(@Idbos nvarchar(12)) RETURNS FLOAT(2) AS BEGIN DECLARE @Existencia Float(2) SELECT @Existencia=intExistencia FROM tblArticulos_Existencia WHERE Idbos=@Idbos IF @Existencia IS NULL SET @Existencia=0 RETURN(@Existencia) END GO SET NOCOUNT ON GO 63 Manual básico de Base de Datos 2.3.4 Creación de Trigger por medio de código SQL Un trigger( o desencadenador) es una clase especial de procedimiento almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos. USE BDUML GO -- ============================================= -- TRIGGERS -- ============================================= IF EXISTS (SELECT error FROM master..sysmessages WHERE error = 50001 and msglangid=3082) EXEC sp_dropmessage 50001,'Spanish' GO IF EXISTS (SELECT error FROM master..sysmessages WHERE error = 50001 and msglangid=1033) EXEC sp_dropmessage 50001,'us_english' GO sp_addmessage @msgnum=50001, @severity=16, @msgtext='Se agotaron las existencias del articulo:%s', @lang ='us_english'; GO sp_addmessage @msgnum=50001, @severity=16, @msgtext='Se agotaron las existencias de este articulo:%s', @lang ='Spanish'; GO IF EXISTS (SELECT name FROM sysobjects WHERE N'tr_sinExistencia' AND type = 'TR') DROP TRIGGER tr_sinExistencia GO name = CREATE TRIGGER tr_sinExistencia ON tblDetalle_Nota_Salida_General FOR INSERT AS DECLARE ArticulosAInsertar CURSOR KEYSET FOR SELECT IdNotaSalida,Idbos,intCantidad FROM Inserted -DECLARE @IdNotaSalida nvarchar(10) DECLARE @Idbos varchar(12) DECLARE @intCantidad float(2) -OPEN ArticulosAInsertar FETCH NEXT FROM ArticulosAInsertar INTO @IdNotaSalida,@Idbos,@intCantidad WHILE (@@fetch_status <> -1) BEGIN DECLARE @CTemp float(2) IF (@@fetch_status <> -2) 64 Manual básico de Base de Datos BEGIN PRINT 'Verificando existencias para ' + @Idbos SELECT @CTemp=intExistencia FROM SIGA.dbo.tblArticulos_Existencia WHERE Idbos=@Idbos --PRINT 'Existencia ' + str(@CTEMP) IF @CTemp<=0 BEGIN ROLLBACK TRANSACTION RAISERROR (50001,16,10,@Idbos)WITH NOWAIT END ELSE BEGIN SELECT @CTemp=(intExistencia - @intCantidad) FROM SIGA.dbo.tblArticulos_Existencia WHERE Idbos=@Idbos --PRINT 'Existencia ' + str(@CTEMP) IF @CTemp<0 BEGIN ROLLBACK TRANSACTION RAISERROR (50002,16, 10,@Idbos)WITH NOWAIT END END END FETCH NEXT FROM ArticulosAInsertar INTO @IdNotaSalida,@Idbos,@intCantidad END CLOSE ArticulosAInsertar DEALLOCATE ArticulosAInsertar GO -********************************************************************** ***********-IF EXISTS (SELECT name FROM sysobjects WHERE name = N'UpdateExistenciaXE' AND type = 'TR') DROP TRIGGER UpdateExistenciaXE GO CREATE TRIGGER UpdateExistenciaXE ON dbo.tblNota_Entrada_General FOR UPDATE, INSERT AS If (select N.strAutorizado_por from dbo.tblNota_Entrada_General N, Inserted I where N.IdNotaEntrada = I.IdNotaEntrada) is not null Begin DECLARE @IdNota nvarchar(7) Set @IdNota = (Select IdNotaEntrada from Inserted) DECLARE ArticulosAInsertar CURSOR KEYSET FOR SELECT IdNotaEntrada , Idbos, intCantidad FROM dbo.tblDetalle_Nota_Entrada_General where IdNotaEntrada = @IdNota -DECLARE @IdNotaEntr nvarchar(10) 65 Manual básico de Base de Datos DECLARE @Idbos varchar(12) DECLARE @intCantidad float(2) -OPEN ArticulosAInsertar FETCH NEXT FROM ArticulosAInsertar INTO @IdNotaEntr,@Idbos,@intCantidad WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN UPDATE AE SET intExistencia=intExistencia + @intCantidad FROM dbo.tblArticulos_Existencia AE WHERE AE.Idbos=@Idbos END FETCH NEXT FROM ArticulosAInsertar INTO @IdNotaEntr,@Idbos,@intCantidad END CLOSE ArticulosAInsertar DEALLOCATE ArticulosAInsertar End GO 2.3.5 Creación de Procedimientos por medio de código SQL USE BDUML go IF EXISTS (SELECT name FROM sysobjects WHERE name = N'sp_InserProveedor_x_Bos' AND type = 'P') DROP PROCEDURE sp_InserProveedor_x_Bos GO create procedure sp_InserProveedor_x_Bos @IdProveedor nvarchar(16), @IdSegmento char(2), @IdFamilia char(2) as Insert Into tblProveedor_BoS values(@IdProveedor,@IdSegmento,@IdFamilia) GO IF EXISTS (SELECT name FROM sysobjects WHERE name = N'sp_InsertProveedor' AND type = 'P') DROP PROCEDURE sp_InsertProveedor GO CREATE PROCEDURE sp_InsertProveedor @IdProveedor nvarchar(16), @Nombre nvarchar(150), @Direccion nvarchar(150), @Telefono nvarchar(20), @Fax nvarchar(20), 66 Manual básico de Base de Datos @ApdoPostal nvarchar(10), @Email nvarchar(50), @Sitio_Web nvarchar(50), @strNumeroHacienda nvarchar(8), @strNumeroRuc nvarchar(16), @strNombreComercial nvarchar(100), @IdTipoPersProv char(2), @IdCategoria char(2) as Insert into dbo.CatProveedor values(@IdProveedor, @Nombre, @Direccion, @Telefono, @Fax, @ApdoPostal, @Email, @Sitio_Web,1,@strNumeroHacienda,@strNumeroRuc,@strNombreComercial,@IdT ipoPersProv, @IdCategoria ) GO --Agrega usuario IF EXISTS (SELECT name FROM sysobjects WHERE name = N'sp_AgregarUsuario' AND type = 'P') DROP PROCEDURE sp_AgregarUsuario GO CREATE PROCEDURE sp_AgregarUsuario @IdUsuario nvarchar(18), @IdEmpleado nvarchar(18), @IdGrupoSistema char(2), @strAlias nvarchar(20), @strDescripcion_Usuario nvarchar(250), @strAgregado_por nvarchar(18),@bolUsuarioPresupuesto bit, @bolUsuarioUCA bit,@bolUsuarioContabilidad bit, @bolUsuarioActivoFijo bit AS INSERT INTO dbo.tblUsuario_Sistema (IdUsuario,IdEmpleado,IdGrupoSistema,strAlias,strDescripcion_Usuario, strAgregado_por,bolUsuarioPresupuesto,bolUsuarioUCA,bolUsuarioContabil idad,bolUsuarioActivoFijo) VALUES(@IdUsuario,@IdEmpleado,@IdGrupoSistema,@strAlias,@strDescripcio n_Usuario,@strAgregado_por, @bolUsuarioPresupuesto,@bolUsuarioUCA,@bolUsuarioContabilidad,@bolUsua rioActivoFijo) GO IF EXISTS (SELECT name FROM sysobjects WHERE name = N'sp_InsertRequisa' AND type = 'P') DROP PROCEDURE sp_InsertRequisa GO Create Procedure sp_InsertRequisa @No_Requisa nvarchar(7), @Unidad_Admin nvarchar(16), @Solicitante nvarchar(18), @SolicitanteNominado nvarchar(18), @Tipo_Requisa tinyint, @Estado_Requisa tinyint, @strObservaciones nvarchar (250), @No_Expediente nvarchar(16), 67 Manual básico de Base de Datos @Pers_q_tiene_asig_Vehiculo nvarchar (50) AS Insert into tblRequisa_Materiales VALUES(@No_Requisa,@Unidad_Admin,@Solicitante, @SolicitanteNominado,@Tipo_Requisa,@Estado_Requisa, @strObservaciones,@No_Expediente, @Pers_q_tiene_asig_Vehiculo, getdate(),null) go IF EXISTS (SELECT name FROM sysobjects WHERE name = N'sp_InsertDetalleRequisa' AND type = 'P') DROP PROCEDURE sp_InsertDetalleRequisa GO Create Procedure sp_InsertDetalleRequisa @NoRequisa nvarchar(7), @Codigo_Material nvarchar(12), @intCantidad int AS Insert into tblDetalle_Requisa(IdRequisa,Idbos,intCantidad) values(@NoRequisa,@Codigo_Material,@intCantidad) go 2.4 Creación de la Base de Datos por medio del Entorno Corporativo 2.4.1 Crear una Base de Datos con el Administrador Corporativo de SQL SERVER 2005 y Access El proceso de creación de la Base de Datos se realizara directamente por medio de la Interfaz del Entorno Corporativo. Para ello el estudiante debe dominar a la perfección los conceptos relacionados con las Bases de Datos relacional y las características de una Base de Datos. Las bases de datos a desarrollar se construirán utilizando también el Gestor de Base de Datos Access. Esto se realizara con el objetivo que los estudiantes tengan dominio sobre los dos manejadores de base de datos más utilizados por los desarrolladores de sistemas en Nicaragua. 2.4.2 Crear las Tablas de la Base de Datos con el Administrador Corporativo Como se menciono antes, el administrador corporativo será el medio por el cual los estudiantes construirán todos los componentes de la base de datos. Para ello los estudiantes deben tener dominio completo de todos los componentes y estructura de las tablas y otros relacionados. Adicionalmente, deben tener completo dominio de los conceptos de bases de datos, relaciones, llaves, índices y demás elementos que conforman la estructura de una tabla. 68 Manual básico de Base de Datos 2.4.3 Cómo crear un procedimiento almacenado (SQL Server Management Studio) En este tema se describe cómo crear un procedimiento almacenado de Transact-SQL mediante el Explorador de objetos de SQL Server Management Studio y se ofrece un ejemplo en el que se crea un procedimiento almacenado simple en la base de datos AdventureWorks. Para crear un procedimiento almacenado 1. En el Explorador de objetos, conéctese a una instancia de Database Engine (Motor de base de datos) y expándala. 2. Expanda Bases de datos, la base de datos a la que pertenece el procedimiento almacenado y, por último, Programación. 3. Haga clic con el botón secundario en Procedimientos almacenados y, a continuación, haga clic en Nuevo procedimiento almacenado. 4. En el menú Consulta, haga clic en Especificar valores para parámetros de plantilla. 5. En el cuadro de diálogo Especificar valores para parámetros de plantilla, la columna Valor contiene valores recomendados para los parámetros. Acepte los valores o reemplácelos con nuevos valores y, a continuación, haga clic en Aceptar. 6. En el editor de consultas, reemplace la instrucción SELECT por las instrucciones para el procedimiento. 7. Para probar la sintaxis, en el menú Consulta, haga clic en Analizar. 8. Para crear el procedimiento almacenado, en el menú Consulta, haga clic en Ejecutar. 9. Para guardar el script, en el menú Archivo, haga clic en Guardar. Acepte el nombre de archivo o reemplácelo por un nombre nuevo y, a continuación, haga clic en Guardar. 2.4.4 Cómo crear Trigger (SQL Server Management Studio) Los desencadenadores DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL. Los desencadenadores logon se activan en respuesta al evento LOGON que se genera cuando se establece la sesión de un usuario. Los desencadenadores se pueden crear directamente a partir de instrucciones Transact-SQL o de métodos de ensamblados que se crean en Microsoft .NET Framework Common Language Runtime (CLR) y 69 Manual básico de Base de Datos se cargan en una instancia de SQL Server. SQL Server permite crear varios desencadenadores para una instrucción específica. Para construir los Triggers se utilizara el Administrador corporativo, es por medio de esta interfaz que se construirán algunos desencadenadores de ejemplo y que permitirán construirlos más rápido y realizar las pruebas automáticamente. III. INSTALACION DE SQL SERVER 2005 Este manual muestra cómo instalar Microsoft SQL Server 2005 en Windows XP. Incluye captura de todas las pantallas que aparecen en el programa de instalación y la explicación correspondiente de cada una de ellas (si así lo precisa). INSTALACIÓN DE MICROSOFT SQL SERVER 2005 EN WINDOWS XP 1. Introduciremos el CD de instalación, en nuestro caso hemos utilizado SQL Server 2005 Beta 2 (gratuito, sólo válido para evaluación y testeo). Nos aparecerá la primera ventana del asistente de instalación. Marcaremos "I accept the licensing terms and conditions" y pulsaremos en "Next": 2. Previamente, SQL Server instalará algunos componentes necesarios (Microsoft SQL Native Client y Microsoft SQL Server 2005 Setup Support Files). Pulsaremos en "Install": 70 Manual básico de Base de Datos 3. Pulsaremos en "Finish" para iniciar el proceso de instalación de SQL Server: 4. Se iniciará el asistente de instalación de SQL Server, pulsaremos en "Next": 71 Manual básico de Base de Datos 5. El asistente de instalación hará un chequeo previo de posibles problemas con algún componente de la instalación, si no hay problemas pondrá "Success" en "Status" y pulsaremos en "Continue": 72 Manual básico de Base de Datos 6. Nos pedirá el número de serie, puesto que es versión Beta, ya viene prefijado, pulsaremos en "Next": 7. A continuación marcaremos los componentes de SQL Server a instalar: SQL Server, Analysis Services, Reporting Services, Notification Services, Data Transformation Services, Workstation components y Books Online and development tools: 73 Manual básico de Base de Datos Si queremos mostrar los componentes que se instalará en detalle pulsaremos en "Advanced" (en esta ventana nos aparecerá una descripción de cada componente). Tras seleccionar los componentes a instalar pulsaremos en "Next": 8. Selecconaremos "Defautl instance" para instalar la instancia por defecto o "Named instance" para especificar un nombre de instancia personalizado: 74 Manual básico de Base de Datos 9. Si queremos iniciar todos los servicios de SQL Server con el mismo usuario desmarcaremos "Customize for each service account", de esta forma se utilizará el mismo usuario para iniciar todos los servicios del equipo que hará de Servidor de SQL Server. Si queremos utilizar un usuario existente de un dominio de Windows 2000/2003 marcaremos "Use a Domain User account" y especificaremos el usuario, la contraseña y el dominio. Si, por el contrario, queremos que el usuario con que se inicien los servicios sea el local del equipo donde estemos instalando SQL Server marcaremos "Use the Local System account" (conviene que sea administrador del equipo). Para iniciar los servicios de SQL Server automáticamente en el arranque del equipo marcaremos "Auto-start service". Tras configurar estos parámetros pulsaremos en "Next": 10. Indicaremos el modo de autenticación que queramos usar para el acceso a SQL Server: Windows Authentication Mode (SQL Server utilizará los usuarios del Sistema Operativo para el acceso) ó Mixed Mode (usuarios del sistema operativo y usuarios de SQL Server). Introduciremos la contraseña para acceder a la administración de SQL Server (como superusuario) y pulsaremos en "Next": 75 Manual básico de Base de Datos 11. Indicaremos las opciones del idioma, normalmente se dejarán las opciones por defecto "Collation designator and sort order" con el valor de "Modern_Spanish" y marcaremos "Accent sensitive". SQL Server permite especificar distintos valores según el servicio marcando "Customize for each service account". Tras configurar estos valores pulsaremos "Next": 12. Si hemos indicado que se instale "Report Server", nos aparecerá la siguiente ventana para especificar el directorio virtual de Report Server en "Report Server virtual directory" y el directorio virtual de "Report Manager" en "Report Manager virtual directory. Para utilizar este componente deberemos tener instalado y activo Internet Information Server pues es accesible vía http (web): 76 Manual básico de Base de Datos Indicaremos también el servidor SMTP y email para envío de email con los informes de Report Server: Si queremos que los errores críticos sean enviados automáticamente a Microsoft marcaremos "Automatically send fatal error reports to Microsoft": 77 Manual básico de Base de Datos 13. Por útlimo nos aparecerá una ventana con el resumen de los componentes y opciones seleccionadas en el asistente de instalación. Si todo es correcto pulsaremos en "Install" para iniciar la instalación de SQL Server: 78 Manual básico de Base de Datos 14. Si todo se ha instalado correctamente en "status" aparecerá "Setud finished". Pulsaremos en "Next": El programa de instalación ha concluido, ahora podremos comprobar en "Inicio" - "Programas" que se ha creado una nueva carpeta llamada "Microsoft SQL Server 2005" con el siguiente contenido (dependerá de los componentes instalados): 79 Manual básico de Base de Datos Para comprobar que la instalación se ha realizado correctamente ejecutaremos "SQL Server Management Studio", nos aparecerá la ventana de conexión "Connect to Server", donde deberemos indicar el tipo de servidor "SQL Server", el nombre del servidor (nombre del equipo ó dirección ip/nombre de la instancia) y el tipo de autenticación, en nuestro caso "Windows Authentication": Si SQL Server se ha instalado correctamente nos aparecerá la consola de SQL Server Management Studio: Desde aquí podremos administrar las bases de datos, tablas, vistas, usuarios, logs, copias de seguridad, monitores de actividad, errores, alertas, etc. También podremos comprobar que SQL Server se ha instalado correctamente utilizando una aplicación externa que acceda a alguna de las tablas de la base de datos que se crea por defecto. Por ejemplo utilizaremos ODBC y AjpdSoft Administración BD para comprobar la instalación: En primer lugar crearemos el driver ODBC desde "Inicio" - "Configuración" - "Panel de control" - "Herramientas administrativas" - "Orígenes de datos (ODBC)", nos aparecerá la ventana del Administrador de orígenes de datos ODBC, pulsaremos en "Agregar...": 80 Manual básico de Base de Datos Seleccionaremos "SQL Server" y pulsaremos en "Finalizar": Indicaremos el nombre del driver ODBC, una descripción y el servidor al que nos conectaremos, pulsaremos en "Siguiente": Dejaremos las opciones por defecto y pulsaremos en "Siguiente": 81 Manual básico de Base de Datos Indicaremos el idioma para los mensajes y las opciones de auditoría y pulsaremos en "Finalizar": Nos aparecerá una ventana con la información del ODBC se se creará, pulsaremos en "Aceptar" para finalizar la creación del driver ODBC. Si queremos comprobar que el driver funciona correctamente pulsaremos en "Probar origen de datos...": La ventana de prueba de origen de datos mostrará estos resultados (si todo es correcto): 82 Manual básico de Base de Datos Una vez creado el origen de datos podemos abrir cualquier aplicación que permita acceder a bases de datos mediante ODBC, por ejemplo AjpdSoft Administración BD: seleccionamos en "ODBC" el creado anteriormente "prueba_sqlserver" y pulsamos en "Aceptar": Ejecutamos una consulta SQL de prueba, por ejemplo: select * from person.address: Si la instalación es correcta nos aparecerán los registros de la tabla "person.address". 83 Manual básico de Base de Datos IV. MANTENIMIENTO Y RESPALDO Para realizar el respaldo y mantenimiento de la Base de Datos se utilizara el Administrador Corporativo. Para ello se construirá un Plan de Respaldo de la Base de Datos y se Explicara producto de la experiencia y especialización que consideraciones técnicas y practicas se deben tener en cuenta para elaborar y llevar a la práctica un Plan de Respaldo o Mantenimiento. Para construir un plan de mantenimiento y respaldo se deben tener en cuenta por ejemplo los siguientes aspectos: Características de la Institución Tamaño de la Base de Datos Crecimiento de la Base de Datos Carga de Trabajo y Usuarios Políticas de Respaldo Seguridad Acceso a la Información Características Técnicas de la Base de Datos Otros V. ADMINISTRACION DE LA BASE DE DATOS La administración de la Base de Datos es de suma importancia para el correcto desempeño de los sistemas y de la misma base de datos. Para la administración de la base de datos se deben considerar aspectos tales como: Administración de componentes de la Base de Datos Seguridad Usuarios y Grupos Mantenimiento y Respaldo Replicas VI. CASOS DE BASE DE DATOS CON ACCESS Y SQL SERVER 2005 Los casos que se presentan a continuación son para que los participantes de la Capacitación puedan poner en práctica el conocimiento acumulado durante el curso. Para ello se requiere que dominen a la perfección cada uno de los elementos, guías y aspectos técnicos que fueron presentados por el Catedrático. 84 Manual básico de Base de Datos 6.1 Caso 1: SISTEMA DE FACTURACION VENTA E INVENTARIO Para realizar el presente Laboratorio se debe construir la Base de Datos SFVI, ya sea con el administrador corporativo o directamente mediante SCRIPT. Adicionalmente tienen que revisar la documentación de consultas proporcionadas. El grupo debe agregar información a la base de datos. I. II. III. Identifique las Tablas y demás elementos de la Base de datos A consideración (usando SQL Server 2005) construya las siguientes consultas: Ventas diarias Ventas por clientes Ventas por Producto Mensual Ventas por Categoría del Mes Ventas por Rango de Fecha Ventas por producto y rango fecha Ventas por categoría y rango de Fechas Ventas totales del mes Productos más vendidos por mes Listado de Proveedores Productos que ofrecen Listado de Clientes Contactos de Clientes Crédito Devoluciones por ventas Devoluciones por Clientes Devoluciones por Productos Vendidos Devoluciones por Compras Devoluciones por Proveedor Devoluciones por Productos Construya los formularios para ingresar información a la base de datos con cualquier lenguaje de programación 6.2 Caso 2: Suponga el Caso de un sistema de una Clínica Hospitalaria que está adscrita al INSS a. b. c. d. e. Identifique las tablas, llaves y Relaciones Defina y Construya las Consultas más Importantes Establezca un Plan de Respaldo para la BD Establezca un Plan de Mantenimiento para la Base de Datos Cuales Serian las Actividades de Administración que usted realizara sobre la Base de Datos 6.3 Caso 3. Tomando en Cuenta el Caso de un Sistema de Registro Académico de una Universidad Privada y de un centro de Educación de Primaria y Secundaria Privada 85 Manual básico de Base de Datos a. Como cree usted que se debe diseñar la Base de Datos. Sera recomendable construir dos base de Datos o se debe hacer en una sola b. Construya la(s) base de Datos con todos sus componentes en cada caso c. Genere casos de todos los tipos de Consultas vistos en Clases d. Construya al menos dos casos de Procedimientos Almacenados y Trigger para al menos 3 tablas 6.4 Caso 4. Construya la Base de Datos para un Sistema de Recursos Humanos. 6.5 Caso 5. Construya en ASP 2005 o Superior y en Visual Basic 6.0 las interfaces Básicas para el Ingreso de Datos para el Sistema de Facturación Venta e Inventario. VII. AUDITORIA DE BASE DE DATOS La auditoria de la Base de Datos se realiza con el objetivo de evaluar una serie de aspectos que aseguran la base de datos en diferentes tipos de aspectos y con el propósito de contar con la integridad, confiabilidad y estabilidad de los datos: Comprobar el correcto desempeño, El diseño de la base de datos, Diccionario de Datos Documentación de respaldo de la base de datos Verificar si la Base de Datos se ajusta a las necesidades de la Institución Integridad de la Base de Datos Planes de Respaldo y Mantenimiento Administración de Usuarios y Grupos Otros aspectos relacionados. 86