1-146

MANUAL DE SQL SERVER 2000

2-146

Módulo I: Diseño de una base de datos
Tema 1:Teoría de sistemas de base de datos relacional
Conceptos básicos Que es un sistema de base de datos? El modelo Relacional Terminología relacional

Tema 2: Introducción al diseño de bases de datos
Componentes de una base de datos SQL Server Normalizar un diseño de base de datos . Lograr una base de datos bien diseñada Relaciones entre entidades . Relaciones entre tablas uno-a-uno . Relaciones entre tablas uno-a-muchos . Relación entre tablas muchos-a-muchos

Tema 3: Elementos adicionales para el diseño una base de datos SQL Server
Archivos y Grupos de archivos . Reglas para diseñar Archivos y Grupos de archivos . Grupos de archivos predefinido . Recomendaciones Registros de transacciones Ambiente . Estimar el Tamaño de una base de datos . Diseño físico de la base de datos Algunas consideraciones sobre instalación de SQL Server . Seguridad . Planificar la Seguridad . Niveles de seguridad . Modos de autenticación

Tema 4: Identificar los requerimientos de diseño
El Proceso Identificar Identificar Identificar Identificar de Identificar los Requerimientos de diseño las Metas del Sistema la Cantidad y Tipos de Datos Cómo se usarán los Datos las Reglas Comerciales del Sistema

Tema 5: Desarrollar un modelo lógico de base de datos
Identificar Entidades y Sus Atributos Identificando Relaciones Entre las Entidades Identificar Restricciones sobre los Datos

Ejercicios Prácticos

Módulo II: Implementar una base de datos y sus tablas
Tema 1: Crear y administrar una base de datos SQLServer
Métodos para crear una base de datos SQLServer . El comando CREATE DATABASE . Usar el Enterprise Manager . El asistente Create Database Administrar una base de datos SQL Server . Ver información referida a la base de datos Modificar una base de datos . Configurar opciones de la base de datos Borrar una base de datos SQL Server

Tema 2: Identificar Tipos de Datos
Tipos de datos provistos por el sistema Tipos de datos definidos por el usuario

Tema 3: Crear y administrar tablas en SQL Server
Crear tablas en una base de datos SQL-Server . Determinar la anulabilidad de las columnas . Definir valores por defecto . Auto numeración y columnas de identificación Crear columnas de identificación Propiedad IDENTITY

3-146
Identificadores globalmente únicos . Métodos para crear tablas Comando CREATE TABLE Enterprise Manager Database Designer (Diseñador de base de datos) Administrar tablas de una base de datos SQL Server . Consultar información sobre tablas . Modificar tablas de una base de datos SQL Server . Borrar tablas de una base de datos SQL Server

Tema 4: Implementar la integridad de los datos
Introducción a la integridad de los datos . Asegurar la integridad de los datos . Tipos de Dato . Definiciones NOT NULL . Definiciones DEFAULT . Propiedades IDENTITY . Restricciones (constraints) . Reglas (rules) . Desencadenadores . Indices Tipos de Integridad de datos . Integridad de entidad . Integridad de dominio . Integridad referencial . Integridad definida por el usuario Implementar restricciones de integridad . Introducción a las restricciones de integridad . Restricciones PRIMARY KEY Crear restricciones PRIMARY KEY . Restricciones UNIQUE Crear restricciones UNIQUE . Restricciones FOREIGN KEY Crear restricciones FOREIGN KEY Deshabilitar restricciones FOREIGN KEY . Restricciones CHECK Crear restricciones CHECK Deshabilitar restricciones CHECK

Tema 5: Implementar índices
Introducción Arquitectura de los índices . Propósito y estructura . Tipos de índices . Índices agrupados . Índices no agrupados . Características de los índices Unicidad Índices compuestos Factor de llenado Sentido de ordenamiento . Información sobre índices . Indexado Full-Text Crear y administrar índices . Crear índices Usar interfase gráfica Usar comandos Transact-SQL . Administrar índices Eliminar un índice Reconstruir un índice Renombrar un índice . Elegir un índice Índices agrupados Índices no agrupados . Recubrimiento de índice . Índices compuesto frente a índices múltiples

Módulo III: Consultar y modificar datos
Tema 1: Principios de álgebra relacional
Operaciones relacionales . Restricción . Proyección

. GROUP BY . La cláusula GROUP BY . GROUP BY. División Cálculo relacional . Tipos de Subconsultas Subconsultas que son usadas con IN y NOT IN Subconsultas que son usadas con operadores de comparación Subconsultas que son usadas con EXISTS y NOT EXISTS Resumir datos . Procedimientos almacenados del sistema . Intersección . Diferencia . Expresiones Tema 2: Consultar a los datos en una base de datos SQL Server Los fundamentos del comando SELECT El comando SELECT .. Listas objetivo .VALUES para agregar datos Usar una subconsulta SELECT para agregar datos . y HAVING La cláusula ORDER BY Tema 3: Usar técnicas de consulta avanzadas para acceder a los datos Usar combinaciones para recuperar datos . Procedimientos almacenados temporarios . Producto . Usar cláusulas en la lista de selección La cláusula DISTINCT La cláusula TOP n La cláusula AS Tipos de información en la lista de selección La cláusula INTO La cláusula FROM Las cláusulas WHERE. Definir subconsutas dentro del comando SELECT .. Usar el comando DELETE para borrar datos .INTO para agregar datos . Usar el comando INSERT para agregar datos Usar el comando INSERT.4-146 . Unión . Procedimientos almacenados remotos . Reunión . Usar el comando TRUNCATE TABLE para borrar datos Módulo IV: Implementar procedimientos almacenados Tema 1: Introducción a los procedimientos almacenados Propósitos y ventajas de los Procedimientos Almacenados . Rendimiento Marco de programación Seguridad Categorías de procedimientos almacenados . Usar el operador ROLLUP para resumir datos Tema 4: Modificar datos en una base de datos SQL Server Insertar datos en un base de datos SQL Server . y HAVING . Procedimientos almacenados extendidos .. Combinaciones OUTER Usar LEFT OUTER JOIN Usar RIGHT OUTER JOIN Usar FULL OUTER JOIN . Combinaciones INNER . Usar un comando SELECT. Usar el comando UPDATE para modificar datos Usar la cláusula SET para modificar datos Usar la cláusula WHERE para modificar datos Usar la cláusula FROM para modificar datos Modificar textos o imágenes Borrar datos de una base de datos SQL Server . Procesar las cláusulas WHERE. Usar el operador CUBE para resumir datos . Procedimientos almacenados locales . Agregar texto o imágenes a filas ya insertadas Modificar datos en una base de datos SQL Server .

Llamar un procedimiento almacenado para ejecutarlo . El comando CREATE PROCEDURE Proveer a un procedimiento almacenado de un contexto Crear procedimientos almacenado temporarios Agrupar. ejecutar. levantar y encriptar procedimientos almacenados Enterprise Manager El asistente para crear de procedimientos almacenados Crear y agregar procedimientos almacenados Extendidos Diferir la resolución de nombres Ejecutar un procedimiento almacenado . Ejecutar prcedimientos almacenados cuando SQL Server arranca Modificar procedimientos almacenados Borrar procedimientos almacenados Tema 3: Programar procedimientos almacenados Parámetros y variables El comando RETURN y el manejo de errores Valores por defecto y parámetros NULL Comprobar errores del Server Procedimientos asidados Cursores Métodos para recuperar datos Módulo V: Conectarse a un SQL Server Tema 1: Comenzando con ADO . modificar y borrar procedimientos almacenados Cómo se almacena un procedimiento Métodos para crear procedimientos almacenados .ActiveX Data Objects Tema 2: Modelo de objetos de ADO Tema 3: Objetos ADO Tema 4: Propiedades ADO .5-146 Tema 2: Crear. Especificar parámeros y sus valores .

Lo que dará origen a la estructura la base de datos. o sea. A medida que Ud. Esa parte del mundo que nos interesa la llamaremos el espacio del problema. el MS-SQL Server 2000. La información en cuestión puede ser cualquier cosa que se considere importante para el individuo o la organización a la cual debe servir el sistema. Por último. Este esquema no es mas que la representación del modelo conceptual o lógico expresado en términos que puedan ser usados para describirlo al SGBDR.6-146 MODULO I Tema 1: Teoría de Sistema de Base de Datos Relacional Lo que aprenderá: Al terminar este tema usted podrá: — Entender los principales conceptos de la teoría de base de datos relacionales Que es un sistema de base de datos? Un sistema de Base de Datos es básicamente un sistema para archivar en computador. la aplicación que accede a los datos almacenados en una base de datos y que a la vez interactúa con el usuario se divide en dos partes: la llamada capa intermedia que contiene todas las validaciones y las reglas del negocio y es la que interactúa con la base de datos y el front end que es la que contiene los formularios y realiza la presentación de los reportes. a los datos mas las tablas. cualquier cosa necesaria para apoyar el proceso general de atender los asuntos de esa organización. Como veremos mas adelante no se trata de modelizar "todo" el mundo sino solo la parte "importante" y "pertinente" para alcanzar los objetivos funcionales del sistema. le vaya explicando al SGBDR como quiere que almacene los datos. lo que le permitirá definir el alcance del sistema.1). procedimientos almacenados. llamaremos base de datos a la combinación de los datos y su estructura. vistas. dichas características se las denomina atributos (por ejemplo el "nombre" del cliente es un atributo de un cliente). y a las reglas que el motor de base datos utilizará para asegurar el resguardo de los datos. no puede haber una factura que no tenga asignada un cliente. dicho de otro modo. a un específico y bien definido conjunto de objetos e interacciones. En un modelo de tres capas. . y constituye la traslación del modelo conceptual en una representación física que pueda ser implementada utilizando el Sistema de Gestión de Bases de Datos Relacional (SGBDR) a ser empleado. vistas. El modelo de datos incluye la descripción de las interrelaciones entre las entidades y las restricciones sobre dichas relaciones (por ej: las "facturas de venta" se emiten a nombre de un "cliente" y esta relación no puede faltar. que Ud. etc). está constituida por las tablas y vistas que serán implementadas. entonces. El término modelo de datos se utilizará se utilizará para significar una descripción conceptual del espacio del problema. índices. Pero es fundamental para el éxito de su proyecto limitar el sistema de base de datos. El término base de datos no incluye a la aplicación la cual consiste de los formularios y los reportes con los que interactuarán los usuarios. es decir . que son clases de objetos que comparten determinadas características (por ejemplo un "cliente" es una entidad). esto incluye la definición de sus entidades. el SGBDR creará los objetos necesarios para gestionarlos (tablas. quiere diseñar. La base de datos incluye. interactuando con el usuario final (ver figura 1. a los fines del presente Kit. relaciones. consultas. La capa física o esquema físico del diseño. es un sistema computarizado cuyo propósito general es mantener información y hacer que esté disponible cuando se solicite. ni incluye la piezas de código usadas para unir las partes de la aplicación.

investigador de IBM. Codd.7-146 El modelo Relacional El modelo relacional está basado en una colección de principios matemáticos desarrollado inicialmente sobre un conjunto de conceptos teóricos y predicados lógicos. Esto principios fueron aplicados al campo de los modelos de datos a finales de los años ´60 por el Dr. F. E. y publicados por primera vez en 1970. .

por lo que la relación no permite tuplas duplicadas.8-146 El modelo relacional define el modo en que los datos van a ser representados (estructura de datos). El cuerpo consiste en un conjunto desordenado de cero o más tuplas. El MS-SQLServer 2000 implementa un modelo relacional de base de datos. esto es. llamado relación. la forma en que van ser protegidos (integridad de los datos) y las operaciones que pueden ser aplicadas sobre ellos (manipulación de datos). En cuanto a la terminología. donde cada fila constituye una tupla. De todos modos y a los fines del presente Kit utilizaremos en forma indistinta la denominación de relación o de tabla. el número de registro no es tenido en cuenta en el modelo relacional. a partir de ahora se utilizarán las siguientes equivalencias de significado: Una relación puede ser una tabla. Por otro lado las relaciones sin tuplas siguen siendo relaciones. La relación se divide en dos secciones el encabezado y el cuerpo.2 muestra una relación con los nombres formales de sus componentes principales La estructura de la figura constituye una relación. en esta parte se utilizó una lenguaje formal para la definición de los elementos abordados. Estas etiquetas constan de dos parte separadas por dos puntos ":" la parte izquierda es la denominación propiamente dicha del atributo. mientras que solo algunas son valores efectivamente incorporados a la relación). — Todos los valores son escalares. que es el conjunto de todos los valores posibles y legales que puede tomar el atributo en las tuplas (por ej: el primer atributo de la relación de la figura tiene como dominio a todas las compañías que existen. que una tabla ordenada. que dada cualquier posición fila/columa dentro de la relación hay uno y solo un valor. A los fines prácticos una relación puede ser considerada como una tabla. Por lo que como veremos mas adelante al resultado de una orden select se le puede aplicar otro select. mientras que la parte derecha configura el dominio del atributo. concepto conocido como clausura . Terminología relacional La Figura 1. En términos generales un sistema de base de datos relacional tiene las siguientes características: — Todos los datos están conceptualmente representados como un arreglo ordenado de datos en filas y columnas. donde el encabezado contiene la etiquetas de los atributos. y la cantidad de atributos indica el grado de la relación. esto indica que las tuplas no tienen un orden intrínseco. o un recordset o un result set. La cantidad de tuplas en una relación indica la cardinalidad de la relación. Una tupla puede ser una fila (row) o un registro (record) . Es importante destacar que el concepto de clausura permite que el resultado de una operación sobre un relación sea el dato para otra operación. — Todas las relaciones son realizadas sobre la relación completa y dan como resultado otra relación. Por último las relaciones son conjuntos donde cualquier elemento puede ser inequívocamente identificado. aún cuando al momento de formularse la teoría intencionalmente se excluyó el término tabla por tener connotaciones de ordenamiento que no se deben aplicar al concepto de relación que es mas un conjunto. Cada columna en la relación es un atributo.

Una base de datos también puede utilizar procedimientos almacenados que usan Transact-SQL programando código para realizar operaciones con los datos en la base de datos. valores por defecto. y subsecuentemente crear una base de datos y los objetos que esta contiene. Una tabla (entidad) contiene una colección de filas (tuplas) y columnas (atributos). Las tablas tienen varios tipos de controles (restricciones. desencadenadores. en formatos específicos. se agrega una fila de datos a la tabla Empleados.9-146 Un atributo puede ser una columna (column) o un campo (field). Nombre. se utilizan términos que corresponden precisamente al modelo físico de implementación en el SGBDR. nombres. o números). dos conceptos que deben integrarse para entender el diseño de bases de datos relacionales. suponga que se crea una base de datos llamada MiCoBD para manejar los datos en su compañía. — Describir el proceso de normalización y normalizar tablas en un diseño de bases de datos. para esto usted crea que un procedimiento almacenado llamado AgregarEmp que se personaliza para aceptar los valores de los datos por un nuevo empleado y que realiza la operación de agregar la fila a la tabla Empleados. y la tabla contiene las columnas EmpID. En la base de datos MiCoBD. Dept. Usted puede agregar restricciones de integridad referencial a las tablas para asegurar la consistencia entre los datos interrelacionados en tablas diferentes. Dichas equivalencias se generan porque al instanciar en la implementación física el modelo conceptual. fechas. en este caso el MS-SQLServer 2000. usted debe comprender los conceptos fundamentales del diseño de bases de datos. Se discute la normalización y el concepto de relaciones entre entidades. Por cada empleado. por lo que usted define una vista llamada . usted debe agregar restricciones a la tabla. Antes de que usted pueda desarrollar un modelo lógico de datos. Se podría necesitar un resumen departamental de empleados. deberá estar familiarizado con los componentes básicos de una base de datos y cómo esos componentes trabajan juntos para proporcionar un almacenamiento eficaz de los datos y acceso a aquellos que requieren tipos específicos de datos. y tipos de datos de usuario) que aseguran la validez de los datos. Si usted quisiera realizar búsquedas rápidas para encontrar los datos de un empleado basado en el ID del empleado. Para asegurar que nunca dos empleados tengan el mismo EmpID y que la columna de Dept contiene números sólo válidos para las secciones en su compañía. Las tablas pueden tener índices (similar a los de los libros) que permiten encontrar las filas rápidamente. Apellido. crea una tabla llamada Empleados para guardar información sobre cada empleado. montos. usted definiría índices. como guardar vistas que proporcionan acceso personalizado a los datos de la tabla. Componentes de una base de datos SQL Server Una base de datos SQL Server consiste en una colección de tablas que guardan conjuntos específicos de datos estructurados. y Cargo. MODULO I Tema 2: Introducción al diseño de bases de datos Lo que aprenderá: Al terminar este tema usted podrá: — Describir los componentes principales de una base de datos relacional. reglas. Este tema presenta los componentes básicos de una base de datos y la terminología que describe esos componentes. que utiliza la terminología Microsoft. Cada columna en la tabla se diseña para guardar un cierto tipo de información (por ejemplo. desde la base de datos. Además. Por ejemplo. — Identificar las relaciones que existen entre las entidades.

Normalizar un diseño lógico de base de datos involucra usar métodos formales para separar los datos en múltiples tablas relacionadas. Una normalización razonable debería incluir la mínima cantidad de consultas habituales posible que involucren más de cuatro tablas relacionadas. Cuando se utilizan los índices. la tabla Empleados. Demasiadas combinaciones complejas entre varias tablas puede deteriorar el rendimiento en las consultas. .1 La base de datos MiCoBD. y la vista EmpsDept Normalizar un diseño de base de datos A continuación se verá el tema de normalización desde un punto vista práctico. el SQL Server 2000 Query Optimizer (Optimizador de Consultas de SQL Server) es muy eficiente al seleccionar interrelaciones entre las tablas.10-146 EmpsDept que combina datos de las tablas Secciones y Empleados.1 muestra las partes de la base de datos MiCoBD. Figura 2. Perfeccionar un diseño de base de datos incluye el proceso de normalización. Figura 2. mientras que tener pocas tablas con más columnas cada una es característico de una base de datos no-normalizada. Una normalización razonable mejora a menudo el comportamiento general del sistema. Tener un número mayor de tablas con pocas columnas es característico de una base de datos normalizada. resaltando aquellos conceptos útiles y comentando las limitaciones que deben tenerse en cuenta en el proceso de normalizado de una base de datos. Un aumento de la normalización produce una mayor cantidad y complejidad de combinaciones entre las tablas requeridas para recuperar los datos.

la tabla Empleados no incluye una columna que identifica unívocamente cada fila dentro de la tabla. Figura 2. este cambio del esquema podría tener lugar sin afectar las aplicaciones. y el rediseño total no es factible. Pero aún entonces. y ningún registro puede compartir el mismo valor de ID con otro. tal el caso de una base de datos existente. En la Figura 2. Empezar con un diseño completamente normalizado y a partir de allí desnormalizar selectivamente algunas tablas por razones específicas de rendimiento de las consultas es una buena estrategia. Fíjese que cada instancia de David Mendlen tiene un único valor de EmpID. Si no. Al no haber ningún identificador único en esta tabla. podría ser posible crear una vista que esconde de las aplicaciones el cambio del esquema. Una tabla debe tener un identificador.11-146 Una base de datos que se usa principalmente para soporte de decisión (al revés de una base de datos operacional que realiza tareas de actualización de datos) podría no tener actualizaciones redundantes y podría ser más entendible y eficaz para las consultas si el diseño no se normaliza totalmente. Fíjese que el nombre de David Mendlen aparece dos veces.2. tener datos no-normalizados es el error de diseño más común en aplicaciones de base de datos más que tener datos demasiado normalizados. si ambos empleados trabajaron en la misma sección y tienen el mismo tipo de trabajo. Esta situación podría ser un problema. no hay ninguna manera de distinguir fácilmente una fila de otra. y no debe tener valores o columnas repetidas. debería evitar columnas que acepten valores nulos. La columna (o columnas) que sirve como identificador único de la fila para una tabla constituye la clave primaria de la tabla. Estas reglas pueden ponerse bastante complicadas y pueden ir más allá del alcance del presente. Si la base de datos es accedida a través de los procedimientos almacenados. Cada tabla debe tener una columna de ID. más aún. A veces el diseño de la base de datos lógico ya está definido. . Una Tabla debe Tener un Identificador La regla fundamental de la teoría del diseño de base de datos es que cada tabla debe tener un identificador de las filas. De todos modos. como se muestra en la Figura 2. podría ser posible normalizar una tabla grande selectivamente en varias tablas más pequeñas. las reglas de normalización identifican ciertos atributos que deben estar presentes o ausentes en una base de datos bien diseñada. Usted puede normalizar la tabla agregando una columna que singularmente identifique cada fila. No obstante. Lograr una base de datos bien diseñada En la teoría de diseño de base de datos relacionales. hay algunas reglas que pueden ayudarlo a lograr un diseño de la base de datos correcto. debe guardar datos para sólo un solo tipo de entidad.2 Una tabla que no tiene ningún identificador único. que es una columna o un conjunto de columnas que toman valores únicos para cada registro de la tabla.3.

12-146 Figura 2. Por ejemplo. Si la dirección del editor cambia.3 Una tabla normalizada con un identificador único.5 Un diseño de la base de datos normalizado incluye una tabla para los libros y una tabla para información sobre el editor. si el último libro de un editor es eliminado de la tabla Libros. se guardaría la información sobre los libros y editores en por lo menos dos tablas: una para los libros y una para los editores (como se muestra en Figura 2. Figure 2. Aunque es posible tener columnas que contienen información para el libro y su editor en la misma tabla. en la Figura 2. Una Tabla debe Guardar Datos para un Solo Tipo de Entidad Intentar guardar demasiada información en una tabla puede afectar la administración eficaz y fiable de los datos en la tabla.4 Una tabla de libros que incluye título e información del editor.4. la tabla Libros incluye información sobre cada editor de libros. Figura 2. el cambio debe realizarse en todos los registros de libros de ese editor. Además. En una base de datos normalizada. .5). la información de ese editor se pierde. este diseño lleva a varios problemas. La información del editor debe agregarse y debe guardarse redundantemente para cada libro publicado por un editor dado. Esta información usa espacio extra de almacenamiento en la base de datos.

Otra solución es cambiar la estructura de la tabla para agregar otra columna para el nombre del segundo autor. En el caso de la tabla Libros. debería considerar poner estas columnas en otra tabla vinculada a la tabla primaria. Autor2. Si hay sólo una columna en la tabla Libros para el nombre del autor. Si la información del editor cambia. y la información del editor estará allí aún cuando el editor no tenga ningún libro en la base de datos. como se muestra en la Figura 2.7. esta situación presenta un problema. debe cambiarse en sólo un lugar. Aunque puede ser útil permitir valores nulos en casos aislados. Por ejemplo. Si tiene una tabla que tiene varias columnas que permiten valores nulos y varias de las filas tienen valores nulos en dichas columnas. Este diseño habilita cualquier número de autores para un libro sin modificar la definición de la tabla y no desperdicia espacio libre para almacenar libros que tienen un solo autor. Una solución es guardar el nombre de ambos autores en una columna. muchos de ellos podrían tener dos o más. es mejor usarlos muy poco porque ellos requieren un manejo especial con el consiguiente aumento de la complejidad de las operaciones de datos.6 Dos modos de estructurar la tabla Libros Si usted encuentra que necesita guardar una lista de valores en una sola columna o si tiene columnas múltiples para una sola pieza de datos (Autor1. Una Tabla no Debe tener Valores o Columnas Repetidas Una tabla no debe contener una lista de valores para un pedazo específico de información. Un valor nulo indica que el registro no tiene valor por ese atributo. debe considerar poner los datos duplicados en otra tabla con un vínculo a la tabla primaria. Guardar los datos en dos tablas separadas permite que la tabla primaria sea simple en su diseño pero a la vez mantener la capacidad de almacenar información ocasional. Una Tabla debe Evitar Columnas que acepten valores nulos Las tablas pueden tener columnas definidas para permitir valores nulos. pero esta solución guarda sólo dos autores. . Figure 2. Aunque la mayoría de los libros podrían tener sólo un autor. pero mostrar una lista de autores individuales sería entonces difícil.13-146 La información sobre el editor tiene que ser grabada sólo una vez y quedar vinculada a cada libro de ese editor. y así sucesivamente). Debería agregarse otra columna si algún libro tiene tres autores. usted podría crear una tabla primaria adicional para los autores y luego crear una tercera tabla que vincule los libros a sus autores y almacene los valores repetidos. suponga que usted quiere consultar los títulos de libros y sus autores.

El tipo de relación depende de cómo se definen las columnas relacionadas." Hay tres tipos de relaciones entre las tablas: uno-a-uno. pero cada título tiene un solo editor. una fila en tabla A no tiene más de una fila vinculada en tabla B (y viceversa).7 Tres tablas que guardan información sobre los libros y sus autores. Una relación uno-a-muchos se crea si solo una de las columnas relacionadas es una clave primaria o tiene una restricción de unicidad. uno-a-muchos. que generalmente tienen el mismo nombre en ambas tablas. Relación entre tablas muchos-a-muchos . las tablas Editores y Título mencionadas previamente tienen una relación uno-a-muchos. Por ejemplo. Se discuten claves primarias y las claves foráneas en más detalle en Tema 5. y muchos-a-muchos. pero una fila en la tabla B tiene una única fila vinculada en la tabla A.14-146 Figura 2. las relaciones entre entidades ayudan a prevenir datos redundantes. porque la información relacionada de esta manera normalmente estaría en una sola tabla. Cada editor produce muchos títulos. Este tipo de referencia no es común. Relaciones entre tablas uno-a-muchos Una relación uno-a-muchos es el tipo más común de relación entre entidades. "Llevando a cabo Integridad de los Datos. En la mayoría de los casos. Una referencia uno-a-uno se crea si las dos columnas relacionadas son claves primarias o tienen restricción de unicidad. Relaciones entre tablas uno-a-uno En una relación uno-a-uno. la relación entre entidades vincula la clave primaria de una tabla que proporciona a un identificador único para cada fila con una entrada en la clave foránea de la otra tabla. En este tipo de relación. sin embargo. una fila en la tabla A tiene muchas filas vinculadas en la tabla B. Relaciones entre entidades En una base de datos relacional. Una relación entre entidades trabaja vinculando datos de dos tablas a través de columnas clave.

la instalación del SQL Server y su ambiente operativo. las relaciones ayudan a prevenir datos redundantes. generalmente columnas clave que tienen el mismo nombre en ambas tablas. Todos los datos y objetos de la base de datos. deben guardar sólo datos para un solo tipo de entidad. En una base de datos relacional. y muchos-a-muchos. registros de transacciones. llamada tabla de unión cuya clave primaria consiste en las claves foráneas de ambas tablas A y B. fechas. se deben tener en cuenta varios factores. una fila en tabla A tiene muchas filas vinculadas en tabla B (y viceversa). Se puede crear tal relación definiendo una tercera tabla. usted verá los objetos primarios que están contenidos en una base datos SQL Server. y vistas. incluyendo las tablas y las relaciones entre ellas. Las tablas en una base de datos normalizada deben tener un identificador. deben evitar columnas que acepten valores nulos.15-146 En una relación muchos-a-muchos. Usted puede crear relaciones entre sus tablas en un diagrama de la base de datos y mostrar cómo se vinculan las columnas en una tabla a las columnas de otra tabla. Archivos y Grupos de archivos Para definir una base de datos. Las reglas de normalización identifican ciertos atributos que deben estar presentes o ausentes en una base de datos bien diseñada. Resumen del tema Una base de datos SQL Server consiste en una colección de tablas que guardan un conjunto específico de datos estructurados. nombres. montos. Una relación trabaja vinculando datos de las columnas. A medida que la normalización aumenta. Esta lección discute cada uno de estos temas. como tablas.7. usted vio cómo la información del autor puede separarse en otra tabla. MODULO I Tema 3: Elementos adicionales para el diseño una base de datos SQL Server Lo que aprenderá: Al terminar este tema usted podrá: — Describir los factores que se deben tener en cuenta al diseñar una base de datos SQL Server. Cada una de estas tablas tiene una relación uno-a-muchos con la tabla de LibrosAutores que sirve como la tabla de la unión entre las dos tablas primarias. Perfeccionar un diseño de base de datos incluye el proceso de normalización. incrementa el número y la complejidad de los vínculos que son necesarios para recuperar los datos. se guardan dentro de los siguientes tipos de archivos del sistema operativo: . y la seguridad. que incluyen los archivos de la base de datos y grupos de archivos. desencadenadores. La tabla Libros y la tabla Autores tienen una relación muchos-a-muchos. Hay tres tipos de relaciones entre las tablas: uno-a-uno. o números). uno-a-muchos. En las Figuras 2. es el corazón de una base de datos relacional optimizada. Ejercicio 1: Explorando los Conceptos Básicos de Diseño de la base de datos En este ejercicio. El diseño lógico de la base de datos. Usted aplicará los principios de normalización a un diseño de la base de datos e identificará las relaciones que existen entre las entidades dentro de una base de datos.6 y 2. Cada columna en la tabla se diseña para guardar un cierto tipo de información (por ejemplo. procedimientos almacenados. SQL Server 2000 usa un conjunto de archivos del sistema operativo. El tipo de relación entre tablas depende de cómo usted define las columnas relacionadas. y no deben tener valores o columnas repetidos. Una tabla contiene una colección de filas y columnas. Normalizar un diseño lógico de base de datos lógico involucra usar métodos formales para separar los datos en múltiples tablas relacionadas. Al diseñar una base de datos SQL Server.

Adicionalmente.ndf.ndf) pueden crearse en tres unidades de disco y pueden asignarse al grupo de archivos fgroup1. usted puede usar un archivo de datos secundario para permitir el crecimiento de su base de datos. Si el archivo primario puede almacenar todos los datos da la base de datos. Si sucede esto. Grupos de archivos predefinidos Una base de datos comprende un grupo de archivos primario y varios grupos de archivo definidos por el usuario. sin embargo. Todas las tablas del sistema se asignan en el grupo de archivos primario. debe adherir a las reglas siguientes: — Un archivo o grupo de archivos no puede ser usado por más de una base de datos. Los grupos de archivos definidos por el usuario son cualquier grupo de archivos que son específicamente creados por el usuario cuando él o ella están inicialmente creando o posteriormente alterando la base de . Los datos y objetos de la base de datos son distribuidos por los seis archivos. — Un archivo puede ser un miembro de sólo un grupo de archivos. el grupo de archivos primario contiene el archivo de datos primario y cualquier otro archivo que no se pone en otro grupo de archivos. — Registros de transacciones. El grupo de archivos primario sólo se llenará si la bandera de configuración "autogrow" está apagada o si todos los discos que están sosteniendo los archivos en el grupo de archivos primario se quedaron sin espacio. y Data3. las bases de datos no necesitan tener archivos de los datos secundarios. — Archivo Secundario. si su base de datos excede el tamaño del máximo para un solo archivo Windows NT. El grupo de archivos que contiene el archivo primario es el grupo de archivos primario. se deberá encender la bandera de configuración "autogrow" o mover archivos a un nuevo almacenamiento para liberar mas espacio. Reglas para diseñar Archivos y Grupos de archivos Cuando usted diseña archivos y grupos de archivos. Los archivos y grupos de archivos. Data2. Algunas bases de datos podrían ser lo suficientemente grandes para necesitar archivos de datos secundarios múltiples o usar archivos secundarios en unidades de disco separadas para distribuir datos en múltiples discos o para mejorar el rendimiento de la base de datos. — Los datos y la información de registro de transacción no pueden ser parte del mismo archivo o grupo de archivos. una base de datos más compleja puede crearse con un archivo primario y cinco archivos secundarios. y cuatro archivos de registro adicionales contienen la información del registro de transacciones.16-146 — Archivo Primario.ndf. los archivos que ventas. Una tabla puede crearse entonces específicamente en el grupo de archivos fgroup1. La misma mejora de rendimiento puede lograrse con un solo archivo creado sobre un arreglo redundante de discos independientes (RAID). Si el grupo de archivos primario se queda sin espacio. Cada base de datos tiene un archivo de los datos primario. Cuando una base de datos se crea. ninguna información nueva del catálogo puede agregarse a las tablas del sistema. ayudan a agregar nuevos archivos fácilmente a los nuevos discos. Estos archivos mantienen la información del registro que se usa para recuperar la base de datos. Las consultas sobre los datos de la tabla se extenderán por los tres discos y se mejorará el rendimiento. Por ejemplo. tres archivos (Data1. Estos archivos mantienen todos los datos que no caben en el archivo de los datos primario. — Los archivos de registro de transacciones nunca son parte de un grupo de archivos. Debe haber por lo menos un archivo de registro para cada base de datos. Alternativamente. Este archivo contiene la información de arranque para la base de datos y es usado para almacenar datos.ndf que contienen datos y objetos de la base de datos de ventas no pueden ser usados por cualquier otra base de datos. Por ejemplo. Los grupos de archivos agrupan archivos para propósitos administrativos y de ubicación de datos.mdf y ventas. Una base de datos simple puede crearse con un archivo primario que contiene todos los datos y objetos y un archivo de registro que contiene la información del registro de transacciones.

como CREATE INDEX. se asignan al grupo de archivos predefinido. Registros de transacciones Una base de datos en SQL Server 2000 tiene por lo menos un archivo de datos y un archivo de registro de transacciones. el archivo primario contendrá sólo tablas y objetos del sistema. un grupo de archivos puede ser designado como el grupo de archivos predefinido. el registro de transacciones registra. Cuando se crean objetos en la base de datos sin especificar a que grupo de archivos pertenecen. Los datos y la información del registro de transacciones nunca es mezclada en el mismo archivo. Para algunas operaciones pesadas. El registro de transacciones es un registro serial de todas las modificaciones que han ocurrido en la base de datos así como de las transacciones que realizaron dichas modificaciones. — Ponga las tablas fuertemente accedidas y los índices no-agrupados que pertenecen a esas tablas en grupos de archivos diferentes. sin embargo. El archivo de registro de transacciones graba el comienzo de cada transacción y archiva los cambios producidos en los datos. El SQL Server usa el registro de transacciones de cada base de datos para recuperar transacciones. y archivos individuales son sólo por una única base de datos. usted debe intentar adherir a las pautas siguientes para usar archivos y grupos de archivos: — La mayoría de las bases de datos trabajará bien con un solo archivo del datos y un solo archivo de registro de transacciones. Cuando usted cambia el grupo de archivos predefinido. Si un grupo de archivos definido por el usuario se llena. La asignación para los objetos y tablas del sistema. Este procedimiento mejorará el rendimiento debido al I/O paralelo si los archivos se localizan en discos físicos diferentes. — Para maximizar rendimiento. Este registro tiene bastante información para deshacer las modificaciones (si es necesario) que hizo durante cada transacción. se mantiene en el grupo de archivos primario y no en el nuevo grupo de archivos predefinido. los hechos a los que la operación dio lugar. Este procedimiento mejorará el rendimiento al tomar ventaja del procesamiento paralelo de input/output del disco (I/O) al buscar datos vinculados. y ubicar grandes objetos que compiten por espacio en grupos de archivos diferentes. Inicialmente. De esta manera. — Use grupos de archivos para habilitar la colocación de objetos en discos físicos específicos. usted puede crear archivos o grupos de archivos en tantos discos físicos locales disponibles como sea posible. Los grupos de archivos predefinidos deben ser suficiente grandes para almacenar cualquier objeto no asignado a un grupo de archivos definido por el usuario. cualquier objeto que no tiene un grupo de archivos especificado se asigna a los archivos de los datos en el nuevo grupo de archivos predefinido cuando se crea. — No ponga el archivo de registro de transacciones en el mismo disco físico con los otros archivos y grupos de archivos. En cualquier momento. El registro de transacciones graba la asignación y liberación de las páginas y la grabación definitiva (commit) o la vuelta atrás (rollback) de cada transacción. en cambio. — Ubique las diferentes tablas que se usan para una misma consulta en grupos de archivos diferente. Recomendaciones Al implementar una base de datos. Este capacidad permite al SQL Server rehacer (Rollup) o deshacer (Rollback) cada transacción de las siguientes maneras: . — Si usted usa archivos múltiples. Cambiar el grupo de archivos predefinido previene que objetos del usuario que no se crean específicamente en un grupo de archivos definidos por el deban competir con los objetos y tablas del sistema para el espacio de los datos.17-146 datos. El registro crece continuamente tanto como operaciones ocurran en la base de datos. el grupo de archivos primario es el grupo de archivos predefinido. se afectarán sólo las tablas de los usuarios específicamente asignadas a ese grupo de archivos. Los grupos de archivos predefinidos pueden ser cambiados usando la sentencia ALTER DATABASE. cree un segundo grupo de archivos para los archivos adicionales y configúrelo como el grupo de archivos predefinido.

previo a entrar en datos no deseados) o a un punto de falla. cuanto más grande es la base de datos. Si encuentra archivos de registro de transacciones que indican que un CREATE INDEX fue ejecutado. la base de datos está en el mismo estado que estaba en el momento en que el registro de transacciones fue copiado. . A un punto de salvaguarda. usted podría determinar que el tamaño estimado de la base de datos es demasiado grande para ser implementada en su organización y que requiere mayor normalización. sin embargo: el número de usuarios o sesiones coexistentes. y el espacio del disco duro y su configuración. Hay otros factores determinantes. Debido a que en un punto de salvaguarda se obliga a que todas las páginas modificadas sean efectivamente grabadas en el disco.18-146 — Una transacción es rehecha cuando se aplica un registro de transacciones. productos. — Una transacción se deshace cuando una transacción queda incompleta por alguna causa. El SQL Server copia la imagen posterior a cada modificación de la base de datos o vuelve a ejecutar sentencias como CREATE INDEX. este representa el punto que se toma como punto de inicio para el comienzo de las operaciones de recuperación. el SQL Server asegura que se han grabado en el disco todos los archivos de registro de transacciones y las páginas de la base de datos que se modificaron. estime el tamaño de cada tabla individualmente y sume dichos valores. no hay ninguna necesidad de rehacer algo que se hizo antes del punto de salvaguarda. mayores son los requisitos de hardware. el registro de transacciones. para una gran corporación. Al final de este proceso. El diseño de la base de datos siempre debe tomar en cuenta la velocidad del procesador. el tamaño de la memoria. Estimar el Tamaño de una base de datos Al diseñar una base de datos. qué tipo de índices. Recíprocamente. una transacción necesita ser rehecha sólo si no se conoce si todas las modificaciones de datos de la transacción fueron realmente transferidas desde el caché de SQL Server al disco. e informaciones de los clientes frecuentemente analizados. Éstos imágenes previas Ye inversiones del comando CREATE INDEX son aplicados en orden inverso a la secuencia original. Estas acciones se aplican en el mismo orden en la que ellas ocurrieron originalmente. Dado que para todas las páginas modificadas antes del punto de salvaguarda se garantiza que están en el disco. Para estimar el tamaño de una base de datos. El SQL Server copia la imagen previa de todas las modificaciones a la base de datos desde el BEGIN TRANSACTION. realiza operaciones que lógicamente invierten la sentencia. Las copias de respaldo del registro de transacciones le permiten a usted que recupere la base de datos al momento de un punto específico (por ejemplo. Las copias de respaldo del registro de transacciones deben ser tenidas muy en cuenta dentro de su estrategia de recuperación de bases de datos. el tamaño estimado podría ser más pequeño que el esperado. y los tipos de operaciones a realizar sobre la base de datos. en este caso. El tamaño de una tabla depende si la tabla tiene o no índices y. usted podría necesitar estimar cuán grande será la base de datos cuando este llena de información. Por ejemplo. Estimar el tamaño de la base de datos puede ayudarle a determinar la configuración del hardware que usted necesitará para alcanzar los siguientes requisitos: — Lograr el rendimiento requerido por sus aplicaciones — Asegurar la cantidad física apropiada de espacio en disco para guardar los datos y índices Estimar el tamaño de una base de datos también puede llevarlo a determinar si el diseño de la base de datos necesita mayor refinamiento. Durante cada proceso de recuperación de base de datos. que ocurre cuando el SQL Server se reinicia. Por ejemplo. permitiendo denormalizar en cierto grado la base de datos para mejorar el rendimiento de las consultas. se necesitará más memoria y procesadores más rápidos para levantar en memoria grandes volúmenes de datos del almacén de datos y procesar mas rápidamente las consultas. Ambiente Generalmente. una base de datos que contiene datos de la biblioteca escolar con escasos niveles de actualización generalmente tendrá requisitos de hardware más bajos que un almacén de datos de un-terabyte que contiene ventas. Aparte de los requisitos de almacenamiento de disco.

Un sistema de seguridad sólido asegura la protección de datos. — Haga copias de respaldo de su instalación actual de Microsoft SQL Server si usted está instalando SQL Server 2000 en la misma computadora. Antes de ejecutar el instalador de SQL Server 2000. desactive el NetBIOS en todas las tarjetas de la red privada antes de ejecutar el instalador de SQL Server.exe o Regedt32. cree uno o más cuentas de usuario del dominio si usted está instalando SQL Server 2000 en una computadora con Windows NT o Windows 2000 y quiere que SQL Server 2000 se comunique con otros clientes y servidores. Instalación de SQL Server Aunque la instalación de SQL Server está más allá del alcance de este Kit de Entrenamiento. usted debe asignar los permisos apropiados a la cuenta de usuario de dominio. — Si usted está instalando un failover cluster.19-146 Diseño físico de la base de datos El subsistema de entrada/salida (motor de almacenamiento) es un componente importante de cualquier base de datos relacional. por otra parte. Usted debe iniciar el sistema operativo bajo una cuenta de usuario que tiene permisos locales de administrador. Seguridad Una base de datos debe tener un sistema de seguridad sólido para controlar las actividades que pueden realizarse y determinar qué información puede verse y cuál puede modificarse. La fase de la autenticación identifica al usuario que está usando una cuenta .exe). — Identifique los individuos y grupos en la compañía. como el Internet Information Server. Esté seguro de cerrar todos los servicios dependientes sobre SQL Server (incluso cualquier servicio que usa ODBC. o si usted está personalizando el juego de caracteres o la configuración del ordenamiento de los caracteres. Además. o IIS). — Combine las dos listas para identificar qué usuarios pueden ver qué conjuntos de datos y qué actividades pueden realizar sobre la base de datos. — Si usted está usando un sistema operativo que tiene configuraciones regionales diferentes a inglés (Estados Unidos). Niveles de seguridad Un usuario atraviesa dos fases de seguridad al trabajar en SQL Server: la autenticación y autorización (aprobación de los permisos). Una aplicación de base de datos exitosa normalmente requiere una planificación cuidadosa en las fases tempranas de su proyecto. usted siempre debe tener en cuenta lo siguiente antes de realizar una instalación: — Esté seguro que la computadora reúne los requisitos de sistema para SQL Server 2000. — Cómo se van a configurar apropiadamente todos los parámetros de configuración para que la base de datos funcione correctamente. sin tener en cuenta cómo los usuarios obtienen el acceso a la base de datos. — Repase todas las opciones de instalación de SQL Server y este preparado para hacer las selecciones apropiadas cuando ejecute el instalador. Usted debe seguir siguientes los pasos para desarrollar un plan de seguridad: — Liste todas los items y actividades en la base de datos que debe controlarse a través de la seguridad. revise los temas referidos a la configuración de colecciones. El motor de almacenamiento de una base de datos relacional requiere de esta planificación que incluye a lo siguiente: — Qué tipo de hardware de disco será utilizado — Cómo distribuye sus datos en los discos — Qué diseño de índices se va a utilizar para mejorar el rendimiento de las consultas. Planificar la Seguridad Un plan de seguridad identifica qué usuarios pueden ver qué datos y qué actividades pueden realizar en la base de datos. cierre al Windows NT Event Viewer y a los visualizadores de la registry (Regedit.

— Identificar cómo se usarán los datos en la nueva base de datos. sin embargo: el número de usuarios o sesiones coexistentes. — Identificar cualquier regla comercial que se utilizará en el sistema. Datos y la información del registro de transacciones nunca se mezclan en el mismo archivo. Hay otros factores determinantes. el usuario se conecta a una instancia de SQL Server. usted podría necesitar estimar cuán grande será la base de datos cuando este llena de información. Todos los datos y objetos de la base de datos. se deben tener en cuenta varios factores. dentro del registro de transacciones. y vistas. y cómo se usan actualmente. y los archivos individuales son utilizados por solo una base de datos. que incluyen los archivos de la base de datos y grupos de archivos. Una base de datos debe tener un sistema de seguridad sólido para controlar las actividades que pueden o no realizarse y determinar qué información puede verse y cuál puede modificarse. y el espacio del disco duro y su configuración. Resumen del tema Al diseñar una base de datos SQL Server. El modo de Autenticación de Windows le permite a un usuario que se conecte a través de una cuenta de usuario Windows NT 4. El usuario necesita entonces permisos para acceder a las bases de datos en el servidor. lo que se obtiene concediendo acceso a una cuenta en cada base de datos (asociadas al inicio de sesión del usuario). secundarios. El grupo de archivos que contiene el archivo primario es el grupo de archivos primario. como tablas. La validación de los permisos permite controlar las actividades que el usuario puede realizar en la base de datos SQL Server. usted debe tener en cuenta varios problemas. — Identificar los tipos de datos que manejará la base de datos. la instalación del SQL Server y su ambiente operativo.0 o Windows 2000 pueden hacer uso de conexiones de confianza en el modo de Autenticación de Windows o en el modo mixto. MODULO I Tema 4: Identificar los requerimientos de diseño Lo que aprenderá: Al terminar este tema usted podrá: — Identificar las metas y el alcance de un proyecto de base de datos. Al instalar SQL Server. y los tipos de operaciones a realizar sobre la base de datos Al diseñar una base de datos. Los grupos de archivos agrupan archivos para propósitos administrativos y de ubicación de los datos. la memoria. el registro de transacciones.20-146 de inicio de sesión y verifica sólo su capacidad para conectarse a un instancia de SQL Server. el crecimiento esperado. Los usuarios que se conectan a través de una cuenta del usuario Windows NT 4. se guardan dentro de los archivos primario. Una base de datos en SQL Server 2000 tiene al menos un archivo de datos y un archivo de registro de transacciones. la cantidad actual de datos. Modos de autenticación El SQL Server puede operar en uno de dos modos de seguridad (autenticación): la Autenticación de Windows y el modo Mixto. y la seguridad. . procedimientos almacenados.0 o Windows 2000. Si la autenticación tiene éxito. registros de transacciones. El SQL Server usa el registro de transacciones de cada base de datos para recuperar transacciones. desencadenadores. El modo mixto (Autenticación de Windows y Autenticación de SQL) le permite a los usuarios que conecten a una instancia de SQL Server usando Autenticación de Windows o Autenticación de SQL Server. Un diseño de seguridad identifica qué usuarios pueden ver qué datos y qué actividades pueden realizar sobre la base de datos. El diseño de la base de datos siempre debe tomar en consideración la velocidad de procesador.

usted debe tener conocimiento completo y profundo del trabajo que se espera que la base de datos haga.1 ilustra el proceso de identificar los requerimientos de diseño. y la forma en que ellos se definen puede variar grandemente de recurso a recurso (sin que un método sea necesariamente es el más correcto). El número de pasos incluidos en este proceso. Por ejemplo. cómo estos pasos se definen. Uno de las metas declaradas de la compañía para el proyecto es "para hacer mas fácil manejar el inventario. Identificar las Metas del Sistema Diseñar una base de datos requiere de un entendiendo de las funciones comerciales que usted quiere soportar. Determinar las metas del sistema no siempre es un proceso directo. Según el propósito de este kit de entrenamiento. usted debe determinar las metas del nuevo sistema. ¿Por qué está creando usted esta base de datos? Las metas del sistema son las razones por las qué usted está implementando la nueva base de datos. Es significativamente costoso en tiempo tratar de cambiar el diseño de una base de datos una vez que se ha implementado. Tanto como sea posible. La Figura 4. Para crear un diseño de base de datos eficaz. una compañía industrial podría decidir automatizar su proceso de administración de inventario. En otras palabras. Por ejemplo. La mayoría de los proyectos de desarrollo de bases de datos tienen muchas metas (tangibles e intangibles). y intentar descubrirlos puede tomar a menudo una cantidad importante de trabajo de investigación. Sin esta comprensión.21-146 El Proceso de Identificar los Requerimientos de diseño El proceso de identificar los requerimientos del sistema incluye una variedad de pasos. Figure 4. Una base de datos bien diseñada obtiene el mayor rendimiento." . usted no puede tomar decisiones informadas sobre cómo la base de datos debe ser diseñada. Al diseñar una base de datos. usted podría determinar cómo se usarán los datos y qué restricciones deben asociarse a dichos datos. este proceso ha sido dividido en cuatro tareas primarias: — Identificar la metas del sistema — Identificar la cantidad y los tipos de datos — Identificar cómo se usarán los datos — Identificar las reglas comerciales Usted necesariamente no tiene que realizar esta una tarea por vez. su diseño de la base de datos debe modelar el negocio con precisión. usted debe considerar el propósito de la base de datos y cómo este afecta el diseño.1 Identificar los requerimientos del sistema. mientras identifica la cantidad y los tipos de datos.

su labor podría ser un poco más difícil porque podría tener que gastar una importante cantidad de tiempo en determina qué tipos de datos se guardarán y cuánto datos habrá. Sin embargo. y cualquier otro documento que está usándose actualmente. Aunque estas metas son más tangibles. las metas intangibles pueden ser difíciles de traducir en metas más tangibles. Si la meta es aumentar productividad.22-146 Su trabajo es tomar esta meta intangible y intentar determinar la meta tangible subyacente. Al determinar que hasta que punto una medida base debe ser estudiada." En estos casos. si una meta de la base de datos de inventario es mejorar la exactitud. o uno que radicalmente altera el trabajo. A menudo para determinar una meta mensurable. de los peligros que se presentan al medir ciertas metas. Usted también podría descubrir. ¿Quiere la compañía acelerar el proceso de administración del inventario? ¿Quiere rastrear inventario más con precisión? ¿Quiere reducir costos? La meta intangible de "haciéndolo más fácil" podría incluir todos éstas metas más tangibles y algunas otras. Usted debe ser consciente. En muchos casos. usted puede continuar determinando el tipo y la cantidad de datos que el sistema soportará. ellas todavía son vagas. que algunas metas son inalcanzables o impropias. usted debe determinar el grado al que estas metas deben lograrse. como facturas de venta. los informes de dirección. Cuando los proyectos avanzan. Un estudio de esta clase podría abarcar años de historia del inventario y quizás podría costar más que diseñar e implementar cabo la base de datos. como "aumento de productividad" o "mejora del rendimiento" Cuando usted pasa por el proceso de identificar metas. sus metas deben ser directamente mensurables. los listados de inventario. La cantidad de datos. cuando usted avance con el proceso de diseño de la base de datos. Las metas vagas tienden a ser declaradas términos generales. Por ejemplo. usted debe tener presente la balanza del proyecto y su aplicación práctica manteniendo siempre un sentido de proporción. Identificar la Cantidad y Tipos de Datos La cantidad y tipos de datos que su base de datos guardará pueden afectar el rendimiento de la base de datos y debe tenerse en cuenta al crear su base de datos. los requerimientos comerciales cambian. lo cual significa que el diseño de la base de datos podría necesitar ser modificado. Como resultado. la meta declarada podría ser algo que no parece tener ningún significado o relevancia: "Nosotros queremos el nuevo sistema para mostrar a nuestros clientes que estamos pensando de manera innovadora y siguiendo la tendencia de ellos. podría ser mejor hablar primero con gerentes y tenedores de libros para lograr un sentido general de donde están los problemas y lo que puede hacerse para resolverlos. Siempre que sea posible. Dado que surgen nuevas comprensiones y nueva información a ser administrada. Por ejemplo. usted debe intentar determinar el grado en que esas metas deben lograrse. deberá estar preparado para reevaluar estas metas. sin embargo. podría consumir muchos recursos estudiar cuánta inexactitud existe en el proceso actual. usted puede examinar el cuerpo de datos que ya existen. Después de que usted ha definido las metas iniciales para la nueva base de datos. afecta el tamaño de su base de datos. En estas situaciones. la dirección cambia. y los tipos de datos son un factor que determina los tipos de restricciones que se incorporarán al diseño de la base de datos. cuando usted excava más profundamente en el proyecto. usted debe prepararse a actuar de acuerdo con esto. Usted podría necesitar entrevistar a los participantes importantes y coleccionar copias de documentos pertinentes y formas. por supuesto. usted debe trabajar estrechamente con la organización para definir eso claramente que significan las metas declaradas. usted debe poder establecer una medida inicial. Esta situación es particularmente cierta para metas que adoptan la jerga del mercadeo popular. En los casos en los que usted está llevando a cabo un nuevo sistema. las metas evolucionan. A veces. . para así mejorar el posicionamiento del producto. En casos como éstos. y se revisan las expectativas de la compañía. determinar la cantidad y tipos de datos es un proceso directo porque un sistema antiguo ya se encuentra funcionando y usted simplemente está actualizando o reemplazando ese sistema.

La información del cliente podría incluir nombres. usted tendrá que definir la concurrencia de los usuarios. Cuando usted determina quién estará usando los datos. mientras otra categoría podría contener a 100. usted debe pensar en términos de categorías de usuarios. debe identificar la cantidad actual de datos y su modelo de crecimiento. direcciones. Otro almacén podría llevar millones de artículos pero podría planear agregar sólo unos nuevos artículos al día y nunca permitir que el inventario vaya mucho más allá de su capacidad actual. Por ejemplo. Al mirar los tipos de datos. Usted está intentando ganar un sentido general de los tipos de datos involucrados y creando una lista centralizada para esos tipos de datos. Cuando usted empiece a identificar realmente los objetos de la base de datos. usted tomará la información que recogió aquí y la usará para desarrollar un modelo de datos. Identificar Cómo se usarán los Datos Cuando usted recoge los requerimientos del sistema. los tipos de datos podrían incluir información sobre clientes que compran productos de la tienda. usted está básicamente intentando conseguir un sentido general de las categorías de información que usted estará guardando y qué detalles sobre las categorías son necesarios guardar. el diseño variará. Al determinar quién estará usando los datos. usted debe determinar cómo se usará la información en su base de datos. si usted está desarrollando una base de datos para un minorista de la ropa. No hay ningún mínimo fijo o número del máximo de usuarios que cada categoría debe contener.000 usuarios. deben poder ver los datos del inventario para hacer los pedidos. Por ejemplo. Identificar las Reglas Comerciales del Sistema . y incluso las preferencias de estilo. A estas alturas en el proceso del diseño. pero podría estar planeando agregar varios centenar al día durante los próximos años para aumentar la artículos disponibles en el stock. usted debe identificar las tareas que ellos estarán realizando cuando acceden a la base de datos. Además. Una vez que ha definido quiénes y cuántos son sus usuarios. Cuando examine el volumen de datos. Usted debe saber que cuántas personas se conectarán a la vez a la base de datos y cuántos podría estar intentando actualizar simultáneamente la base de datos. La compañía también podría incluir una categoría de usuarios de recursos humanos. Las únicas limitaciones son aquellas dictadas por configuraciones del hardware y diseño de la base de datos. mientras otras organizaciones podrían tener muchos tipos. El grupo de recursos humano debe poder ver y actualizar información del empleado.23-146 Usted debe determinar el volumen de datos que el sistema manejará. usted podrá llevar a cabo un diseño de la base de datos que satisface las necesidades de todos en la organización. y como resultado. Los modelos de crecimiento para estos dos sistemas son muy diferentes. también. un almacén podría llevar sólo unos mil artículos actualmente. usted puede determinar cómo será accedida la base de datos y cómo se verán y manipularán los datos. Una categoría podría contener a sólo un usuario. Este grupo de tomadores de ordenes deben poder acceder y actualizar información del cliente. usted no tiene que ponerse demasiado específico sobre cómo deben categorizarse los datos o deben agruparse. Por ejemplo. Por ejemplo. una categoría de usuarios podría ser el público general (quién accede a los datos a través del Internet). Cuando usted combina esta información con el número y tipo de usuarios. usted también debe identificar cuántos usuarios en cada categoría estarán accediendo a los datos. Esta estimación no sólo debe incluir los números actuales pero los valores proyectados. y las tareas que ellos estarán realizando cuando accedan ese datos. el número de usuarios que estarán accediendo a los datos. Además. números de teléfono. Identificando estas tareas. El propósito de este paso es identificar quién estará usando los datos. Usted también podría tener otra categoría de usuarios que acceden datos a través del intranet de la compañía. suponga que una compañía industrial incluye una categoría de usuarios que toman órdenes de clientes. Este proceso lo preparará por exponer las entidades y atributos que usted incorporará en su diseño de la base de datos. Algunas organizaciones podrían tener sólo un tipo de usuario.

algunas que pertenecen en conjunto al sistema y otras que pertenecen a los tipos específicos de datos. Usted debe considerar el propósito de la base de datos y cómo afecta el diseño. — Definir restricciones en los datos. cada categoría de tipo de dato se traduce en un objeto tabla dentro de la base de datos. Identificar Entidades y Sus Atributos Cuando se recogen los requisitos del sistema para al diseño de la base de datos. MODULO I Tema 5: Desarrollar el Modelo Lógico de Datos Lo que aprenderá: Al terminar este tema usted podrá: — Identificar entidades y sus atributos. Hay normalmente. usted debe determinar la cantidad real de datos y su modelo de crecimiento. Las reglas comerciales pueden incluir un amplio espectro de restricciones. usted debe determinar el volumen de datos que el sistema manejará. Usted debe tener una comprensión clara de por qué usted está creando esta base de datos. y las tareas que ellos estarán realizando sobre esos datos. Estas restricciones se refieren van más allá que la integridad individual de los atributos de la entidad. usted estará determinando las reglas comerciales que gobiernan cómo deben manejarse y protegerse los datos. Cuando usted recoge requerimientos del sistema. usted debe identificar las metas de su proyecto de base de datos. surgen los objetos relacionados. Ellos le permiten definir lo que cada categoría de usuarios puede y no puede hacer. el tipo y cantidad de datos con los que usted estará trabajando. Las reglas comerciales son mucho más amplias e incorporan todas las restricciones del sistema. Sin embargo. usted está intentando conseguir un sentido general de las categorías de información que básicamente se estarán guardando y qué detalles sobre las categorías son necesarios guardar. Las reglas comerciales incluyen tanto la integridad de los datos así como la seguridad del sistema. Al mirar los tipos de datos. usted debe identificar quién estará usando los datos. uno de los pasos que se realizan es el de definir los tipos de datos que contendrá la base de datos. y cualquier restricción comercial que deberá existir sobre los datos. un conjunto de objetos primarios. Cuando examina el volumen de los datos. y después de que ellos son identificados. Pueden separarse estos tipos de datos en categorías que representan una división lógica de información. Otra área de preocupación cuando se están identificando los requerimientos del sistema es la cantidad y tipo de datos que su base de datos almacenará. Volviendo al ejemplo de la compañía industrial.24-146 Al identificar las reglas comerciales. Resumen del tema Antes de que usted pueda desarrollar a un modelo del datos. Cualquier sea el sistema actual. En la mayoría de los casos. En otras palabras. incluidas la integridad de los datos y la seguridad del sistema. Al identificar las restricciones sobre los datos. usted está definiendo lo que cada categoría de usuarios puede o no puede hacer. Usted también podría determinar que ningún archivo del cliente puede crearse sin que se complete la dirección de envío y el número de teléfono. usted podría determinar que estos usuarios no deben poder actualizar datos del inventario y no deben poder ver datos de los empleados. cómo se usarán esos datos. Otra restricción podría ser que cualquier artículo agregado a un orden del cliente debe quitarse del inventario. — Identificar relaciones entre las entidades. el grupo de tomadores de órdenes pueden acceder y actualizar registros de los clientes y ver los datos de inventario. usted está determinando las restricciones que gobiernan cómo deben manejarse y protegerse los datos y el sistema. el número de usuarios que estarán accediendo a los datos. .

identifica varias categorías de datos. incluido los cuartos. Figura 5. uno de los objetos primarios es la tabla Titulos. y reservaciones. Se discuten relaciones con más detalle adelante en este tema. usted determinó que el hotel tiene ocho tipos de cuartos y que los huéspedes regulares prefieren un cierto tipo de cuarto. Ahora. Al identificar las reglas comerciales para este sistema.1. Otro objeto es la tabla TituloAutor que vincula a los autores con los libros. Durante el proceso de recolección de requisitos de sistema. . Como resultado. tanto la tabla Habitaciones como la tabla Huespedes deberán incluir un atributo de tipo de cuarto.25-146 Por ejemplo. Antes de que usted pueda completar el proceso de definir objetos de la tabla dentro de la base de datos. Después de que usted ha definido todas las tablas que puede definir a estas alturas. como se muestra en la Figura 5. huéspedes. agrega tablas a su diseño de la base de datos que representan a cada una de estas categorías. Por ejemplo. tendrá que agregar una tabla de unión. suponga que usted está diseñando una base de datos para el sistema de reservaciones de un hotel. la tabla Reservas. Figura 5. en la base de datos Editores. debe definir las relaciones entre las tablas. Usted decide crear una tabla para los tipos del cuarto. Usando las categorías de datos definidas en los requisitos del sistema. Como resultado. puede definir las columnas (atributos) para esas tablas. se puede empezar a crear un mapa del objeto tabla dentro de la nueva base de datos. ante un cambio en los tipos de cuarto. usted puede actualizar la información en un solo lugar. De nuevo. Uno de los objetos relacionado a la tabla Títulos es la tabla de RoyAgenda que proporciona información sobre la agenda de royalties asociada con cada libro. y la tabla Huespedes. Siempre que identifique una relación muchos-a-muchos.2. la tabla Habitaciones y la tabla Huespedes referencian a la tabla TipoHab sin tener que repetir una descripción del cuarto para cada cuarto y cada huésped. usted estará tomando esta información directamente de los requisitos del sistema en los que identificó qué tipos de datos deben ser incluidos en cada categoría de información. Además.2 La base de datos de reservaciones del hotel que incluye la tabla de TipoHab. en lugar de tener que actualizar múltiples tablas y archivos.1 Los objetos primarios en un diseño de la base de datos: la tabla Habitaciones. como se muestra en Figura 5.

3 muestra la tabla Huespedes con todas las columnas que contendrá la tabla. La Figura 5. huéspedes.26-146 Usando el ejemplo de base de datos del hotel. podría descubrir que necesita modificar el diseño que ha creado. apellido. A través de este proceso. tal como con cualquier entidad normalizada. y preferencias del cuarto. y reservaciones son las categorías de datos. Figura 5. Advierta que una relación también existe entre la tabla Habitaciones y la tabla TipoHab y entre la tabla Huespedes y la tabla TipoHab. La Figura 5. Los cuartos. asuma que los requisitos del sistema indican que todas las reservaciones deben incluir cuarto e información del huésped. Como resultado. usted debe definir las relaciones entre las tablas. Identificar Relaciones Entre las Entidades Después de que ha definido las tablas y sus columnas. Figura 5.4 Las relaciones que existen entre las tablas en la base de datos de las reservaciones del hotel. Usted también planea agregar un identificador único para cada huésped. usted planea agregar columnas a la tabla de los Huespedes para cada uno de estos tipos de información. . Siguiendo con el ejemplo del hotel. Empiece escogiendo una de las tablas primarias y seleccionando las entidades que tienen relaciones con esa tabla. Una línea que conecta las dos tablas significa una relación. Como resultado.3 La tabla Huespedes y sus atributos. número de teléfono. suponga que determinó durante el proceso de recolección de requisitos del sistema que la categoría Huespedes debe incluir información la siguiente información sobre los huéspedes: nombre.4 muestras las relaciones entre estos objetos. dirección. usted puede deducir que una relación existe entre los cuartos y reservaciones y entre los huéspedes y reservaciones.

una reservación puede solicitar uno o más cuartos.4. El mayor trabajo ya fue completado cuando usted identificó las reglas comerciales al momento de recoger los requisitos del sistema. y el símbolo de infinito se refiere al lado muchos de una relación uno-a-muchos. y formularlas de modo que se refieran a ellos. y las relaciones entre entidades. cada relación (línea) es marcada a cada extremo (donde conecta a una tabla) con el número 1 o con un símbolo de infinito (8). una relación existe entre la tabla Huespedes y la tabla Reservas. su enfoque se centrará en las restricciones sobre los datos. Volviendo al diseño de la base de datos de la Figura 5. Debe intentar organizar las restricciones en base a los objetos que creó en la base de datos.27-146 Una vez que establece que una relación existe entre las tablas. Según las reglas comerciales. La relación existe porque los huéspedes son parte de la información que se recaba cuando se registra una reservación. incluida la integridad de los datos y la seguridad del sistema. Según las reglas comerciales. sin embargo. Para determinar los tipos de relaciones que existen entre las tablas." Al definir las . usted debe identificar las restricciones sobre los datos que se guardarán en las tablas. En un diseño de base de datos normalizado. Algunos autores también las llaman relaciones 1:N. existe una relación muchos-a-muchos: muchas reservaciones a muchos cuartos. normalmente la persona que está haciendo la reservación. Identificar Restricciones sobre los Datos A estas alturas del proceso de diseño de la base de datos. sus atributos.5 La tabla de HabReservas como tabla de unión entre la tabla Habitaciones y la tabla Reservas. pero no es obligatorio. Como se vio. incluir una preferencia por uno de los tipos de cuarto predefinidos pero no puede incluir ninguna otra preferencia de tipo de cuarto. Usted tomará las reglas comerciales relacionadas a los datos y las refinará y organizará. las reglas comerciales incluyen todo las restricciones en un sistema.5. usted debe mirar los tipos de datos que cada tabla contiene y los tipos de conexiones entre ellos. Para esta fase del proceso de diseño. pero cada reservación grabada puede incluir solo el nombre de un huésped. Una relación también existe entre la tabla Reservas y la tabla Habitaciones. En este caso. Por ejemplo. Figura 5. Ahora. suponga que una de las reglas comerciales indica: "Un registro de huésped puede. un huésped puede hacer una o más reservaciones. Como resultado. usted debería tener definidas las entidades. una relación uno-a-muchos existe entre las dos tablas: un huésped. El 1 se refiere al lado uno de una relación. En la Figura 5. una o muchas reservaciones. relaciones muchos-a-muchos deben ser modificadas agregando una tabla de unión y creando una relación uno-amuchos entre cada tabla original y la tabla de unión. como se muestra en la Figura 5.5. usted debe definir el tipo de relación. y un cuarto puede ser incluido en una o más reservaciones (en fechas diferentes).

y relaciones entre entidades que constituyen la base de datos. Empleados.28-146 restricciones sobre los datos. Para consistencia. deberá guardar el resultado para los ejercicios subsecuentes. a más de una tabla. usted puede transferir luego su modelo a un programa del dibujo. La meta de identificar las restricciones sobre los datos es tener un mapa claro del camino para cuando se creen los objetos de la base de datos y sus relaciones que fuerce la integridad de los datos MODULO I Ejercicio 2: Desarrolle un Modelo Lógico de Datos En este ejercicio. una restricción se aplica al conjunto de una tabla. En cuanto sea posible. usted puede modificar el diseño de la base de datos cuando usted identifica relaciones entre tablas y restricciones sobre los datos. Cada categoría representa uno de los objetos tabla primarios en su diseño de la base de datos. Ponga las tablas en un modo que le permita dibujar las relaciones entre las tablas. — Todo valor distinto de NULL en la columna de TipoHabID en la tabla Huespedes debe ser un valor incluido en la columna de TipoHabID en la tabla de TipoHab. Dibuje una tabla para cada categoría de datos. 4. Clientes. diseñar una base de datos se pone un poco más complicado. Para realizar este ejercicio. Su dibujo debería incluir cinco tablas. Para identificar qué tablas agregar a una base de datos 1. Recuerde. Refiérase a los requisitos de diseño que usted desarrolló para el caso de la tienda de libros y apunte las categorías de datos. Esencialmente. Etiquete cada tabla con el nombre de cada una de las categorías. Si lo desea. Una buena fuente para determinar las relaciones entre tablas es la lista de reglas comerciales que usted identificó cuando usted recogió los requisitos de diseño. usted se entrenará en los pasos necesarios para crear un modelo lógico de datos. Fíjese que hay cuatro subcategorías de información: la condición de un libro. Usted agregará los nombres de la columna y definirá las relaciones mas adelante en este ejercicio. Este ejercicio involucra dibujar las tablas. usted está buscando subcategorías de información o reglas de negocio que lo llevan a creer que son necesarias tablas adicionales. . — Una fila en la tabla de los Huespedes puede incluir sólo un valor en la columna de TipoHabID. intente organizar las restricciones de modo que sea lógica y más pertinente al proyecto. papel y un lápiz es todo que usted realmente necesita. Su próximo paso será identificar cualquier tabla relacionada. Cualquiera que sea el método que usted escoja. y Ordenes. 3. 2. a una relación entre las tablas. En algunos casos. usted debe referenciar las tablas y columnas pertinentes y dividir la regla comercial de modo que cada restricción esté contenida en una instrucción simple: — La columna de TipoHabID en la tabla Huespedes no requiere un valor. usted necesitará papel y un lápiz para escribir las restricciones a los datos. En estos casos. use las etiquetas siguientes para los nombres de las tablas: Libros. Autores. y el estado de la orden. usted usará el caso de la tienda de libros de Ejercicio 1 del Tema 4 de este módulo. usted debe organizar las restricciones sobre los datos según las tablas y sus columnas. Las tablas deben ser lo suficientemente grandes para que usted pueda agregar los nombres de las columnas. Además. la forma de pago. o a la seguridad de los datos. Refiérase a las reglas comerciales en los requisitos de diseño. También puede escribirlos directamente en un documento de un procesador de palabras. Aunque usted puede usar un programa del dibujo como Visio para crear estos objetos. entidades. A estas alturas. la posición del empleado.

FechaEnvio. CP OrdenID. usted no incluirá esta información aquí. Titulo. Dir2. Descripcion ClienteID. También recuerde que cada fila en una tabla debe ser singularmente identificable. Costo. AñoMuerte. AñoNac. Usted podría crear una tabla para guardar esta información. usted normalmente sólo necesitará la columna del identificador de la tabla relacionada. Fíjese que una orden puede contener más de un libro. Agregue nombres a las columnas de cada tabla. Estado. EmpleadoID. LibroID Fíjese que la tabla Clientes no incluye una columna para los libros comprados y fecha de compra. ClienteID. Para cada categoría de datos. Nombre. . Para consistencia. Descripcion AutorID. FechaEd. 7. Agregue una tabla más (OrdenLibros) para rastrear los libros pedidos y las órdenes tomadas a los clientes. Además. Posiciones. PagoID. Descripcion EmpleadosID. 2. Editor. Vendido CondicionID. Apellido. Usted ahora debería tener 10 tablas. en donde los nombres de las columnas se refirieran a información en una tabla relacionada. EstadoDescrip PagoID. usted definió qué información debe ser incluida en cada categoría. Para identificar relaciones entre las entidades 1. EstadoID EstadoID. PagoDescrip OrdenID. y CondicionLibro. Estado. Determine qué relaciones existen entre la tabla Libros y otras tablas en la base de datos. AutorID. Para identificar qué columnas agregar a las tablas 1. Ciudad. Dir1. por lo que algunas tablas podrían necesitar un identificador. FechaIng. Dibuje las cuatro tablas relacionadas para soportar las tablas primarias. Telefono. Para consistencia. Por ejemplo. NombreCond. Dir1. Si necesita. Nombre. Dir2. Ciudad. Apellido. use las etiquetas siguientes para los nombres de las columnas: Tabla Libros LibrosEstado Autores Empleados Posiciones Clientes Ordenes EstadoOrden FormaDePago LibrosOrdenes Columnas LibroID. pero sería innecesario porque reproduciría información que ya existe en la base de datos (información que puede derivarse a través de vistas o consultas). CP. Nombre. Cargo. Dado que cada cliente puede comprar más de un libro. FormaDePago. PosicionID PosicionID. use los nombres siguientes para sus nuevas tablas: EstadoOrden.29-146 5. Monto. Apellido. Refiérase a los requisitos de diseño que usted desarrolló para el caso de la tienda de libro. FechaOrden. 6. Refiérase a las reglas comerciales en los requisitos de diseño. Esta información constituye sus columnas. la tabla Ordenes incluiría una columna de EstadoID que la referencia a la tabla de EstadoOrden. CondicioID. refiérase al caso de la tienda de libro y a los requisitos de diseño que lo ayudarán a determinar qué relaciones existen entre los objetos.

Figura 5.6. 2. Además. Para cada tabla. . Hay también una relación directa entre los datos de Libros y los datos LibrosOrdenes (los órdenes incluyen los libros que se venden). que no hay ninguna relación directa entre las tablas Libros y la tabla Ordenes.30-146 Usted está buscando relaciones directas. Usted podría encontrar que necesita mover algunas de sus tablas para mostrar esas relaciones más claramente.6 Identificar las relaciones entre las tablas en el modelo de lógico datos. Su diseño de la base de datos debe parecer similar al esquema en Figura 5. Por ejemplo. los datos de Autores se relacionan directamente con los datos de Libros (los autores escriben libros). La relación entre las dos tablas es indirecta y se expresa a través de la tabla de LibrosOrdenes. la tabla Libros tiene una relación directa con la tabla LibrosEstado. Fíjese. Los datos de LibrosEstado aplica directamente a los datos de Libros. trace una línea desde esa tabla a cualquier otra tabla con la que exista una relación.

y escriba el símbolo infinito (8) en el extremo "muchos" de la relación. uno-a-muchos. Escriba el número 1 en el extremo "uno" de la relación. Para determinar el tipo de relación. Su base de datos debe parecer similar ahora al esquema en Figura 5.31-146 3. existe una relación entre los empleados y los órdenes que ellos generan. Por consiguiente. ¿Qué relaciones son muchos-a-muchos? . Por ejemplo. Un empleado puede crear muchos órdenes. Figura 5.7. pero una orden es creada por sólo un empleado. 4. Identifique las relaciones muchos-a-muchas en el diseño de la base de datos. Determine si cada relación es uno-a-uno. La tabla Empleados está en el lado "uno" de la relación. o muchos-a-muchos. una relación uno-a-muchos existe entre la tabla Ordenes y la tabla Empleados (un empleado puede crear muchas órdenes). piense en los términos de los datos asociados con cada objeto. y la tabla Ordenes en el lado "muchos".7 Identificar los tipos de relaciones entre las tablas en el modelo de los datos lógico.

32-146 5. Cree que una tabla de la unión llamada LibrosAutores. La tabla debe incluir la columna de AutorID y la columna de LibroID. 6. Anule la relación entre la tabla Libros y la tabla Autores, entonces anule la columna de AutorID en la tabla Libros. Usted está anulando la relación entre las dos tablas porque una relación directa ya no existe. En cambio, una relación indirecta se crea a través de la tabla de LibrosAutores. Además, la columna AutorID no es mas un requisito en la tabla Libros porque la relación libro/autor se expresa en la tabla LibrosAutores. 7. Dibuje la relación entre los Autores y tablas LibrosAutores y la relación entre los Libros y tablas LibrosAutores. 8. Determine los tipos de relaciones que existen con la tabla LibrosAutores. Su diseño de la base de datos debe parecer similar ahora al esquema en Figura 5.8.

33-146 Figura 5.8 Agregar la tabla de LibrosAutores al modelo de datos lógico. Para identificar restricciones en los datos 1. En una hoja de papel, apunte los nombres de cada tabla en su diseño de base de datos. Deje espacio suficiente entre cada nombre de la tabla para escribir las restricciones de los datos. 2. Repase la regla comercial que declara que información del libro se debe incluir: título, autor, costo, precio sugerido, evaluación, y ID único. 3. Identifique el objeto al que esta regla de negocio se aplica. ¿A qué objecto/s aplica esta regla de negocio? 4. Bajo los nombre de la tabla Libros y de la tabla LibrosAutores, escriba las restricciones a los datos que se pueden derivar de la regla comercial. ¿Cuáles son las restricciones a los datos? 5. Para cada regla comercial, defina las restricción a los datos. Donde sea aplicable, escriba las restricciones bajo el nombre de la tabla. Si una restricción no es aplicable específicamente a una tabla, escríbalo en otro espacio en su papel. ¿Cuáles son las restricciones a los datos para su diseño de la base de datos? 6. Repase las restricciones a los datos que usted creó para asegurarse que cada tabla y cada columna dentro de esas tablas tienen alguna clase de regla asociada con él.

MODULO II: Implementar una base de datos y sus tablas Tema 1: Crear y administrar una base de datos SQLServer
El primer paso para implementar físicamente una base de datos es crear los objetos de la base de datos. Usando la información que obtuvo cuando se determinaron los requerimientos de diseño, y los detalles que identificó en el diseño lógico de la base de datos, Ud. puede crear los objetos de la base de datos y definir sus características. Podrá modificar estas características después que haya creado los objetos de la base de datos. Cuando cree una base de datos, deberá primero definir su nombre, su tamaño, y los archivos y grupos de archivos usados para soportarla. Deberá considerar varios factores antes de crear la base de datos: • Por defecto solo tienen permiso para crear bases de datos los miembros de los roles “sysadmin” y “dbcreator”, Ud. podría no tener asignados ninguno de dichos roles pero aún contar con la autorización para crear bases de datos en caso que el administrador se los hubiera otorgado. El usuario que crea una base de datos se convierte en el dueño de la base de datos Un máximo de 32.767 bases de datos pueden ser creadas sobre un servidor. El nombre de la base de datos debe seguir las reglas de los identificadores.

• • •

34-146 Como ya indicamos, se usan tres tipos de archivos para almacenar una base de datos: archivos primarios, que contienen la información de arranque para la base de datos; archivos secundarios, que hospedan a todos los datos que no caben en el archivo primario; y registro de transacciones, que contienen la información de la transacciones, usadas para recuperar la base de datos. Toda base de datos tiene al menos dos archivos: un archivo primario y un registro de transacciones. Cuando se crea una base de datos, los archivos se llenan de ceros para sobrescribir cualquier otro dato que archivos que han sido borrados puedan haber dejado en el disco. Aunque esto significa que los archivos pueden tardar en ser creados, esta acción evita al sistema operativo tener que llenar con cero los archivos al momento de la efectiva grabación de los datos durante la normal operación de la base de datos, mejorando la performance operacional de cada día. Cuando Ud. crea una base de datos, deberá especificar el tamaño máximo que un archivo tiene autorizado a alcanzar. Esto previene que el archivo crezca, cuando los datos son ingresados, hasta que el espacio en disco se termine. SQLServer implementa una nueva base de datos en dos pasos: • SQLServer usa una copia de la base de datos “Model” para inicializar la nueva base de datos y sus metadatos. SQLServer luego llena el resto de la base de datos con páginas vacías (excepto aquellas páginas que tienen grabados datos internos como el espacio usado)

Cualquier objeto definido por el usuario en la base de datos “Model” es copiado a todas las bases de datos que sean creadas. Se pueden agregar objetos a la base de datos “Model”, tales como tablas, vistas, procedimientos almacenados, tipos de datos, etc. que serán incluidos en las nuevas bases de datos. Además, cada nueva base de datos hereda la configuración de la opciones de la base de datos “Model”.

Métodos para crear una base de datos SQLServer
SQLServer provee muchos métodos que se pueden utilizar para crear bases de datos: el comando Transact-SQL CREATE DATABASE, el árbol de la consola del Enterprise Manager, y el asistente Create Database , al cual puede acceder a través del SQL Server Enterprise Manager. El comando CREATE DATABASE Se puede usar el comando CREATE DATABASE para crear una base de datos y los archivos almacenados en una base de datos. El comando CREATE DATABASE le permitirá especificar una serie de parámetros que definirán las características de la base de datos. Por ejemplo, se puede especificar el máximo tamaño que puede alcanzar un archivo o el incremento que puede experimentar dicho archivo. Si sólo utiliza CREATE DATABASE nombre_de_la_base_de_datos la base de datos es creada del mismo tamaño de la base de datos “Model”. El comando puede ser ejecutado desde el SQL Query Analizer. El siguiente ejemplo crea una base de datos llamadas “Productos” y especifica que se usará un solo archivo. El archivo especificado será el archivo primario, y un archivo de registro de 1Mb se crea automáticamente. Dado que ni megabytes (Mb) ni kilobytes (Kb) son especificados en el parámetro SIZE para el archivo primario, el archivo será generado en megabytes. Además, al no consignarse una especificación de archivo para para el archivo de transacciones, el archivo de transacciones no tendrá un tamaño máximo (MAXSIZE) y podrá crecer hasta ocupar todo el espacio en el disco.

MAXSIZE = 10. La figura muestra el cuadro de diálogo Database Properties cuando este se abre por primera vez. En la Figura se muestran varias opciones que pueden ser modificadas cuando se ejecuta el asistente. SIZE = 4. expanda la consola del árbol de su servidor. FILEGROWTH = 1 ) GO Usar el Enterprise Manager Se puede crear una base de datos directamente utilizando la herramienta SQL Server Enterprise Manager. Para crear una base de datos en el Enterprise Manager.35-146 USE master GO CREATE DATABASE Productos ON ( NAME = prods.dat. y haga clic en New Database. haga clic derecho en el nodo Database. . Se accede al asistente seleccionando Wizards desde el menú Tools.mdf’. FILENAME = ‘c:\program files\Microsoft SQL server\mssql\data\prods. Desde allí se deberán completar los pasos que presenta el asistente. modifique los valores por defecto como sea necesario en orden a crear la nueva base de datos. El asistente Create Database El asistente Create Database lo lleva a través de una serie de pasos necesarios para para crear una nueva base de datos. Cuando el cuadro de propiedades aparezca.

Ud. Si la base Master necesita ser recuperada. Las bases de datos de sistema (Model. la sentencia DATABASEPROPERTYEX. estaría aún siendo referenciada y podría generar mensajes de error. modificar sus características o eliminar la base de datos. Cuando una base de datos es eliminada. mediante el uso del SQL Server Enterprise Manager. esto se produce de manera permanente y no puede ser recuperada sin usar un resguardo (backup) previo. Borrar una base de datos SQL Server Se puede eliminar una base de datos SQL Server cuando esta no será necesaria o cuando es movida a otra base de datos o a otro servidor. porque el borrar una base de datos actualiza las tablas del sistema en la base de datos Master. Master y Tempdb) no pueden ser eliminadas. cualquier base de datos que ha sido eliminada desde el último resguardo que se hizo. Ver información referida a la base de datos Se puede ver la definición de la base de datos y sus opciones de configuración en casos de problemas de funcionamiento o cuando se considere necesario realizar cambios en la base de datos. MSdb. SQL Server provee diferentes métodos que se pueden utilizar para ver información acerca de la base de datos: el procedimiento almacenado sp_helpdb. .36-146 Figura 1: La pestaña General del cuadro de diálogo Database Properties para una nueva base de datos Administrar una base de datos SQL Server Una vez que se ha creado la nueva base de datos. podrá ver información acerca de dicha base de datos. La base de datos Master debería ser resguardada después que se elimina una base de datos.

parámetro. se deben definir previamente los tipos de datos que serán definidos para cada columna. binary (binarios) y varbinary ( binarios de longitud variable) son definidos en bytes. Los tipos de datos se pueden utilizar para asegurar la integridad de los datos. Por ejemplo. Además. según fue establecido en comando original CREATE TABLE. se crearán las tablas que guardarán los datos dentro de la base de datos. no se puede grabar el apellido de alguien en una columna definida como tipo de dato fecha y hora (datetime). Otras objetos. el dato podría ser carácter. los objetos que tienen asociados tipos de datos son: • • • • • Columnas en tablas y vistas Parámetros de procedimientos almacenados Variables Funciones Transact-SQL que retornan uno o mas valores de un tipo específico de dato. Un tipo de dato es un atributo que especifica como serán los datos que pueden ser almacenados en una columna. fechas. sin embargo. El asignar un tipo de dato a un objeto define cuatro atributos del objeto: • • El tipo de dato contenido por el objeto.37-146 Una base de datos puede ser eliminada utilizando el comando DROP DATABASE o ser borrada desde la consola del árbol en el SQL Server Enterprise Manager. valores monetarios. Procedimientos almacenados que tienen un código return (el cual siempre es un valor entero) Asignar tipos de datos a cada columna es uno de los primeros pasos que se dan en el diseño de una base de datos. Las longitudes de los tipos image (imágenes). tienen también asociados tipos de datos. el cual es un atributo que especifica como serán los datos que pueden guardarse en esa columna (números enteros. La longitud de . MODULO II: Implementar una base de datos y sus tablas Tema 2: Identificar Tipos de Datos Una vez que se ha creado una base de datos. SQL Server provee un conjunto de tipos de datos predefinidos por el sistema. entero o binario. dado que esta columna solo aceptará datos de fechas y horas. dado que un dato para ser grabado o modificado deberá ajustarse al tipo de dato especificado para la columna a la que pertenece. Para crear estas tablas. o variable. este punto intentará explicar como identificar que tipos de datos se deben emplear cuando se define una columna. etc. caracteres. SQL Server provee de un conjunto de tipos de datos predefinidos. además de las columnas. se pueden crear tipos de datos definidos por el usuario. La longitud o el tamaño del valor almacenado. Por ejemplo. Tipos de datos provistos por el sistema En SQL Server cada columna tiene un tipo de dato definido.).

Los datos Character consisten de cualquier combinación de letras. el tipo de datos numeric es equivalente al tipo de datos decimal. y caracteres numéricos. varbinary image Los datos deben tener la misma longitud fija (hasta 8 KB) Los datos pueden variar en el número de dígitos hexadecimales (hasta 8 KB) Los datos pueden ser de longitud variable y exceder los 8 KB.38-146 cualquiera de los tipos numéricos de datos es el número de bytes necesarios para representar el número de dígitos máximo permitido para ese tipo de dato. datos character válidos:"John928" "(0*&(%B99nh jkJ" char Los datos deben tener la misma longitud fija (hasta 8 KB) varchar text Los datos Date time consisten de combinaciones de fechas o horas Date time válidas. • La tabla siguiente provee la descripción de las categorías de tipos de datos que SQL Server soporta y las descripciones de los tipos de datos base que cada categoría contiene: Categoría Descripción Tipo de Dato Base Descripción Binary Un dato Binary almacena cadenas de bits. Los datos fecha están comprendidos entre en el 1 de Enero de 1753 hasta el 31 de diciembre de 9999 (requiere 8 bytes por dato). El tipo de dato almacena un representación exacta del número. Por ejemplo un objeto smallint (entero pequeño) puede tener un máximo de cinco dígitos. No existe tipos de datos separados para fechas y horas para almacenar solo fechas o solo horas Los datos pueden variar en el número de caracteres (hasta 8 KB) Los datos pueden ser cadena de caracteres ASCII que excedan los 8 KB. un objeto int (entero) no puede aceptar dígitos decimales. • La precisión de los números (solamente tipos de datos numéricos). el binary número decimal 245 vale en hexadecimal F5. por lo que su escala es de cero. Un valor monetario puede tener un máximo de cuatro dígitos decimales y su escala es de cuatro. Los datos pueden tener un máximo de 30 dígitos. datetime smalldatetime Decimal Los datos Decimal consisten de datos numéricos que son almacenados al menor dígito significativo decimal numeric . Character Por ejemplo. por lo que tiene una precisión de cinco. La precisión es la cantidad de dígitos que el número puede tener. Por ejemplo. El dato consiste de números hexadecimales. símbolos. La escala de un número (solamente tipos de datos numéricos). Las longitudes para los tipos de datos string (cadena de caracteres) y Unicode son definidos en caracteres. Los datos fecha están comprendidos entre en el 1 de Enero de 1900 hasta el 31 de diciembre de 2079 (requiere 4 bytes por dato). Por ejemplo. que pueden estar todos a la derecha de la coma decimal. En SQL Server. La escala de un número es la cantidad de dígitos que puede tener a la derecha de la coma decimal.

y sql_variant.767 (requiere de 2 bytes por valor).509. Desde –214.748.79E + 308 a 1.337. Integer bigint int smallint tinyint Monetary Monetary representa montos de dinero positivos o negativos money smallmoney Special Special se utiliza para datos que caben en ninguna de las categorís anteriores. una nchar .483. bit cursor timestamp Consiste de números hexadecimales de 16 byte.79E + 308.477. SI o NO Este tipo de dato es usado para variables o prámetros OUTPUT en procedimientos almacenados que contenga una referencia a un cursor. Desde –2.40E + 38 a 3. Desde cero a 255 (requiere de 1 bytes por valor). ntext. Tamaño 8 bytes. Desde –32.768 a 32. image. Los GUID son usados cuando una columna deba ser única frente a cualquier otra columna.147.5807 Tamaño 8 bytes. Desde –922. 0.3647 Tamaño 4 bytes. y 2.39-146 Tipo de Dato Base Categoría Descripción Descripción Floating point Datos numéricos aproximados que consisten de datos con una float aproximación tanto como el sistema de numeración binaria pueda ofrecer real Los datos Integer consisten de números enteros positivos y negativos tales como: –15. El tipo de datos Table puede ser usado únicamente para para definir variable locales de tipo table o para retornar valores de una función definida por el usuario. Los datos deben tener la misma longitud table Unicode Al usar tipo de datos Unicode. Consisten en un 1 o un 0.203. indicando un identificador único uniqueidentifier global (GUID). Desde –1. Cualquier variable creada con el tipo de datos cursor puede tomar valor nulo Este tipo de datos es usado para indicar la secuencia de la actividad del SQL Server sobre una fila y es representado por un número incremental en formato binario.685.647 (requiere de 4 bytes por valor).40E + 38.3648 a 214.337. Es utilizado para almacenar un conjunto de resultados para su posterior procesamiento. timestamp.685.648 a 2. 5.483.748.147.5808 a +922. SQL_variant Este tipo de datos soporta a cualquier otro tipo de datos soportado por SQL Server excepto text. Desde –3.477.203. Se usan para representar valores lógicos VERDADERO o FALSO. Desde –2^63 (–9223372036854775808) a 2^63–1 (9223372036854775807).

Los tipos de datos definidos por el usuario pueden ser usados en varias tablas que deban guardar el mismo tipo de dato en una columna y cuando se necesita asegurar que estas columnas tengan exactamente el mismo tipo de dato. Lo cual incluye a todos los caracteres definidos en los distintos conjuntos de caracteres. Tipos de datos definidos por el usuario Los tipos de datos definidos por el usuario están basados en tipos predefinidos por el sistema en SQL Server 2000. Se puede usar este tipo de dato solamente para variables y para parámetros de procedimientos almacenados. Cuando se crea un tipo de dato definido por el usuario. se toma por defecto la configuración de nulos ANSI para la base de datos o conexión. Los tipos de datos Unicode toman el doble de espacio de almacenamiento que los tipos no-Unicode. y varying es sinónimo de nvarchar). Todos los datos almacenados en el SQL Server deben ser compatibles con uno de estos tipos de datos base. Varios tipos de datos base tienen sinónimos (por ejemplo. Cuando la anulabilidad no es explícitamente definida. .40-146 Tipo de Dato Base Categoría Descripción Descripción columna puede almacenar cualquier cualquier caracter definido por el estándar Unicode. El tipo de dato cursor es el único tipo dedatos base que no puede ser asignado a una columna de una tabla. Se pueden crear tipos de datos definidos por el usuario utilizando el procedimiento almacenado sp_addtype o utilizando el Enterprise Manager. un tipo de datos definido por el usuario llamado codigo_postal podría ser creado en base al tipo char. rowversion es sinónimo de timestamp. Si un tipo de datos definido por el usuario es creado en la base de datos Model el tipo de datos estará disponible para todas las nuevas bases de datos que se creen. longitud y capacidad de aceptar nulos. Por ejemplo. nvarchar ntext fija (hasta 4000 caracteres Unicode) Los datos pueden variar en el número de caracteres (hasta 4000 caracteres Unicode) Los datos pueden exceder los 4000 caracteres Unicode. se deben proveer los siguientes parámetros: • • • Nombre Tipo de datos del sistema sobre el que se basa el nuevo tipo de dato Anulabilidad (si el tipo de dato permite valores nulos). Si el tipo de datos es creado en una base de datos definida por el usuario el tipo de datos sólo estará disponible para dicha base de datos.

En este punto trataremos como crear tablas. se está listo para crear los objetos tabla que almacenaran los datos dentro de la base de datos. como mínimo.41-146 MODULO II: Implementar una base de datos y sus tablas Tema 3: Crear y administrar tablas. o un inventario. Nulo significa que ninguna entrada ha sido cargada para ese dato. la definición de la tabla deberá incluir. Cada instancia de la entidad en la tabla es representada por un solo registro o fila (llamada también tupla). Si se necesita crear columnas donde algunos de cuyos valores serán desconocidos se puede crear un valor por defecto que sea asignado en tales casos. Un valor nulo no es lo mismo que un cero. Crear tablas en una base de datos SQL-Server Una tabla es una colección de datos acerca de una entidad específica. La presencia de un valor nulo generalmente implica que el valor o es desconocido o no esta definido. Una vez que se ha creado la base de datos e identificado el tipo de datos. como un cliente. Se pueden configurar otras propiedades posteriormente. La columna incluye un valor por defecto DESCONOCIDO para cuando no se tiene el dato. el nombre de la tabla. Por ejemplo. se debe evitar permitir ingresar valores nulos porque ello provoca mayor complejidad en las consultas y actualizaciones y porque estos no pueden ser usados con algunas opciones de configuración de las columnas. el SQL automáticamente grabará DESCON en dicha columna. Cuando se crea una tabla. la fecha de una orden podría ser un atributo de la entidad orden. Además. o entre un valor nulo y cualquier otro valor. un blanco o una cadena de caracteres de longitud cero. aunque es aconsejable definir la mayor cantidad de propiedades al crear la tabla para evitar problemas posteriores de mantenimiento. se verá como obtener información acerca del objeto tabla. Cada columna representa un atributo de la entidad. como la restricción PRIMARY KEY. los nombres de las columnas. Idealmente. incluyendo tanto las restricciones de clave primaria PRIMARY KEY como todas las otras restricciones. retornan un valor desconocido (unknow) porque el valor de cada NULL es desconocido por definición. En este punto del desarrollo de la base de datos se deberá contar con la información necesaria para crear las tablas en la base de datos. Comparaciones entre dos valores nulos. Mas adelante se verá como definir valores por defecto para las columnas. Por ejemplo. Además. generar valores para las columnas y definir valores por defecto en las columnas. y eliminar tablas. Por ejemplo. una orden de compra. modificar las características de las tablas. Primero aprenderá a crear tablas básicas y posteriormente se verá como incorporar las restricciones Determinar la anulabilidad de las columnas La anulabilidad de una columna determina si las filas en la tabla pueden contener un valor nulo para esta columna. en caso de ser necesarios) y si las columnas aceptarán valores NULL. . sino que este es desconocido o no ha sido ingresado. Si el valor para la columna Telefono no es agregado en el comando de grabación del registro. la columna Telefono en la tabla Autores de la base de datos Pubs no permite valores nulos. Valores nulos no pueden ser usados para información requerida para distinguir una fila de otra fila en una tabla. En general. sus tipos de datos (y longitudes. un valor nulo en la columna Precio de la tabla Libros de la base Pubs no significa que no tenga precio. incluyendo como especificar la anulabilidad. Una tabla contiene un conjunto de columnas. eliminar valores nulos cuando se están realizando operaciones de cálculo puede ser importante porque ciertos cálculos (tales como promedios) pueden ser inexactos si existe valores nulos dentro de los datos analizados. se debería contar con toda la información acerca de las tablas.

ya sea cuando se crea o modifica una tabla. Por ejemplo. Una columna definida con la cláusula NULL también acepta una entrada explícita de NULL por parte del usuario. El valor NULL no debe ser expresado entre comillas porque será interpretado como una cadena de caracteres en vez de un valor NULL.42-146 Si una fila es insertada pero sin valores para una columna que permite valores nulos. se puede cargar un valor nulo para esa fila. SQL Server provee un valor nulo (sino existe un definición por defecto). Si una columna no permite valores nulos y no tiene una definición por defecto. Columnas definidas con las cláusulas PRIMARY KEY o IDENTITY no pueden permitir valores nulos. se deberá explícita indicar un valor para esa columna o el SQL Server generará un mensaje de error indicando que la columna no permite valores nulos. La cláusula DEFAULT en el comando CREATE TABLE se considera una restricción aún cuando en realidad no fuerza a nada.. Apel varchar(30) NOT NULL. Si los valores nulos no son permitidos. Dado que como vimos los valores nulos no son aconsejables. Se puede crear una definición de valores por defecto para una columna de dos maneras: • Creando la definición del valor por defecto cuando se crea la tabla (como parte de la definición de la tabla) . La columna Emp_ID y la columna Apel no permiten valores nulos. una mejor solución puede ser definir una valor por defecto para esa columna. mientras que la columna Nombre sí. sin importar cual sea el tipo de dato de la columna o si tiene un valor por defecto definido. Especificar una columna para que no permita valores nulos puede ayudar a mantener la integridad de los datos asegurando que la columna tiene datos para todas las filas. Nombre varchar(30) NULL. el usuario que ingresa los datos se verá obligado a ingresar datos en la columna o toda la fila será rechazada por el sistema. Si la columna permite valores nulos. Cuando se carga una fila en una tabla con una definición de un valor por defecto para una columna. Para definir columnas que permiten o no valores se utilizan las cláusulas NULL o NOT NULL respectivamente. CREATE TABLE Empleados ( Emp_ID char(4) NOT NULL. es común asignar un valor cero como el valor por defecto (DEFAULT) para columnas numéricas o N/A para columnas de caracteres cuando no se especifican valores. Hay situaciones en la cuales se necesita cargar una fila de datos en una tabla donde no se conocen los valores para todas las columnas ( o esos valores no existen aún). ) Definir valores por defecto Cada columna en un registro debe contener un valor (aún si ese valor es un valor nulo). El siguiente ejemplo usa el comando CREATE TABLE para crear la tabla Empleados. se le está indicando en forma implícita al SQL Server que cargue el valor por defecto en la columna en aquellos casos que no se indique valor para dicha columna. La anulabilidad de una columna se define cuando se define la columna.

porque los valores de identificación son típicamente usados solamente dentro del contexto de una sola tabla. y las columnas de identificación no se relacionan a otra columna de identificación de otra tabla. Apel varchar(30) NOT NULL. Cuando se utilice el Transact-SQL para modificar una definición por defecto. Cuando una definición DEFAULT es agregada a una columna existente en una tabla.43-146 • Agregando el valor por defecto a una tabla existente (cada columna permite solo un valor por defecto) El siguiente ejemplo usa el comando CREATE TABLE para crear la tabla Empleados. El valor por defecto debe ser compatible con el tipo de dato definido para la columna. esta situación generalmente no es un problema. se puede crear una sola columna de identificación conteniendo los valores secuenciales generados por el sistema que unívocamente identifican cada fila en la tabla. Auto numeración y columnas de identificación Para cada tabla. SQL Server (por defecto) aplica el valor por defecto solo a las filas nuevas que sean ingresadas de ahí en adelante. La definiciones DEFAULT no pueden ser creadas sobre columnas creadas con alguna de las siguientes características: • • • Con tipo de dato timestamp Con la propiedad IDENTITY o ROWGUIDCOL Con una definición por defecto existente o con un objeto por defecto. En otras palabras. Sin embargo. se debe primero borrar la cláusula DEFAULT existente y luego recrearla con la nueva definición. Ninguna de las tres columnas permite valores nulos. una columna de identificación podría generar automáticamente un número único de recibo de compra a medida que las filas son insertadas en la tabla. El comando CREATE TABLE usa la cláusula DEFAULT para definir el valor por defecto: CREATE TABLE Empleados ( Emp_ID char(4) NOT NULL. Por ejemplo. Las columnas de identificación contienen valores únicos dentro de la tabla en la cual ellas son definidas. Por ejemplo se puede modificar el valor insertado en una columna cuando no ha sido entrado ningún valor. Por ejemplo para una columna con un tipo de dato entero (int) el valor por defecto deberá ser un número entero y no una cadena de caracteres. Cuando se agrega una nueva columna a una tabla existente. la columna Nombre provee la posibilidad de un nombre desconocido al agregar una definición por defecto a la definición de la columna. . Nombre varchar(30) NOT NULL DEFAULT ‘desconocido’. Las filas que tomaron el valor por defecto anterior no son afectadas. ) Se puede modificar o eliminar una definición por defecto existente. otras tablas que contienen columnas de identificación pueden contener los mismos valores de identificación que los usados por otras tablas. sin embargo. se puede especificar al SQL Server que inserte el valor por defecto (especificado en la definición de la nueva columna) en vez de un valor nulo en la nueva columna para las filas preexistentes de la tabla. sin embargo.

o tynint. Ninguna columna acepta valores nulos. La función OBJECTPROPERTY puede ser usada para determinar si una tabla tiene una columna IDENTITY. la columna Emp_ID es una columna de identificación. se debe considerar lo siguiente: • Una tabla puede tener solamente una columna con la propiedad IDENTITY property. y el incremento 1. numeric. SQL Server utiliza internamente columnas de identificación únicas globalmente en procesos de replicación. Cuando se insertan valores en una tabla con una columna de identificación. El valor inicial es 101. el utilizar datos globalmente únicos permite a los clientes en diferentes países evitar tener los mismos números de factura o de identificación de cliente. (por ejemplo en un sistema de facturación a clientes con datos ubicados en varias subsidiarias distribuidas por el mundo). siendo ambos por defecto iguales a uno. se utiliza una columna que garantice contener valores globalmente únicos cuando datos similares pueden ser generados desde múltiples sistemas de base de datos. SQL Server automáticamente genera el próximo número de identificación adicionando el incremento al último generado. • • • • El siguiente ejemplo utiliza el comando CREATE TABLE para crear la tabla Empleados. La columna de identificación no debe permitir valores nulos y no debe contener una definición u objeto por defecto. A menudo. y la función COLUMNPROPERTY puede ser usada para determinar el nombre de la columna IDENTITY. EmpNombre varchar(50) NOT NULL. Crear columnas de identificación Solamente una columna de identificación y una columna de identificación globalmente única pueden crearse por cada tabla Propiedad IDENTITY Las columnas de identificación pueden ser implementadas usando la propiedad IDENTITY. asegurando que las filas son identificadas de forma unívoca a través de las múltiples copias de la tabla. y la columna debe ser definida utilizando los tipos de datos int. Además. Se pueden especificar el número inicial y el incremento de la secuencia.44-146 Puede ser creada una columna de identificación globalmente única para cada tabla que deba contener valores que son únicos para todas las redes de computadoras del mundo. bigint. se puede generar huecos en la secuencia de valores de la columna. smallint. Cuando se usa la propiedad IDENTITY para definir una columna de identificación. Cuando el dato es tomado en el sitio central para consolidación y para la generación de reportes. la cual especifica el primer número de identificación a ser usado en la primera fila que se ingrese y un incremento (propiedad Identity Increment) que se agregará al último usado para generar un nuevo número de identificación para una fila cualquiera que sea agregada. La columna puede ser referenciada en una lista de selección utilizando la palabra clave IDENTIFYCOL después que la propiedad IDENTITY ha sido configurada. Los valores .1) NOT NUL. CREATE TABLE Empleados ( Emp_ID SMALLINT IDENTITY(101. ) Si existe una columna de identificación en una tabla sobre la que se realizan frecuentes operaciones de borrado de filas.

cada una con su propia columna de identificación. Si se quieren evitar tales huecos no se debería utilizar la propiedad IDENTITY. se puede crear un desencadenador que determine un nuevo valor de identificación (basado en los valores que ya existen en la columna de identificación) para cada nueva fila. La columna Emp_ID automáticamente generará un valor globalmente único cuando se inserte una nueva fila. el nombre de la tabla. el tipo de dato uniqueidentifier y la función NEWID. EmpNombre varchar(609 NOT NULL ) Métodos para crear tablas SQL Server provee varios métodos para crear tablas: el comando Transact_SQL CREATE TABLE. El siguiente ejemplo muestra como crear una tabla SQL: . La propiedad IDENTITY garantiza valores no repetidos solo para la tabla que la contiene. en cambio. como mínimo. Este funcionamiento es similar al modo en que se puede referenciar una columna IDENTITY utilizando la palabra IDENTITYCOL. se debe definir. SQL Server no genera valores automáticamente para esta columna. se deberá crear una definición DEFAULT sobre la columna que utilice la función NEWID. • • • El siguiente ejemplo utiliza el comando CREATE TABLE para crear la tabla Empleados. pueden generar los mismos valores para sus columnas de identificación. tablas separadas. y esta columna debe ser definida con el tipo de dato uniqueidentifier. La columna puede ser referenciada en una lista de selección con la palabra clave ROWGUIDCOL después que la propiedad ROWGUIDCOL fue configurada. las columnas y el tipo de datos (y si corresponde sus valores). Cuando se utiliza este comando. se deberá utilizar la propiedad ROWGUIDCOL. CREATE TABLE ( Emp_ID uniqueidentifier DEFAULT NEWID() NOT NULL. Si una aplicación debe generar una columna de identificación que genere valores únicos para toda una base de datos o para todas las bases de datos en todo el mundo. el comando UNIQUE debería ser usado para determinar que serán insertados valores únicos en la columna con la propiedad ROWGUIDCOL. Cuando se utiliza la propiedad ROWGUIDCOL para definir un identificador globalmente único se deberá tener en cuenta lo siguiente: • Una tabla puede tener una sola columna ROWGUIDCOL. sin embargo. Dado que la propiedad ROWGUIDCOL no asegura unicidad. Para insertar un valor globalmente único. el árbol de la consola del SQL Server Enterprise Manager. Comando CREATE TABLE Se puede utilizar el comando CREATE TABLE para crear una tabla dentro de una base de datos SQL Server.45-146 eliminados de las columnas de identificación no será reutilizados. y el Database Designer (al cual se puede acceder a través del SQL Server Enterprise manager). Identificadores globalmente únicos Aunque la propiedad IDENTITY automatiza la numeración de las filas dentro de una tabla.

el comando CREATE TABLE también permite definir otra propiedades. Table Designer es una herramienta visual que permite diseñar y ver una tabla en una base de datos a la que uno debe estar conectado. Por ejemplo. ClienteNombre varchar(40). columnas y tipos de datos). modificar sus características. clic derecho sobre el nodo Tables. Se puede tanto insertar tablas existentes de la base de datos al diagrama como insertar una nueva tabla a la base de datos y al diagrama. se puede especificar el grupo de archivos sobre el que se almacenará la tabla. o se pueden definir restricciones que se aplique a columnas individuales o a toda la tabla. Cuando la ventana New Table se abra. complete la información necesaria para definir la tabla como se muestra en la Figura. Además.46-146 CREATE TABLE Clientes ( Cliente_ID char(4). ) Además de los elementos básicos de la tabla (nombre. y clic sobre New Table (Nueva Tabla). o eliminar la tabla de la dbase de datos. Para crear una tabla en una base de datos existente. se puede consultar información sobre la tabla. desde el Table Designer se pueden modificar tablas existentes. . Figura 1: La ventana New Table en el SQL Enterprise Manager Database Designer (Diseñador de base de datos) Se puede utilizar el Database Designer en el SQL Server Enterprise Manager para agregar una tabla a un diagrama de base de datos. Administrar tablas de una base de datos SQL Server Una vez que se ha creado una tabla en una base de datos SQL Server. Enterprise Manager Se pueden crear tablas directamente en el SQL Server Enterprise Manager. o relacionarla a otras tablas en el diagrama. expanda el árbol de la consola hasta que la base de datos aparezca. editar su estructura.

La opción Rename en el SQL Server Enterprise Manager . y desencadenadores) tiene dependencia con la tabla. se debe cambiar el nombre de tabla en todos los desencadenadores. El siguiente cuadro provee una lista de varios tipos de modifcaciones que se pueden hacer sobre las propiedades de las tablas. cambiar el nombre y el dueño (owner) de una tabla. longitud. procedimientos almacenados. modificadas o eliminadas columnas. SQL Server incluye varios métodos para ver las características de una tabla y de sus dependencias. Transact-SQL scripts. aunque sólo una columna en la tabla puede tener la propiedad ROWGUIDCOL al mismo tiempo. también. Cuando se ejecuta esta operación. Advierta que si se realizan modificaciones sobre la tabla. incluyendo las siguientes: Pueden ser agregadas.47-146 Consultar información sobre tablas Después que ha creado las tablas de una base de datos. podría necesitar encontrar información acerca de las propiedades de una tabla (por ejemplo. • • Modificar tablas de una base de datos SQL Server Después que se crea una tabla se pueden cambiar muchas opciones que fueron definidas para la tabla cuando esta fue originalmente creada. • Para ver la definición de un tabla. la naturaleza de sus índices. • • Pueden ser agregadas o modificadas las restricciones PRIMARY KEY y FOREIGN KEY Pueden ser agregadas o modificadas las restricciones UNIQUE y CHECK y la definición DEFAULT (y objetos). determinando que objetos (tales como vistas. Se puede agregar o borrar una columna de identificación usando las propiedades IDENTITY o ROWGUIDCOL. la lista de los métodos a utilizar a tal efecto. Para ver propiedades de las columnas. Una tabla y las columnas seleccionadas dentro de la tabla pueden ser registradas para una indexación a texto completo(full-text indexing) • • Se puede. precisión. el nombre o el tipo de dato de una columna. utilice el procedimiento almacenado provisto por el sistema sp_help o el SQL Server Enterprise Manager para ver las propiedades de una tabla. El cuadro muestra. etc. los objetos dependientes pueden ser afectados. tipo de dato. aunque con algunas restricciones. Tipo de Modificación Método de Modificación Renombrar una tabla El procedimiento almacenado de sistema sp_rename. además. Ud.) Se puede también mostrar las dependencias de la tabla. utilice el procedimiento almacenado sp_depends o le opción Display Dependencies en el SQL Server enterprise Manager. el nombre de la columna. utilice el comando COLUMNPROPERTY para retornar información acerca de una columna o un parámetro de procedimiento. procedimientos almacenados. Por ejemplo. Para ver las dependencias de una tabla. o cualquier otro código de programación que use el nombre o el dueño anterior de la tabla. y anulabilidad pueden ser modificadas. escala. La propiedad ROWGUIDCOL puede ser agregada o removida de una columna existente.

los índices a texto completo. las restricciones y los índices son borrados de manera permanente. MODULO II: Implementar una base de datos y sus tablas Tema 4: Implementar la integridad de los datos Introducción a la integridad de los datos Las tablas en una base de datos SQL Server pueden incluir diferentes tipos de propiedades para asegurar la integridad de los datos. reglas. Asegurar la integridad de los datos Asegurar la integridad de los datos garantiza la calidad de los datos. definiciones NOT NULL. si un cliente tiene un Cliente_ID de 438. A continuación se presenta una introducción de todos estos tipos de integridad de datos soportados por SQL Server. Si se necesita eliminar una tabla que tiene la restricción FOREIGN KEY pero no se quiere eliminar la tabla con la clave ajena. definiciones DEFAULT. En este caso. crea la tabla Clientes en su base de datos. suponga que Ud. Estas propiedades incluyen: tipos de dato. desencadenadores e índices. Por ejemplo. Si se necesita eliminar tablas que se encuentran relacionadas a través de FOREIGN KEY y de las restricciones UNIQUE o PRIMARY KEY. Además. En ambos casos. ningún otro cliente debería tener el valor Cliente_ID en 438. integridad de dominio. suponga que se ha creado una columna Cliente_Eval que es utilizada para evaluar a cada cliente con una calificación de 1 a 8. se necesita borrar una tabla (por ejemplo. Los valores en la columna Cliente_ID deberían identificar unívocamente a cada cliente que es ingresado a la tabla.48-146 Tipo de Modificación Método de Modificación Cambiar el dueño de una tabla Modificar las propiedades de las columnas Renombrar una columna El procedimiento almacenado de sistema sp_changeobjectowner El comando ALTER DATABASE La opción Design Table en el SQL Server Enterprise Manager El procedimiento almacenado de sistema sp_rename La opción Design Table en el SQL Server Enterprise Manager Borrar tablas de una base de datos SQL Server A veces. la definición de su estructura. integridad referencial e integridad definida por el usuario. se discutirán los diferentes tipos de integridad de datos. Se puede explícitamente borrar una tabla temporaria si no se quiere esperar a que sea eliminada en forma automática. la columna Cliente_Eval no deberá aceptar un valor de 9 o cualquier otro valor que no esté entre 1 y 8. cuando se quiere implementar un nuevo diseño o liberar espacio en una base de datos). primero se deberá eliminar la restricción FOREIGN KEY. incluyendo integridad de entidad. . Como resultado. restricciones. Para eliminar una tabla de una base de datos SQL Server se utiliza el comando DROP TABLE o el Enterprise Manager removiendo la tabla del nodo Tables. se deben usar métodos soportados por SQL Server para asegurar la integridad de los datos. y el espacio que ocupaban es liberado para otros objetos. propiedades IDENTITY. Cuando se elimina una tabla. se deben eliminar primero las tablas con la restricción FOREIGN KEY primero. Luego.

no así con relación a otras tablas que pueden contener esos valores en sus propias columnas de identificación. Definiciones NOT NULL La anulabilidad de una columna determina si las filas en la tabla pueden contener valores nulos para esa columna. propiedades IDENTITY.49-146 SQL Server soporta varios métodos para asegurar la integridad de los datos. Por ejemplo. Las restricciones definen reglas indicando los valores permitidos en las columnas y son el mecanismo estándar para asegurar integridad. parámetro o variable.) que puede ser almacenado en una columna. un blanco o una cadena de caracteres de longitud cero. que incluyen: tipos de dato. binario. ya que esta columna solo aceptará valores válidos de fecha y hora. restricciones. Las columnas de identificación contienen valores únicos dentro de la tabla para la cual son definidas. Restricciones (constraints) Las restricciones permiten definir el modo en que SQL Server automáticamente fuerza la integridad de la base de datos. SQL Server provee de un conjunto de tipos de dato. Ya se han visto algunos de estos métodos. son cargadas en diferentes servidores distribuidos en el mundo y existe la posibilidad que en algún momento para generar reporte o consolidación de información sean unidas) se pueden utilizar columnas ROWGUIDCOL como se vio anteriormente. . La cláusula NULL se usa si se permiten valores nulos en la columna y la cláusula NOT NULL si no. Propiedades IDENTITY Cada tabla puede tener sólo una columna de identificación. Un breve resumen de ellos es incluido aquí a fin de mostrar una visión comprehensiva de los distintos modos de asegurar la integridad de los datos. sin embargo. Para los propósitos de este Kit. reglas. son tratadas de forma separada. Algunas de esta propiedades de la tablas. Definiciones DEFAULT Los valores por defecto indican que valor será guardado en una columna si no se especifica un valor para la columna cuando se inserta una fila. entero. desencadenadores e índices. tales como las definiciones NOT NULL y DEFAULT. Los tipos de dato pueden ser utilizados para asegurar la integridad de los datos porque los datos ingresados o modificados deben cumplir con el tipo de dato especificado para el objeto correspondiente. Un valor nulo no es lo mismo que un cero. son a veces consideradas tipos de restricciones. la que contendrá una secuencia de valores generados por el sistema que unívocamente identifican a cada fila de la tabla. definiciones NOT NULL. Los tipos de dato provistos por el sistema definen todos los tipos de dato que se pueden usar en SQL Server. etc. Esta situación no es generalmente un problema. no se puede almacenar el nombre de alguien en una columna con un tipo de dato datetime. El query optimizer (optimizador de consultas) de SQL Server utiliza definiciones de restricciones para construir planes de ejecución de consultas de alto rendimiento. Un valor nulo significa que no se ha ingresado ningún valor para esa columna o que el valor es desconocido o indefinido. reglas o valores por defecto. Tipos de Dato Un tipo de dato es un atributo que especifica el tipo de dato (carácter. Las definiciones DEFAULT pueden ser creadas cuando la tabla es creada (como parte de la definición de la tabla) o pueden ser agregadas a una tabla existente. pero en los casos que así lo sea (por ejemplo cuando diferentes tablas referidas a una misma entidad conceptual. La anulabilidad de una columna se define cuando se crea o se modifica una tabla. se debería usar siempre las cláusula NULL y NOT NULL dada la complejidad que tiene el SQL Server para manejar los valores nulos y no prestarse a confusión. definiciones DEFAULT. Cada columna en una tabla puede contener una sola definición DEFAULT. aún cuando se pueden crear tipos de dato definidos por el usuario que se crean sobre la base de tipos de dato provisto por el SQL Server. como ser clientes. Si se usan columnas que permiten o no valores nulos. Usar restricciones es preferible a usar desencadenadores.

Indices Un índice es una estructura que ordena los datos de una o más columnas en una tabla de base de datos. o propiedades IDENTITY). o el rango de valores posibles ( a través de restricciones FOREIGN KEY. Desencadenadores Los desencadenadores son una clase especial de procedimientos almacenados que son definidos para ser ejecutados automáticamente cuando es ejecutado un comando UPDATE. Un índice con clave única asegura la unicidad en la columna. integridad referencial e integridad definida por el usuario. restricciones CHECK. Los desencadenadores son poderosas herramientas que pueden ser utilizados para aplicar las reglas de negocio de manera automática en el momento en que los datos son modificados. definiciones DEFAULT. Un índice provee de punteros a los valores de los datos almacenados en columnas especificadas de una tabla y luego ordena esos punteros de acuerdo al orden que se especifique. Se utiliza el comando CREATE RULE para crear una regla. Se puede asegurar la integridad de dominio restringiendo el tipo (a través de tipos de datos). y reglas) Integridad referencial . INSERT o DELETE sobre una tabla o una vista. estricciones UNIQUE. integridad de dominio. valores por defecto. y reglas de SQL Server (aún cuando es recomendable usar restricciones y valores por defecto antes que desencadenadores en la medida que respondan a todas las necesidades de control de integridad de datos). Tipos de integridad de datos SQL Server soporta cuatro tipos de integridad de datos: integridad de entidad. Integridad de entidad La integridad de entidad define una fila como una única instancia de una entidad para una tabla en particular. se puede aplicar solo una regla por columna mientras que se pueden aplicar múltiples restricciones CHECK. Los desencadenadores pueden comprender el control lógico que realizan loas restricciones. son mas concisas que las reglas. Las restricciones CHECK. que realizan algunas de las mismas funcionalidades que las restricciones CHECK. Las restricciones CHECK son especificadas como parte del comando CREATE TABLE. Las restricciones CHECK son el modo preferido y estándar de restringir valores para una columna. el formato (a través de las restricciones CHECK y de las reglas). Las bases de datos utilizan los índices del mismos modo que se utilizan los índices de un libro: se busca en el índice para encontrar un determinado valor y luego se sigue un puntero a la fila que contiene ese valor. y luego se debe utilizar el procedimiento almacenado sp_bindrule para vincular la regla a una columna o a un tipo de dato definido por el usuario. por otro lado. definiciones NOT NULL. restricciones PRIMARY KEY. La integridad de entidad asegura la integridad de la columna de identificación o la clave primaria de una tabla ( a través de índices.50-146 Reglas (rules) Las reglas son capacidades mantenidas por compatibilidad con versiones anteriores de SQL Server. Integridad de dominio La integridad de dominio es la validación de las entradas en una determinada columna. mientras que las reglas son creadas como objetos separados y luego vinculadas a la columna.

Figura 1: Integridad referencial entre la tabla Ventas y la tabla Titulos Integridad definida por el usuario La integridad definida por el usuario permite definir reglas de negocios específicas que no caigan dentro de alguna de las categorías anteriores. todas las referencias cambien consistentemente a lo largo de la base de datos. Cambiar valores en la tabla primaria que resulten en registros huérfanos en las tablas relacionadas. • • Por ejemplo. procedimientos almacenados y desencadenadores) Implementar restricciones de integridad Una restricción es una propiedad asignada a una tabla o a una columna que previene que datos inválidos sean grabados en la o las columnas especificadas. modifican o borran registros.51-146 La integridad referencial preserva las relaciones definidas entre tablas. como se muestra en la Figura. la integridad referencial está basada sobre las relaciones entre la clave ajena (tit_ID) en la tabla ventas y la clave primaria (tit_ID) en la tabla Titulos. Borrar registros desde una tabla primaria si existen registros relacionados en la tabla ajena. SQL Server previene a los usuarios de realizar lo siguiente: • Agregar registros a una tabla relacionada si no hay registros asociados en la correspondiente tabla primaria. La integridad referencial asegura que los valores de las claves son consistentes a través de distintas tablas. Por ejemplo. Todas las categorías soportan integridad definida por el usuario (todas las restricciones a nivel columna y a nivel tabla en el comando CREATE TABLE. con las tablas Ventas y Títulos en la base de datos Pubs. Tal consistencia requiere que no existan referencia a valores inexistentes y que. si un valor clave cambia. Cuando se fuerza la integridad referencial. la integridad referencial esta basada en interrelaciones entre claves ajenas y claves primarias o entre claves ajenas y claves únicas (a través de la restricciones FOREIGN KEY y CHECK). una restricción UNIQUE o PRIMARY KEY . cuando se entran. En SQL Server.

además. en una clave primaria de dos columnas. Restricciones PRIMARY KEY Una tabla usualmente tiene una columna (o una combinación de columnas) que identifica unívocamente cada fila de la tabla.52-146 previene de inserciones de valores que dupliquen un valor existente. valores por defecto o reglas. CONSTRAINT event_key PRIMARY KEY (TipoEvento. como se muestra en el siguiente comando CREATE TABLE: CREATE TABLE Procesos ( TipoEvento int. tipos de eventos y tiempo. LugarEvento char(50). Si se define la restricción PRIMARY KEY para mas de una columna. Introducción a las restricciones de integridad La restricciones permiten definir la forma en que SQL Server automáticamente asegurará la integridad de la base de datos. TiempoEvento) ) SQL Server soporta cuatro clases principales de restricciones: PRIMARY KEY. y una restricción FOREIGN KEY asegura la consistencia de la relación entre dos tablas. Una restricción de tabla es declarada independientemente de las definiciones de la columna y se puede aplicar a mas de una columna en la tabla. los valores se pueden duplicar para una columna. Supongamos una tabla que registra eventos que suceden en una computadora de una fábrica. Por ejemplo. TiempoEvento datetime. Este índice permite. mientras que las restricciones CHECK previenen de inserciones que no igualen una condición de búsqueda. Se puede crear una clave primaria usando la restricción PRIMARY KEY cuando se crea o modifica la tabla. Dicha tabla registra eventos de diferente tipo que pueden suceder al mismo tiempo. Cuando se especifica una restricción PRIMARY KEY para una tabla. un acceso rápido a las filas cuando la clave primaria se usa para formular consultas. Se deberían usar restricciones en vez de desencadenadores. se debe usar una restricción de tabla para incluirlas a todas en la clave primaria. Una tabla puede tener solo una restricción PRIMARY KEY. procedimientos almacenados. La figura muestra como las columnas Autor_ID y Titulo_ID de la tabla . pero no pueden suceder dos eventos del mismo tipo al mismo tiempo. • Las restricciones de tabla deben ser usadas cuando mas de una columna se incluye en la formulación de la condición. Esta columna (o columnas) son llamadas “clave primaria” de la tabla y aseguran la integridad de la entidad de la tabla. FOREIGN KEY y CHECK. DescripEvento char(1024). UNIQUE. Esta regla puede ser forzada incluyendo a ambas columnas. pero cada combinación de valores para todas las columnas de la clave principal de una fila debe ser única para toda la tabla. y ninguna columna que participa de la clave primaria puede aceptar nulos. Las restricciones pueden ser restricciones de columnas o de tablas: • Una restricción de columna es especificada como parte de la definición de la columna y se aplica solo a esta columna. SQL Server 2000 asegura la unicidad de los datos creando un índice principal para las columnas de la clave primaria. Las restricciones definen reglas en base a los valores permitidos en las columnas y son los mecanismos estándar para asegurar la integridad. si una tabla tiene dos o mas columnas en la clave primaria.

Por ejemplo se podría querer que la restricción PRIMARY KEY de la tabla referencie a otras columnas.53-146 TituloAutor forman una restricción PRIMARY KEY. Se puede modificar o eliminar una restricción PRIMARY KEY después que ha sido creada. siempre que no exista otra restricción PRIMARY KEY para esa tabla. El siguiente comando CREATE TABLE crea la tabla Tabla1 y define la columna Col1 como clave primaria: CREATE TABLE Tabla1 ( Col1 int PRIMARY KEY. Col2 varchar(30) ) Se puede definir la misma restricción utilizando la definición a nivel de tabla: CREATE TABLE Tabla1 (Col1 int. la que asegura que las combinaciones Autor_ID Titulo_ID son únicas. Figura 2: La clave primaria de la tabla TituloAutor en la base de datos pubs Crear restricciones PRIMARY KEY Se pueden crear restricciones PRIMARY KEY utilizando uno de los siguientes métodos: • • Crear la restricción cuando se crea la tabla Agregar la restricción a una tabla ya existente. CONSTRAINT tabla_pk PRIMARY KEY (Col1) ) Se puede usar el comando ALTER TABLE para agregar una restricción PRIMARY KEY a una tabla existente: ALTER TABLE Tabla1 ADD CONSTRAINT tabla_pk PRIMARY KEY (Col1) . o querer cambiar el orden de las columnas. agrupamiento o factor de llenado definido con un restricción PRIMARY KEY. Col2 varchar(30). nombre de índice.

se debería usar UNIQUE en vez de PRIMARY KEY en los siguientes casos: • Si una columna ( o combinación de columnas) no son la clave primaria. excepto los nulos. • Una restricción UNIQUE pueden ser referenciadas por una restricción FOREIGN KEY. Crear restricciones UNIQUE Se pueden crear restricciones UNIQUE en el mismo modo que se crean restricciones PRIMARY KEY: • • Creando la restricción al momento de crear la tabla ( como parte de la definición de la tabla) Agregando la restricción a una tabla existente. Se pueden usar los mismos comandos Transact-SQL para crear restricciones UNIQUE que los utilizados para crear restricciones PRIMARY KEY. Cuando se agrega una restricción UNIQUE a una columna (o columnas) existente en la tabla. Si se agrega una restricción UNIQUE a una columna que tienen valores no nulos duplicados. Al igual que con las restricciones PRIMARY KEY las restricciones UNIQUE pueden ser modificadas o eliminadas una vez creadas. SQL Server emite un mensaje de error y no agrega la restricción. SQL Server genera un mensaje de error y no agrega la restricción. Se pueden definir muchas restricciones UNIQUE para una tabla. mientra que las restricciones PRIMARY KEY no lo permiten. SQL Server 2000 controla los datos ya existentes en las columnas para asegurar que se cumplen las siguientes reglas: • • No hay valores nulos No hay valores duplicados Si se agrega una restricción PRIMARY KEY a una columna que tiene valores nulos o duplicados. Simplemente reemplace las palabras PRIMARY KEY por UNIQUE. Aunque tanto la restricción PRIMARY KEY como la restricción UNIQUE aseguran unicidad. Por lo que. son únicos. Restricciones UNIQUE Se pueden usar las restricciones UNIQUE para asegurar que no sean entrados valores duplicados en columnas específicas que no participan de la clave primaria.54-146 Cuando una restricción PRIMARY KEY se agrega a una columna (o columnas) existente en un tabla. SQL Server (por defecto) controla los datos existentes en las columnas para asegurar que todos los valores. Si no existe un índice agrupado ( o no se especifica un índice no-agrupado) se crea un índice único y no agrupado para asegurar la restricción PRIMARY KEY (ver índices mas adelante en este módulo). SQL Server automáticamente crea un índice UNIQUE para asegurar la unicidad requerida por la restricción UNIQUE. previendo que la o las columnas comprendidas en la restricción UNIQUE contengan solo valores no duplicados o valores nulos. si se intenta ingresar un nueva fila con valores duplicados para la columna (o combinación de columnas) especificada se genera una mensaje de error diciendo que ha sido violada la . Las restricciones UNIQUE permiten que se las defina para aceptar valores nulos. Si la columna permite valores nulos. SQL Server automáticamente crea un índice único para asegurar la unicidad de los valores de la restricción PRIMARY KEY. Una tabla puede aceptar múltiples restricciones UNIQUE. muientras que solo una restricción PRIMARY KEY.

Al agregar una columna (o columnas) a una de las tablas y definir estas columnas con una restricción FOREIGN KEY se crea una conexión entre dos tablas. si cualquier columna de una restricción FOREIGN KEY compuesta contiene valores nulos. Restricciones FOREIGN KEY Una clave ajena es una columna o combinación de columnas usadas para establecer y asegurar una conexión entre dos tablas. la verificación de la restricción FOREIGN KEY será omitida. La columna Pub_ID en la tabla Titulos concuerda con la columna de clave principal en la tabla Editores. Una restricción FOREIGN KEY puede contener valores nulos. Además de a una PRIMARY KEY. Figura 3: AUna restricción FOREIGN KEY definida en la tabla Titulos de la base datos Pubs. una clave ajena puede referenciar a una restricción UNIQUE en otra tabla. La restricción fuerza la integridad referencial al asegurar que no se puedan hacer cambios en los datos en la tabla de la clave primaria si esos cambios invalidan la conexión a . se creará un índice no-agrupado por defecto cuando se crea una restricción UNIQUE. como muestra la Figura. si se elimina la fila de un editor de la tabla de editores y el ID de ese editor esta siendo utilizado en alguna fila de la tabla Titulos. La columna Pub_ID en la tabla Titulos es la clave ajena asociada la tabla Editores. Una restricción FOREIGN KEY puede referenciar columnas en tablas de la misma base de datos o dentro de la misma tablas (tablas auto-referenciadas). Los libros del editor eliminado quedarían huérfanos.55-146 restricción UNIQUE y no se agrega la fila a tabla. también controla cambios a datos en la tabla de la clave primaria. Se puede crear una clave ajena definiendo una restricción FOREIGN KEY cuando se crea o modifica una tabla. Las columnas tendrán únicamente valores que se encuentren en las columnas de la clave primaria de la segunda tabla. Por ejemplo. Por ejemplo. Una tabla puede tener múltiples restricciones FOREIGN KEY. la integridad entre las dos tablas se destruiría. sin embargo. Una restricción FOREIGN KEY previene esta situación. Si no se especifica un índice agrupado. Aún cuando el propósito primario de una restricción FOREIGN KEY en es el de controlar que datos pueden ser guardados en la tabla de la clave ajena. sin una conexión a los datos de la tabla Editores. la tabla Titulos en la base de datos Pubs tiene una conexión a la tabla Editores al haber una relación lógica entre autores y editores.

se podría querer que la tabla de clave ajena referencie a otras columnas. excepto los nulos. se debe primero o bien eliminar los datos correspondientes en la tabla de clave ajena o cambiar los datos de clave ajena en la tabla de clave ajena. Se puede modificar o eliminar una restricción FOREIGN KEY una vez que esta ha sido creada. Por ejemplo. Si se trata de eliminar una fila en la tabla de clave primaria o de cambiar un valor de clave primaria. dicha acción no se ejecutará si el valor de clave primaria cambiado o eliminado corresponde a un valor en la restricción FOREIGN KEY de otra tabla. existen en las columnas referenciadas por las restricciones PRIMARY KEY o UNIQUE. a través de conectar la clave ajena a distinto valor de la clave principal. CREATE TABLE Tabla1 (Col1 int PRIMARY KEY. Se puede configurar al SQL Server para que no realice este control y obligarlo a agregar la nueva restricción sin fijarse en los datos previos. El siguiente comando CREATE TABLE crea la tabla Tabla1 y define la columna Col2 con una restricción FOREIGN KEY que apunta a la columna Empleado_ID que es clave primaria de la tabla Empleados.56-146 los datos de la tabla de la clave ajena. indicando que la restricción FOREING KEY esta conectada a una restricción PRIMARY KEY existente o a una restricción UNIQUE. Col2 int. SQL Server 2000 (por defecto) controla los datos existentes en las columnas para asegurar que todos los valores. CONSTRAIT col2_fk FOREIGN KEY (Col2) REFERENCES Empleados(Empleado_ID) ) Se puede usar el comando ALTER TABLE para agregar una restricción FOREIGN KEY a una tabla existente: ALTER TABLE Tabla1 ADD CONSTRAIT col2_fk FOREIGN KEY (Col2) REFERENCES Empleados(Empleado_ID) Cuando se agrega una restricción FOEREING KEY a una columna (o columnas) existentes en un tabla. Para cambiar o eliminar una fila en una restricción FOREIGN KEY. Col2 int REFERENCES Empleados(Empleado_ID) ) Se puede definir. se debe primero eliminar la restricción FOREIGN KEY anterior y luego recrearla con su nueva definición. Agregando la restricción a una tabla existente. Crear restricciones FOREIGN KEY Se pueden crear restricciones FOEREIGN KEY utilizando alguno de los siguientes métodos: • • Creando la restricción cuando se crea la tabla (como parte de la definición de la tabla). además la misma restricción usando la restricción FOREIGN KEY a nivel de tabla: CREATE TABLE Tabla1 ( Col1 int PRIMARY KEY. . No se puede cambiar la longitud de una columna definida con un restricción FOREIGN KEY. Para modificar una restricción FOREIGN KEY utilizando Transact-SQL. esto puede ser útil cuando se quiere que la restricción funcione solo de aquí en adelante.

los datos y la definición de la tabla son copiados desde una base de datos fuente a una base de datos destino. la expresión lógica será como la siguiente: Salario >= 15000 AND Salario <= 100000 Se puede aplicar múltiples restricciones CHECK para una sola columna. se puede aplicar una misma restricción CHECK a múltiples columnas creando la restricción a nivel de tabla. Crear restricciones CHECK Se pueden crear restricciones usando uno de los siguientes métodos: • • Creando la restricción cuando se crea la tabla (como parte de las definiciones de la tabla) Agregando la restricción a una tabla existente. Por ejemplo.000 a $100. Este capacidad evita el ingreso de salarios fuera del rango normal de salarios de la compañía. Cuando se replica una tabla. . Por ejemplo. se deberá ser cuidadoso cuando se agregan restricciones sin controlar la consistencia de los datos previos dado que se pueden provocar inconsistencias no deseadas. Se puede crear una restricción CHECK con una expresión lógica (Booleana) que retorne TRUE (verdadero) o FALSE (falso) basada en operadores lógicos. Son similares a lar restricciones FOREIGN KEY en que ambas controlan los valores que son puestos en una columna. Estas bases de datos están generalmente (pero no necesariamente) sobre servidores separados. Deshabilitar restricciones permite que los datos sean modificados sin que sean validados por las restricciones.000. Las restricciones son evaluadas en el orden en que han sido creadas.57-146 De todos modos. Se puede modificar o eliminar una restricción CHECK una vez que ha sido creada. Las restricciones FOREIGN KEY toman los valores válidos de otra tabla.000 a $100. es posible limitar el rango de valores para una columna Salario creando una restricción CHECK que permita solamente datos dentro del rango de $15. se puede modificar la expresión usada por la restricción CHECK sobre una columna en la tabla. Al implementar procesos de replicación: Deshabilite una restricción FOREIGN KEY durante el proceso de replicación si la restricción es específica de la base de datos fuente. Esta posibilidad permite que múltiples condiciones sean controladas en un lugar. Si las restricciones FOREIGN KEY específicas de la base de datos fuente no están deshabilitadas.000. Además. Para permitir solamente datos que se encuentren dentro del rango de $15. se puede usar una restricción CHECK para múltiples columnas para confirmar que cualquier fila con la columna País igual a USA tenga valor para la columna Estado que sea una cadena de dos caracteres. La diferencia está en cómo se determina cuales son valores válidos. • Restricciones CHECK Las restricciones CHECK aseguran la integridad de dominio al limitar los valores que son aceptados para una columna. estas podrían innecesariamente prevenir que nuevos datos sean ingresados en la base de datos destino. Por ejemplo. Deshabilitar restricciones FOREIGN KEY Se pueden deshabilitar restricciones FOREIGN KEY preexistentes cuando se realicen alguna de las siguientes acciones: • Al ejecutar los comandos INSERT y UPDATE: Deshabilite una restricción FOREIGN KEY durante un comando INSERT o UPDATE si el dato nuevo violará la restricción o si la restricción se debe aplicar solo a datos ya existentes en la tabla. mientras que las restricciones CHECK determinan los valores válidos evaluando una expresión lógica que no se basa en datos de otra columna.

Col3 varchar(30) ) También se puede definir la misma restricción usando restricción CHECK a nivel tabla: CREATE TABLE Tabla1 ( Col1 int PRIMARY KEY. Deshabilitar restricciones permite que los datos sean modificados sin que sean validados por las restricciones. Por defecto la restricción CHECK se aplica a los datos existentes tanto como a los nuevos datos. Col2 int . Col3 varchar(30).58-146 Para modificar una restricción CHECK primero se debe eliminar la antigua restricción y luego recrearla con su nueva definición. Col2 int CONSTRAIT monto_limite CHECK (Col2 BETWEN 0 AND 100). porque esta acción saltea los controles de SQL Server 2000 que aseguran la integridad para los datos de la tabla. Sin embargo. una vieja restricción podría requerir códigos postales restringidos a 5 caracteres siendo los mismos aún válidos mientras que los nuevos códigos que se ingresen deberán tener nueve caracteres. CONSTRAIT monto_limite CHECK (Col2 BETWEN 0 AND 100) ) Se puede utilizar el comando ALTER TABLE para agregar una retricción CHECK a una tabla existente: ALTER TABLE Tabla1 ADD CONSTRAIT monto_limite CHECK (Col2 BETWEN 0 AND 100) Cuando se agrega una restricción CHECK a una tabla existente. CREATE TABLE Tabla1 ( Col1 int PRIMARY KEY. la restricción CHECK puede aplicarse solo a los datos nuevos o también a los datos existentes. El siguiente comando CREATE TABLE crea una tabla Tabla1 y define la columna Col2 con un restricción CHECK que limita los valores que puede tomar la columna al rango comprendido entre 0 y 100. Deshabilitar restricciones CHECK Se pueden deshabilitar restricciones CHECK preexistentes cuando se realicen alguna de las siguientes acciones: • Al ejecutar los comandos INSERT y UPDATE: Deshabilite una restricción CHECK durante un comando INSERT o UPDATE si el dato nuevo violará la restricción o si la restricción se debe aplicar solo a datos ya existentes en la tabla. La opción de aplicar la restricción a los nuevos datos solamente es útil cuando las reglas de negocios requieren que la restricción se aplique de ahora en más. . Por lo que solo los datos nuevos deberían ser controlados para verificar que cumplen con la restricción. se debe ser cuidadoso cuando se agregan restricciones sin controlar los datos existentes. Por ejemplo.

Arquitectura de los índices Los índices están estructurados para facilitar una respuesta rápida de conjuntos de resultados. Una vez que se crean los índices se deben mantener para maximizar la performance de las consultas. MODULO II: Implementar una base de datos y sus tablas Tema 5: Implementar índices Introducción Los índices son objetos de base de datos diseñados para mejorar el rendimiento de las consultas. Cuanto menor sea el B-tree mas rápido retornará un valor buscado. La administración comprende las tareas de reconstrucción. Se verá como determinar cuando un índice es necesario y apropiado. que tipo de índice usar y como crearlos. El tamaño de la clave del índice es llamado el ancho de la clave. estas podrían innecesariamente prevenir que nuevos datos sean ingresados en la base de datos destino. Un índice es estructurado por el SQL Server Index manager como un árbol balanceado (B-tree). Los dos tipos de índices que SQL Server soporta son agrupados y no agrupados. Ordenar el índice sobre la clave del mismo también mejora la performance. con niveles medios entre ambos. Sin índices. y eliminación de índices. tal como un índice en un libro ayuda a ubicar información rápidamente. Una tabla con muchos registros y un gran ancho de la clave crea un profundo y amplio B-tree. En este punto veremos la estructura y el propósito de los índices y sus tipos y características. el Query Optimizer utilizará el índice para ubicar los registros que cumplen con la consulta. una consulta deberá buscar en todos los registros de la tabla en orden a encontrar coincidencias. y los niveles hoja abajo. El Query Optimizer usará un índice si este mejorará la performance de la consulta. Las características de un índice afecta el uso de los recursos del sistema y performance general. y vistas indexadas son soportadas por las ediciones SQL Server Entreprise y SQL Server Developer. Estas bases de datos están generalmente (pero no necesariamente) sobre servidores separados. El número de registros de la tabla y el tamaño de la clave del índice afectan el ancho y profundidad del árbol. los datos y la definición de la tabla son copiados desde una base de datos fuente a una base de datos destino. Un índice de base de datos una o más columnas de valores de la tabla (llamadas clave del índice) y punteros a los correspondientes registros de la tabla. Cada objeto en la estructura de árbol es un grupo de claves del índice ordenadas llamadas páginas del índice. Si las restricciones CHECK específicas de la base de datos fuente no están deshabilitadas. Un B-tree es análogo a un árbol invertido con la raíz del árbol arriba. renombrado. Tablas indexadas son soportadas por todas las ediciones de SQL Server 2000. Los índices son aplicados a una o más columnas en tablas o vistas. Propósito y estructura Un índice en SQL Server asiste al motor de base de datos en la ubicación de los registros. Un B-tree facilita realizar consultas rápidas y consistentes dado el cuidadoso balance del ancho y profundidad del árbol a medida que el índice crece. para ello existen varias herramientas que asisten en la tarea de administración y mantenimiento de los índices. Todas las búsquedas comienzan en la raíz del B-tree y luego se mueven a través del árbol hasta el correspondiente nivel hoja. Cuando se replica una tabla. . Cuando se ejecuta una consulta usando la clave del índice.59-146 Al implementar procesos de replicación: Deshabilite una restricción CHECK durante el proceso de replicación si la restricción es específica de la base de datos fuente.

Un índice no agrupado es una estructura de índice separada. Cuando se crea una restricción PRIMARY KEY en un tabla que no contiene un índice agrupado. la columna NumDocumento con la restricción UNIQUE. el índice debe ser actualizado para reflejar la modificación. Si existe un índice agrupado en un tabla. esto es. se crea la tabla usando la siguiente sintaxis: . dado que estos índices ordenan físicamente la tabla o vista según la clave del índice agrupado. El Query Optimizer usará el índice por el ID del cliente cuando se ejecute la siguiente consulta: SELECT * FROM Clientes WHERE Cliente_ID = 798 No cree índices para todas las columnas de una tabla. los usuarios pueden consultar la tabla de Clientes en base al apellido o al ID del cliente. Apellido y NumDocumento. ALTER TABLE o CREATE INDEX. Nombre. un índice no agrupado utilizará al índice agrupado para la búsqueda de los registros. Para hacer un índice agrupado para la columna NumDocumento y un índice no agrupado para la columna PersonID. porque demasiados índices impactarán negativamente en la performance general. Para ubicar eficientemente a los registros. En la mayoría de los casos se creará antes un índice agrupado que los índices no agrupados sobre una tabla. se puede especificar las cláusulas CLUSTERED o NONCLUSTERED en los comandos CREATE TABLE. Cuando una tabla que contiene un índice es modificada. Este tipo de índices es particularmente eficiente para consultas. independiente del ordenamiento físico de los registros en la tabla. Por ejemplo. Una columna definida con una restricción UNIQUE genera automáticamente un índice no agrupado. Una columna definida como la clave primaria es un índice muy útil porque los valores de la columna están garantizados que son únicos. El espacio que ocupa un índice es directamente proporcional a la cantidad de registros en la tabla y al ancho de la clave del índice. Índices sobre columnas de valores únicos son de menor tamaño que los índices sobre columnas con valores duplicados y generan estructuras de búsqueda más eficientes.60-146 Para un rendimiento óptimo. Un índice agrupado contiene los registros de la tabla a nivel hoja del B-tree. las inserciones. Al igual que la tablas. El ordenamiento y la ubicación de los datos en un índice agrupado es análogo al de un diccionario donde las palabras son ordenadas en forma alfabética y las definiciones aparecen junto a las palabras. los índices son estructuras que ocupan espacio en la base de datos. Suponga que se crea una tabla Personas que contiene las siguientes columnas: PersonaID. Tipos de índices Hay dos tipos de índices: agrupados (clustered) y no agrupados (non clustered). el índice se volvería inútil. se crean sobre columnas que son comúnmente usadas en las consultas. Por lo tanto. eliminados y modificados. Índices agrupados Puede haber solo un índice agrupado por tabla o vista. SQL Server creará uno y utilizará la columna de clave primaria como clave para el índice agrupado. Para forzar el tipo de índice a ser creado para una columna o columnas. Por lo tanto se deberían crear dos índices para la tabla: un índice por apellido y otro por ID del cliente. Si la actualización del índice no se produjera. Ambos tipos de índices son estructuras tipo B-tree. regularmente los registros son agregados. el Query Optimizer usa un índice que concuerde con la consulta. Si ya existe un índice agrupado SQL Server creará un índice no agrupado sobre la columna definida con una restricción PRIMARY KEY. Antes de crear un índice se debe realizar un balance que asegure que el incremento de performance por el aumento de las respuestas en la consultan justifica con creces la caída de rendimiento y la sobrecarga producida por la tarea de mantenimiento del índice. La columna PersonID se define con la restricción PRIMARY KEY. dado que los registros de datos completos (en páginas de datos) son guardados a nivel de hoja del B-tree. eliminaciones y modificaciones de registros disparan al Index Manager para que actualice los índices de la tabla. La mayoría de la bases de datos son dinámicas.

Índices agrupados aseguran la unicidad internamente. Esta restricción no se aplica a las tablas. los datos de la tabla se encontrarán desordenados físicamente y se dice que la tabla tendrá la estructura de montón (heap). . Con un sentido de ordenamiento que especifique si será ascendente o descendente. Por lo que. un número de archivo y un número de ranura. row ID). Se debe primero crear un índice único agrupado sobre una vista previo a crear los índices no agrupados. La base de datos usa los índices no agrupados para encontrar registros según una clave.61-146 CREATE TABLE dbo. Con algunas limitaciones se pueden establecer índices sobre columnas computadas. formados por varias columnas. Un índice no agrupado sobre una tabla montón contiene punteros a las filas de la tabla. Se pueden crear índices sobre cualquier columna o combinación de columnas en una tabla o vista. ninguna de ambas columnas deberá tener valores nulos y las combinaciones de los valores de ambas columnas para los registros deberán ser únicas. Índices compuestos. un índice UNIQUE puede ser definido sobre las columnas Apellido y NumDocumento. Un índice no agrupado es análogo a un índice al final de un libro. la clave del índice y sus correspondientes valores de la clave serán únicos. las páginas de un índice no agrupado contienen las claves del índice agrupado en vez del RID. y este consiste de un número de página. generalmente se generan índices agrupados sobre columnas con la restricción PRIMARY KEY. Apellido varchar(40). Por ejemplo . Unicidad Cuando un índice es definido como UNIQUE. Un índice UNIQUE se puede definir sobre un conjunto de columnas mediante un índice compuesto. Nombre varchar(39). si se crea un índice agrupado sobre columnas con valores no únicos SQL Server crea un único valor sobre las columnas duplicadas para servir de clave de ordenamiento secundaria. Si existe un índice agrupado. NumDocumento char(11) UNIQUE CLUSTERED ) Los índices no se limitan a las restricciones.Personas ( PersonID smallint PRIMARY KEY NONCLUSTERED. Índices no agrupados Sobre una tabla o vista se pueden crear 250 índice no agrupados o 249 índices no agrupados y un índice agrupado. Un índice UNIQUE puede ser aplicado a cualquier columna si todos los valores de la columna son únicos. Características de los índices Una serie de características se pueden definir para los índices. además de si son o no agrupados. El RID es un puntero a una fila en un montón. Si no existe un índices agrupado para la tabla. Para evitar el trabajo adicional requerido para mantener valores únicos sobre columnas duplicadas. Se puede usar el índice del libro para ubicar las páginas que contienen una tema del índice del libro. Cada entrada en las páginas de índice contiene un identificador de fila (RID. Con un factor de llenado para permitir que las páginas crezcan como sea necesario. siendo las mas importantes: • • • • Unicidad o no de los registros según la clave del índice.

este es ordenado de manera ascendente. utilice solo las restricciones para forzar unicidad en vez de aplicar la característica UNIQUE al índice. luego habrá un recubrimiento de índice por parte del índice no agrupado. Las divisiones de páginas son complejas e insumen recursos de manera intensiva. esto tiene como resultado una extracción mas rápida de los datos. Este valor es llamado factor de llenado . Si la tabla contiene un índice agrupado. Tanto los índices agrupados como los no-agrupados se ordenan. La divisiones de páginas mas comunes suceden en el nivel de las páginas hoja. Se puede definir un valor global por defecto del factor de llenado utilizando el procedimiento almacenado sp_configure o asignarlo para un índice específico con la cláusula FILLFACTOR. esto es que las páginas del índice serán llenadas cuando el índice se crea sobre datos existente. se dice que hay un recubrimiento de índice. Cuando el resultado de una consulta se obtiene completamente desde el índice sin tener que consultar a los registros de la tabla . Esto se produce cuando todas las columnas indicadas en las cláusulas SELECT y WHERE se encuentran dentro de la clave del índice o dentro de la clave del índice agrupado (si este existe). SQL Server no permite crear un índice UNIQUE sobre una columna que contenga valores de la clave repetidos. Recuerde que los valores de la clave del índice agrupado se encuentran también en las páginas de los índice no agrupados para poder encontrar los registros en la tabla. esta es dividida (mitad de la página permanece en la página original y la otra mitad se mueve a una nueva página). Para reducir la ocurrencia de las divisiones de páginas se especifica cuánto se llenarán las páginas cuando se crea el índice. NivelTrabajo FROM Empleados01 WHERE Fecha_ingreso < (GETDATE() – 30) AND NivelTrabajo >= 100 ORDER BY NivelTrabajo Si existe un índice agrupado sobre la columna Emp_ID y un índice no agrupado sobre las columnas Apel. podrían ser necesarias divisiones adicionales. Si la fila insertada es muy grande. porque una consulta sobre una combinación de columnas contenidas en el índice será ubicada completamente en el índice. el registro y la página del índice son colocados en cualquier espacio disponible en el montón. el índice agrupado representa el sentido de ordenamiento de la tabla. Un operación de inserción ocurre cuando se ejecuta un comando INSERT o cuando se ejecuta un comando UPDATE para actualizar una clave de un índice agrupado.SQL Server debe dispones de cierto espacio para ello. Índices compuestos Un índice compuesto es cualquier índice que use mas de una columna como clave. Por defecto el factor de llenado vale cero.62-146 SQL Server automáticamente crea un índice UNIQUE para una columna o columnas definidas con las restricciones PRIMARY KEY o UNIQUE. Suponga que se ejecuta la siguiente consulta: SELECT Emp_ID. Los índices compuesto pueden mejorar el rendimiento de las consultas al reducir el número de operaciones de entrada/salida. SQL Server ubica el la página apropiada del índice dentro del B-tree y luego inserta el registro en el orden correspondiente. Un factor de llenado de cero es lo mismo que un factor de llenado de 100. Sentido de ordenamiento Cuando se crea un índice. Considere el siguiente comando SELECT: . Si la tabla no contiene un índice agrupado. Por lo tanto. NivelTrabajo y Fecha_Ingreso. Si la página del índice se encuentra llena. ya que solo se consultan las páginas del índice. Factor de llenado Cuando se inserta una fila en una tabla. por su propia clave y por tener indicados los registros a través de la clave del índice agrupado. Apel. ya que contiene todas las columnas usadas en la consulta.

keycnt from sysindexes . crear y borrar índices desde el cuadro de diálogo Manage Indexes. o se pueden crear nuevos índices para mejorar las consultas. Apel. Luego.63-146 SELECT Emp_ID. Para ver todos los índices asignados en una base de datos. apuntar a All Task y por último clic en Manage Indexes. Apel. La cláusula ORDER BY no ha sido indicada. SELECT Emp_ID. se ejecuta el siguiente código Transact-SQL: USE Pubs GO SELECT name. el archivo de base de datos. Se pueden ver las propiedades de un índice y acceder al cuadro de diálogo Edit Existing Index desde un plan de ejecución. tal como veremos mas adelante. Clic derecho sobre un índice que aparezca en la pestaña del Execution Plan y seleccione Manage Indexes. que no hay un sentido de ordenamiento especificado. clic derecho sobre un índice en particular y seleccione Edit para mostrar la ventana de diálogo Edit Existing Index como se verá mas adelante. Conocer los índices aplicados a una tabla o vista ayuda a optimizar las consultas. el cual es equivalente a las páginas de datos de la tabla. el tipo de índice. Hecho esto se muestra el cuadro de diálogo Manage Index. El Object Browser del Query Analizer provee similar información. o el Enterprise Manager. Se puede modificar. el resultado aparecerá en el orden establecido por ese índice. En el panel Details. El cuadro de diálogo Manage Indexes esta también disponible en el Enterprise Manager. para consultar información sobre índices seleccionados en la base de datos Pubs. El siguiente comando Trnsact-SQL usa el índice agrupado sobre la columna Emp_ID para devolver un resultado en orden ascendente. En el Object Browser. El sentido de ordenamiento depende del incide utilizado para resolver la consulta (si no se especifica la cláusula ORDER BY o si no se indica explícitamente que índice utilizar). Si el Query Optimizer usa un índice agrupado para resolver la consulta. se puede consultar la tabla del sistema sysindexes en la base de datos. Por ejemplo. El índice compuesto es un índice no agrupado. NivelTrabajo FROM Empleados01 WHERE Fecha_ingreso < (GETDATE() – 30) AND NivelTrabajo >= 100 Fíjese. por lo que el resultado es mostrado en orden ascendente comenzando con la columna Apel. Nombre FROM Empleados01 Información sobre índices Para ver los índice y sus propiedades se pueden utilizar procedimientos almacenados del sistema. Para ver los índices aplicados a una tabla o vista se puede utilizar los procedimientos almacenados del sistema sp_help sp_helpindex. para ahorrar recursos. el Object Browser en el Query Analizer. Ya vimos que el Query Optimizer usa una índice compuesto para devolver un resultado para esta consulta. Primero ubique el nodo Tables para la base de datos en la consola del árbol. y la primera columna es Apel. rows. rowcnt. Pero el resultado aparece ordenado por el apellido.. y la o las columnas contenidas por el índice. Supongamos que cuando se creó el índice no estableció tampoco un sentido de ordenamiento. Desde aquí se puede presionar el botón Edit para mostrar el cuadro de diálogo Edit Existing Index. clic derecho sobre una tabla. Se puede analizar índices para diseñar comandos SELECT que retornen los resultados de manera eficiente. Los siguientes comandos Transact-SQL muestra todos los índices creados para la tabla Empleados01 sp_helpindex Empleados01 El resultado que se retorna del sp_helpindex incluye el nombre del índice. expanda un nodo tabla y luego expanda el nodo Indexes.

Un índice Full-Text se guarda en un catálogo Full-Text. Como se vio se puede usar la opción Manage Indexes desde el Object Browser o accederlo desde un plan de ejecución en el Query Analizer. UN índice Full-Text permite realizar consultas a texto completo para buscar datos en forma de cadenas de caracteres en la base de datos.64-146 WHERE name NOT LIKE ‘%sys%’ ORDER BY keycnt Indexado Full-Text El indexado Full-Text no es parte de las funciones de indexado descripta hasta ahora. Usando interfase gráfica Desde el cuadro de diálogo Manage Indexes. Se puede crear una aplicación propia que use la interfase SQL-DMO para crear un índice. se pueden especificar las propiedades de una restricción de clave primaria o de una restricción de clave única durante la creación (CREATE TABÑE9 o modificación (ALTER TABLE) de una tabla. no SQL Server. pero se debe entender como este difiere del indexado provisto por el sistema SQL Server. Otro modo es crear un índice para una tabla utilizando el comando Transact-SQL CREATE INDEX. clic el botón New para crear un índice y se muestra el cuadro de diálogo para acceder al cuadro de diálogo Create New Index como se muestra en la figura . Por último. Crear y administrar índices Crear índices Hay varios modos de crear un índice en SQL Server. El Enterprise Manager ofrece además el asistente Create Index para crear índices paso a paso. La opción Manage Indexes está también disponible desde el menú contextual de una tabla o vista en el Enterprise Manager. mantiene los índices y catálogos Full-Text. El motor Microsoft Search.

etc.65-146 Figura 1: El cuadro de diálogo Create New Index para la tabla Productos de la base de datos Northwind.0000 18. pero ese orden no aparece en el resultado porque ProveedorID y PrecioUnitario prevalecen al orden de la columna NombreProducto. se puede proveer de un nombre al índice. seleccionando la columna y con clic en los botones Up y Down. Se muestran a continuación algunos registros del resultado para ilustrar este tema: ProductoID PrecioUnitario NombreProducto 1 1 1 2 2 2 2 3 19.0000 10.0000 Chang Chai Aniseed Syrup Chef Anton's Cajun Seasoning Chef Anton's Gumbo Mix Louisiana Fiery Hot Pepper Sauce Louisiana Hot Spiced Okra Northwoods Cranberry Sauce .0500 17. Fíjese que se puede especificar el orden descendiente para cualquier parte del índice.0000 40. el grupo de archivos donde el índice deberá ser creado.0000 21. El índice ordena NombreProducto en orden ascendente. el tipo de índice (agrupado o no agrupado).). Desde el cuadro de diálogo Create New Index. seguido por el PrecioUnitario en orden descendiente. NombreProducto FROM Productos El resultado muestra el ProveedorID en orden ascendente.3500 21. factor de llenado. El Query Optimizer seleccionará el índice Productos que aparece en la figura cuando se ejecute el siguiente comando: SELECT proveedorID. y de las propiedades del índice (unicidad. La columna que está primera en la lista de columnas seleccionadas determinará el primer ordenamiento de la clave del índice. Se puede además cambiar el orden de las columnas que son parte de una clave compuesta.0000 22. PrecioUnitario.

Usar comandos Transact-SQL Los comandos CREATE INDEX. el tipo de índice (agrupado o no). y clic en Ok para comenzar el asistente..n] ] [ON grupo_archivos ] Ya hemos aprendido el significado de esta cláusulas. La configuración por defecto es la siguiente: • • Se crean índices no agrupados Se ordenan todas las columnas en un sentido descendente y se usa la base de datos actual para ordenar el índice.. En el cuadro Select Dialog. Cuando se utiliza CREATE INDEX. Haciendo clic en la opción Wizards se muestra el cuadro Select Dialog. seleccione el asistente Create Index. y el grupo de archivos que lo contendrá. Se puede crear un índice usando estos comandos Transact-SQL a través del Query Analizer o con una herramienta tal como osql. la tabla o la vista. las cláusulas UNIQUE y CLUSTERED o NONCLUSTERED son opcionales.66-146 ProductoID PrecioUnitario NombreProducto 3 30. se debe especificar el nombre del índice.. . propiedades del índice.. El asistente Create Index está disponible en la opción Wizards del menú Tools. el sentido de ordenamiento para cada columna. y la olas columnas sobre las que se aplicará el índice. Previene de ser sobrescrito a los índices existentes.n]) [WITH [propiedad_indice [. se puede especificar si el índice deberá contener sólo valores no duplicados. Se crean todos los ordenamientos resultantes durante ela creación del índice en el grupo de archivos por defecto Actualiza estadísticas del índice Deshace un proceso de múltiples inserciones si la condición de unicidad del índice es violada por alguno de los registros que están siendo ingresados. expanda Database.0000 Uncle Bob's Organic Dried Pears Si se prefiere mas ayuda para crear índices se puede usar el asistente Create Index en el Enterprise Manager. Resumiendo. Es también opcional el especificar las propiedades del índice a través de la cláusula WITH y especificar el grupo de archivos donde el índice será creado usando la cláusula ON. CREATE TABLE y ALTER TABLE participan en la creación de los índices. El asistente habilita para ver los índices ya creados sobre una tabla o vista y para crear nuevos índices seleccionando la columna (o columnas) que deberían ser parte del índice...- • • • • • Las principales cláusulas en un comando CREATE INDEX son resumidas como sigue: CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX nombre_indice ON [nombre_tabla | nombre_vista] (nombre_columna [. Se usan las configuraciones globales del SQL Server para fijar el factor de llenado. pudiendo además configurar las propiedades del índice. Opcionalmente. cuales son opcionales y que configuraciones por defecto existen para cualquier cláusula no especificada en el comando CREATE INDEX.

CREATE TABLE Tabla01 (Columna01 int CONSTRAINT pk_columna01 PRIMARY KEY) . La palabra SORT_IN_TEMDB indica al índice que efectúe las operaciones de ordenamientos intermedios en TempDB. Crear una restricción PRIMARY KEY o UNIQUE automáticamente crea un índice. La cláusula DROP_EXISTING indica que el índice Indice01 debe ser reemplazado. Esta cláusula se usa típicamente para mejorar la velocidad a la que se crea o reconstruye un índice grande o para disminuir la fragmentación del índice. DROP_EXISTING. La clave del índice incluye a las columnas Columna01 y Columna03. La cláusula DESC configura el sentido de ordenación para la Columna03 como descendente (en vez de ascendente). DESC) WITH FILLFACTOR = 60 IGNORE_DUP_KEY. Columna03. La clave del índice para la tabla será Columna01. Las principales cláusulas en el comando CREATE TABLE que se relacionan con la creación de índices son: CREATE TABLE nombre_tabla ( nombre_columna tipo_dato CONSTRAINT nombre_restriccion [PRIMARY KEY | UNIQUE] [CLUSTERED | NONCLUSTERED] [WITH FILLFACTOR = factor_llenado] [ON grupo_archivo] ) una restricción e clave primaria esta siempre configurada NOT NULL. haciendo de Indice01 un índice compuesto. Dado que una segunda cláusula ON no se ha puesto el índice será creado en el grupo de archivos por defecto de la base de datos. Los comandos CREATE TABLE y ALTER TABLE incluyen configuraciones para los índices por lo que se puede personalizar a los índices que se crean con estas restricciones. dejando libre un 60% del espacio para contener entradas adicionales. La palabra IGNORE_DUP_KEY habilita para que un proceso por lotes que contenga múltiple comandos INSERT sea exitoso al ignorar cualquier INSERT que viole el requerimiento de unicidad. El uso de cláusulas opcionales personaliza el comando CREATE INDEX siguiente: CREATE UNIQUE CLUSTERED INDEX Indice01 ON Tabla01(Columna01. El siguiente comando CREATE TABLE usa configuraciones por defecto en la definición de una restricción PRIMARY KEY cuando crea una tabla con restricción de clave principal. estas restricciones se definen cuando se crea o modifica una tabla.67-146 El siguiente comando CREATE INDEX usa las configuraciones por defecto para todas las cláusulas opcionales: CREATE INDEX Indice01 ON Tabla01(Columna01) Un índice llamado Indice01 se crea sobre Tabla01. Todas las propiedades concuerdan con los valores por defecto de las base de datos. El índice no tiene unicidad y no es agrupado. por lo que la tabla será físicamente ordenada por la clave del índice y los valores de la clave serán únicos. Se puede especificar NOT NULL pero está implícita en la definición de la restricción PRIMARY KEY.. SORT_IN_TEMPDB Un índice llamado Indice01 reemplazará al índice existente del mismo nombre creado sobre la tabla Tabla01. Las cláusulas CLUSTERED y UNIQUE configuran al índice como agrupado y sin valores duplicados. La cláusula FILLFACTOR establece que las páginas de nivel hoja del índice estén llenas en un 40% al crearse el índice. Como se vio.

SQL Server desperdiciaría recursos en mantener índices en desuso.nombre_indice El nombre de la tabla o de la vista debe ser incluido en el comando DROP INDEX. s debe especificar si se está modificando. Se pueden eliminar varios índices con un solo comando DROP INDEX.68-146 Una tabla llamada Tabla01 es creada con una sola columna llamada Columna01. Administrar índices Las tareas de mantenimiento de índices incluyen reconstrucción. Si se elimina el índice agrupado utilizando el comando . cualquier índice no agrupado sobre la misma tabla o vista usará el índice agrupado y su clave. Una restricción de unicidad crea un índice no agrupado salvo que se especifique la cláusula CLUSTERED y que no exista previamente un ningún índice agrupado.nombre_indice | nombre_vista. que es un índice agrupado con valores únicos de clave por defecto. Se reconstruye para la mantener un factor de llenado personalizado o para reorganizar el almacenamiento de los datos del índice para eliminar su fragmentación. eliminación. Un índice se elimina si no se lo va a utilizar más o si esta corrupto. agregando o eliminando una restricción. y renombrado.Indice01. Vista01. Los índices se renombran si cambió la convención de nombres adoptada o si existen índices que no respetan la convención de nombres. Eliminar un índice Los índices en desuso de tablas que son frecuentemente actualizadas con nueva información deberían ser removidos. Reconstruir un índice Si existe un índice agrupado sobre una tabla o una vista. Por ejemplo. Use la siguiente sintaxis para eliminar un índice: DROP INDEX nombre_tabla.Indice02 Se puede eliminar un índice usando el Object Browser en el Query Analizer o utilizando el Entreprise Manager. El siguiente comando borra un índice de una tabla y uno de una vista: DROP INDEX Tabla01. En caso contrario. la cláusula PRIMARY KEY define a Columna01 con una restricción de clave principal llamada pk_columna01. el siguiente comando ALTER TABLE agrega una columna una restricción UNIQUE para la tabla Tabla01: ALTER TABLE tabla01 ADD Columna02 int CONSTRAINT uk_columna02 UNIQUE La restricción de unicidad se llama uk_columna02 y es un índice no agrupado. El uso de cláusulas opcionales para la creación de índices personaliza el siguiente comando CREATE TABLE: CREATE TABLE Tabla01 (Columna01 int CONSTRAINT pk_columna01 PRIMARY KEY WITH FILLFACTOR = 50 ON SECONDARY) La sintaxis de ALTER TABLE para crear o modificar restricciones PRIMARY KEY o UNIQUE es similar a la del comando CREATE TABLE. En el comando ALTER TABLE.

Si se usa el comando DBCC DBREINDEX sin indicar ningún índice se reconstruirán todos los índices de la tabla o vista. Como resultado. los índices no agrupados no son reconstruidos y la tabla no es reordenada. El parámetro de entrada @objtype debe ser configurado como ‘INDEX’ o el procedimiento almacenado será incapaz de ubicar el tipo de objeto correcto a ser renombrado. la cláusula DROP_EXISTING provee de mayor eficiencia al proceso de reconstrucción del índice. el siguiente comando DBCC DBREINDEX reconstruirá el índice para la restricción de clave primaria: DBCC DBREINDEX (Tabla01. Esta capacidad evita tener que utilizar múltiples comandos DROP INDEX y CREATE INDEX para reconstruir múltiples índices.indice02 en vez de indice02. si se especifica @newname = ‘Tabla01. @newname = ‘indice02’. el procedimiento almacenado no podría encontrar al índice para renombrarlo. Por ejemplo. Si se utiliza el comando CREATE INDEX con la cláusula DROP_EXISTING para reemplazar un índice agrupado con idéntica clave de índice. El comando DBCC DBREINDEX es especialmente útil para índices creados por las restricciones de clave primaria y de unicidad.69-146 DROP INDEX se provocará que todos los índices no agrupados sean reconstruidos para que utilicen el RID (en vez de la clave del índice).indice02’ el índice se llamaría Tabla01. Para tablas o vista grandes con varios índices. La cláusula DROP_EXISTING de un comando CREATE INDEX reemplaza un índice con el mismo nombre de una tabla o vista. este proceso de reconstrucción puede consumir bastantes recursos. es usar el procedimiento almacenado del sistema sp_rename. Una forma mas simple de renombrar un índice. el nombre de la tabla fue intencionalmente excluido del parámetro @newname. DBCC DBREINDEX es comúnmente utilizado para reestablecer la configuración del factor de llenado sobre los índices a fin de bajar la frecuencia de división de las páginas del índice. El siguiente ejemplo muestra como renombrar un índice llamado indice01 por indice02. Por ejemplo. se procederá a la reconstrucción de todos los índices en la tabla o vista.pk_columna01. sin embargo. @objtype = ‘INDEX’ El nombre de la tabla fue incluido en el parámetro de entrada @objname. mas que DBCC DBREINDEX. uno o más índices sobre una tabla o vista. 60) El índice pk_columna01 soblre la restricción de clave primaria pk_columna01 es reconstruido con un factor de llenado del 60 por ciento. . no es necesario borrar la restricción antes de reconstruir el índice. El nombre de la tabla es innecesario en el parámetro @newname porque lo toma de parámetro @objname. Si un índice agrupado se recrea usando el comando CRETE INDEX provoca que todos los índices no agrupados sean reconstruidos utilizando para acceder a cada registro la clave del nuevo índice agrupado en vez del RID. Afortunadamente existen otros recursos para reconstruir un índice que eliminarlo y volverlo a crear. El comando DBCC DBREINDEX reconstruye. Si no se indica el nombre de la tabla en dicho parámetro. porque a diferencia de DROP INDEX. Si se cambia la clave del índice agrupado los índices no agrupados son reconstruidos y la tabla reordenada.indice01’ .. a través de un solo comando. Para reconstruir todos los índices. Utilizando el comando DBCC DBREINDEX o especificando la cláusula DROP_EXISTING en el comando CREATE TABLE. el siguiente comando fallará al borrar un índice sobre una restricción de clave primaria llamada pk_Columna01: DROP INDEX Tabla01. Sin embargo.pk_columna01 Sin embargo. sp_rename @objname = ‘Tabla01. Renombrar un índice Se puede renombrar un índice eliminándolo y recreándolo. el índice es reconstruido. utilice el comando DBCC DBREINDEX para reconstruir el índice agrupado y por lo tanto. ya que si se lo incluyera el nuevo nombre del índice incluiría el nombre de la tabla.

Columnas que sean usadas más frecuentemente en la cláusula JOIN. • • • • Índices no agrupados Recuerde siempre que. lo que permite una más rápida exploración del rango. Los siguientes tipos de consultas. el orden de los valores de clave en el árbol binario será el mismo que las columnas especificadas en la cláusula ORDER BY. Las siguientes reglas le ayudarán a determinar cuándo elegir un índice agrupado: • Columnas en las que el índice tenga pocos valores distintos. SQL Server puede prescindir de crear una tabla de trabajo temporal interna para realizar la ordenación de los datos. Columnas en las que se suelan realizar búsquedas de rangos de valores. las instrucciones de modificación de datos se harán mas lentas. Puesto que sólo se permite crear un índice agrupado por tabla. Consultas que puedan devolver grandes conjuntos de resultados con valores de clave adyacentes.70-146 Elegir un índice Esta sección provee lineamientos adicionales para determinar cuando crear un índice y decidir que propiedades del índice configurar para un óptimo rendimiento. Por lo que un diseño cuidadoso del índice no agrupado será mas importante que el diseño de los índices no agrupados. La siguiente consulta es un ejemplo de situación en la que SQL Server evita el paso adicional de crear una tabla de trabajo para una ordenación: • . Cualquier consulta que trate de extraer registros con tales claves encontrará todos los valores con un número mínimo de operaciones de E/S. todos los valores duplicados se mantienen agrupados. El Query Optimizer luego selecciona uno o mas índices para realizar la consulta. Columnas que suelan ser especificadas en la cláusula ORDER BY. selecciones dicho índice de manera juiciosa. Consultas que empleen columnas indexadas en las cláusulas WHERE y ORDER BY Si el Query Optimizer selecciona un índice no agrupado. separadas o en combinación se benefician de los índices: Índices agrupados Puesto que los datos están ordenados físicamente según una clave agrupada. SQL Server puede usar este índice para localizar las páginas inicial y final del rango especificado. Puesto que los datos están físicamente ordenados. En tales casos. realizar búsquedas mediante un índice agrupado es casi siempre más rápidos que realizarlas mediante un índice no agrupado. Las siguientes reglas le ayudarán a elegir el índice no agrupado correcto para su entorno: • Columnas que tengan un gran número de valores diferentes o consultas que devuelvan conjuntos de resultados pequeños. Se crean índices de acuerdo a los tipos de consultas que los usuarios comúnmente ejecutan contra la base de datos. a medida que añada mas índices al sistema. Tenga en cuenta que solamente un índice agrupado es permitido por tabla o vista. SQL Server puede utilizar un índice no agrupado para acceder de forma bastante eficiente a los registro individuales. Puesto que los datos ya están ordenados. SQL Server no tiene que volverlos a ordenar. en realidad una página de datos. los punteros de un índice agrupado hacen referencia a las páginas en las que los datos residen. Puesto que la página hoja de un índice agrupado es. Puesto que las páginas hojas de un índice no agrupado contienen punteros al identificador de la fila de la página de datos.

al disponer de más índices. haciendo que haya un mayor número de niveles de árbol binario. el optimizador puede explorar rápidamente múltiples índices para crear el plan de acceso más eficiente. la selectividad de la misma se hace también mejor. cuanto más ancha sea la clave. por tanto. para llegar a una fila específica. Si está tratando de determinar si usar una clave ancha. Autor_Nombre FROM Autores WHERE Autor_Apellido LIKE ‘M%’ Mucha otras consultas que utilicen una cláusula de agregación (como MIN.71-146 SELECT * FROM Autores WHERE Estado LIKE “c%” ORDER BY Estado Recubrimiento de índice El recubrimiento de índice es una situación en que todas las columnas de las cláusulas SELECT y WHERE de la consulta forman también parte del índice no agrupado o de la clave del índice agrupado (si es que existe). pero es buena para las columnas combinadas. Desde luego. MODULO III: Implementar una base de datos y sus tablas TEMA 1: Principios del álgebra relacional Un panorama general del álgebra: El álgebra relacional consiste en un conjunto de operadores de alto nivel que operan sobre relaciones. experimente creando múltiples índices y compruebe la distribución de cada columna. La ventaja es que con claves más pequeñas. que crear índices anchos da como resultado un mejor rendimiento. Si la selectividad de las columnas individuales es mala. Basándose en los pasos de distribución y en la densidad de índice podrá tomar la decisión que mejor funcione para su entorno. compruebe la distribución individual de cada miembro de la clave compuesta. Para obtener la combinación correcta. Para obtener un mejor rendimiento de las consultas. llene la tabla con datos tomados del mundo real. SQL Server debe realizar más operaciones de E/S. La consulta siguiente es un ejemoplo de recubrimiento de índice mediante agregados: SELECT COUNT(Autor_Apellido) FROM Autores WHERE Autor_Apellido LILE ‘M%’ Índices compuesto frente a índices múltiples A medida que la clave se hace más ancha. cree múltiples índices estrechos. Para ello utilice el valor de la selectividad que es el cociente entre la cantidad de registros distintos de la clave sobre el total de registros de la tabla y configura la inversa de la densidad de la clave Si la selectividad de la columnas individuales es muy buena (mayor al 70%). pero eso no es cierto de manera general. tiene sentido disponer claves más anchas en una tabla. Asimismo. El siguiente ejemplo tiene n índice no agrupado sobre las columnas Autor_Apellido y Autor_Nombre de la tabla Autores SELECT Autor_Apellido. Esto tiene como resultado una consulta mucho más rápida porque toda la información puede provenir directamente de la página índice y SQL Server evita realizar accesos a las páginas de datos. el optimizador puede elegir entre varias alternativas. AVG. Pudiera parecer. sería posible en principio definir cualquier cantidad de operadores que se . MAX. en lugar de unos pocos anchos. menos filas puede almacenar SQL Server en la páginas de índice. considere partir el índice en múltiples índices. Cada uno de estos operadores toma una o dos relaciones como entrada y produce una nueva relación como salida. como consecuencia. etc) o que comprueben la existencia de un criterio también se benefician del recubrimiento de índice. La razón es que.

Codd tenia un claro objetivo cuando definió precisamente estos ocho operadores. construye una relación que contiene todas las posibles combinaciones de tuplas. una binaria y una unaria. las operaciones tradicionales de conjuntos unión. Unión: Construye una relación formada por todas las tuplas que aparecen en cualquiera de las dos relaciones especificadas.72-146 ajustaran a esta sencilla definición (ya sea una o dos relaciones como entrada. proyección. Proyección: Extrae los atributos especificados de una relación dada. funcionan como sigue: Restricción: Extrae las tuplas especificadas de una relación dada (o sea. Reunión: A partir de dos relaciones especificadas. Pero el lector debe entender que sin duda es posible definir operadores adicionales de naturaleza algebraica. y los utilizaremos como base para el análisis de varios conceptos algebraicos. y no conjuntos arbitrarios. una de cada una de las dos relaciones. Producto: A partir de dos relaciones especificadas. y en efecto muchos de ellos han sido propuestos por distintos autores. intersección. tales que las dos tuplas participantes en una combinación dada satisfagan alguna condición especificada. Intersección: Construye una relación formada por aquellas tuplas que aparezcan en las dos relaciones especificadas. y lo analizaremos en el siguiente capitulo. reunión y división. las operaciones relacionales especiales restricción. en dos grupos de cuatro cada uno: 1. En este capitulo analizaremos primero los operadores originales de Codd (o al menos nuestra versión de esos operadores). Los ocho operadores originales se representan en forma simbólica en la figura A grandes rasgos. diferencia y producto cartesiano (todas ellas con ligeras modificaciones debidas al hecho de tener relaciones como operandos. . después de todo. construye una relación que contiene todas las combinaciones posibles de tuplas. una relación es un tipo especial de conjunto) y. una de cada una de las dos relaciones. Por añadidura. 2. Diferencia: Construye una relación formada por todas las tuplas de la primera relación que no aparezcan en la segunda de las dos relaciones especificadas. otra relación como salida) No obstante. Codd definió un conjunto muy especifico de ocho operadores de este tipo. restringe la relación sólo a las tuplas que satisfagan una condición especificada. en seguida consideraremos cómo podría ser conveniente ampliar el conjunto original de Codd. División: Toma dos relaciones. y construye una relación formada por todos los valores de un atributo de la relación binaria que concuerdan (en el otro atributo) con todos los valores en la relación unaria.

73-146 Figura 1: Los ocho operadores originales (panorama general) .

Sin embargo. . la unión del conjunto de tuplas de proveedores en la relación S y el conjunto de tuplas de partes en la relación P será sin duda un conjunto. lo cual significa. Como una relación es. Vamos a suponer. y b. desde luego. o la diferencia de una unión y una intersección. producto cartesiano ampliado). o una reunión de dos restricciones. Un termino mas preciso para el concepto ¨la misma forma¨ es compatibilidad respecto a la unión. y desecharla en ese momento si no. en términos precisos que: a. cuando hablamos de la importancia de la cerradura y decimos que el resultado de toda operación es otra relación. o en ambas. se habrá conservado la propiedad de cerradura. no es una relación. Y. en términos informales. es posible escribir expresiones relacionales anidadas. En matemáticas. No es nuestra intención sugerir que el sistema debe siempre materializar en su totalidad el resultado de cada operación individual. el sistema trata hasta donde puede de no materializar resultados intermedios en su totalidad. el resultado será un conjunto formado por todas las tuplas que aparecen en una de las relaciones originales. los atributos con el mismo nombre en las dos relaciones) se definen sobre el mismo dominio. es decir. por tanto. Las operaciones tradicionales de conjuntos: Ahora examinaremos con cierto detalle las operaciones individuales del álgebra relacional original Las operaciones tradicionales de conjuntos son unión. expresiones en las cuales los operandos mismos están representados mediante expresiones. que deben tener por fuerza el mismo grado). De hecho. Nota: Existe una analogía obvia entre la capacidad de anidar expresiones algebraicas en álgebra relacional y la capacidad de anidar expresiones aritméticas en aritmética ordinaria. En efecto el hecho de que las relaciones estén cerradas en el álgebra es importante exactamente por las mismas razones por las que es importante el hecho de que los números estén cerrados en la aritmética ordinaria. que estamos tratando de calcular una restricción de una reunión. por ejemplo. las relaciones no pueden contener una mezcla de diferentes tipos de tuplas. Por cierto. aunque el resultado es un conjunto. Si las dos relaciones tienen la misma forma en este sentido. etc. en otras palabras. o las dos deben contener tuplas de partes. En otras palabras. más bien. es posible (por ejemplo) sacar la proyección de una unión. un conjunto (de tuplas). podremos obtener su unión. o a ambos. el resultado de una operación puede convertirse en operando de otra. diferencia y producto (en términos más precisos. Por ejemplo. En esencia. es una forma limitada de unión. Por tanto. por ejemplo. el resultado intermedio producido por la reunión podría no existir nunca en si mismo como una relación materializada por completo. en la cual se obliga a las dos relaciones de entrada a tener lo que podríamos llamar en términos informales ¨la misma forma¨. y como regla general. es decir. y el resultado será también una relación con la misma forma. por razones de desempeño obvias. Dicho de otro modo. los atributos correspondientes (es decir. Diremos que dos relaciones son compatibles respecto a la unión si y solo si sus cabeceras son idénticas. todos son relaciones. y no sólo mediante nombres. Veremos muchos ejemplos de tales operaciones anidadas mas adelante en este tema. la unión de dos conjuntos es el conjunto de todos los elementos pertenecientes a uno de los conjuntos originales. Al construirse cada tupla de la reunión. Así pues. que las dos deben contener tuplas de proveedores. el sistema puede aplicar de inmediato la restricción a la tupla para ver si debe incluirse en el resultado final. la unión incluida en el álgebra relacional no es la unión matemática completamente general. Nos concentraremos primero en la unión. estamos hablando desde luego desde un punto de vista conceptual. y no una mezcla. deben ser ¨homogéneas en sus tuplas¨. queremos que el resultado sea una relación: deseamos conservar la propiedad de cerradura.74-146 Adviértase que el resultado de cada una de las operaciones es (por supuesto) otra relación. intersección. Esta es la importantísima propiedad de cerradura. las dos tienen el mismo conjunto de nombres atributos (adviértase. resulta obvio que es posible construir la unión de dos relaciones. dado que el resultado de cualquier operación es un objeto del mismo tipo que los operandos.

la intersección y la diferencia requieren todas operandos compatibles respecto a la unión (se aplican argumentos análogos a los presentados en el caso de la unión. y que suministran la parte P1. A UNION B. no tiene este requerimiento (aunque si tiene otro requerimiento distinto). — Diferencia La diferencia entre dos relaciones compatibles respecto a la unión A y B. intersección y diferencia. Figura 2: Ejemplos de unión. A MINUS B. también a la intersección y a la diferencia). no cuatro (se eliminan las tuplas repetidas). Entonces A UNION B. consistirá en los proveedores que o bien están situados en Londres. Ejemplo: Una vez más. es una relación cuya cabecera es idéntica a la de A o B y cuyo cuerpo está formado por todas las tuplas t pertenecientes ya sea a A o a B (o a las dos) Ejemplo: sean A y B las relaciones presentadas en la figura (A contiene en términos intuitivos. véase la parte B de la figura. véase la parte (a) de la figura. es una relación cuya cabecera es idéntica a la de A o B y cuyo cuerpo está formado por todas las tuplas t pertenecientes a A . Unión (A UNION B) S# S1 S4 S2 SNOMBRE Salzar Corona Jaimes SITUACION 20 20 10 CIUDAD Londres Londres Paris Interseccion (A INTERSECT B) S# S1 SNOMBRE Salazar SITUACION 20 CIUDAD Londres Diferencia (A MINUS B) S# S4 SNOMBRE SITUACION CIUDAD S# Corona 20 Londres S2 SNOMBRE SITUACION CIUDAD Jaimes 10 Paris. consistirá en los proveedores situados en Londres. los proveedores de Londres y B contiene los proveedores que suministran la parte P1).75-146 La unión. Relaciones base A S# S1 S4 SNOMBRE SITUACION CIUDAD B Salazar 20 Londres Corona 20 Londres S# S1 S2 SNOMBRE SITUACION CIUDAD Salazar 20 Londres Jaime 10 Paris. Adviértase que el resultado tiene tres tuplas. — Unión La unión de dos relaciones A y B compatibles respecto a la unión. A INTERSECT B. es una relación cuya cabecera es idéntica a la de A o B y cuyo cuerpo está formado por todas las tuplas t pertenecientes tanto a A como a B. El producto cartesiano. en cambio. — Intersección La intersección de dos relaciones compatibles respecto a la unión A y B. sean A y B las relaciones presentadas en la figura Entonces A INTERSECT B. o que suministran la parte P1 (o las dos cosas).

. como la tiene la resta en aritmética ordinaria (por ejemplo. no de pares ordenados de tuplas (aquí también empleamos términos un poco informales).. se verá que el producto cartesiano es necesario como paso intermedio en la definición de la operación reunión theta¨ (y esta ultima operación si es importante en la práctica). am) y (B1: b1. se presentará un problema si esas dos cabeceras tienen algún nombre de atributo en común. A2: A2.. B2: b2. Aquí. Ahora bien.. Es decir.. como una relación cuya cabecera es la combinación de las cabeceras de A y B y cuyo cuerpo está formado por el conjunto de todas las tuplas t tales que t es la combinación de una tupla a perteneciente a A y una tupla b perteneciente a B. No debemos terminar este análisis del producto cartesiano sin señalar que esta operación no tiene mucha importancia práctica... .. definimos el producto cartesiano de dos relaciones (compatibles respecto al producto) A y B. Am. si necesitamos formar el producto cartesiano de dos relaciones cuyas cabeceras tienen nombres de atributo en común.. estará formada por todas las combinaciones de números de proveedor/número de parte vigentes.. en la cual cada par ordenado de tuplas es reemplazado por la tupla resultante de la combinación de las dos tuplas en cuestión. en otras palabras. la versión del producto cartesiano en álgebra relacional es una forma ampliada de la operación. Así pues. ¨combinacion¨ significa en esencia unión (en el sentido de la teoría de conjuntos.... Así.76-146 pero no a B. B2: b2. — Producto cartesiano ampliado. no del álgebra relacional). Entonces A MINUS B contendrá los proveedores situados en Londres que no suministran la parte P1. Bn: bn) (se muestran los nombres de atributos para hacerlas más explicitas).. B1: b1. Relaciones base A S# S1 B P# P1 .. En matemáticas..2¨ y ¨2-5¨ son diferentes en aritmética).. Bn: bn) Otro problema que surge en conexión con el producto cartesiano es la necesidad de una cabecera bien formada para la relación resultante. Por tanto. es evidente que la cabecera del resultado es en esencia sólo la combinación de las dos cabeceras de las dos relaciones de entrada. Por tanto.. el producto cartesiano de dos relaciones sería un conjunto de pares ordenados de tuplas... dadas las dos tuplas (A1:a1. y B MINUS A incluirá los proveedores que suministran la parte P1 y no están situados en Londres.. deberemos modificar de manera apropiada los nombres de los atributos.. Entonces diremos que dos relaciones son compatibles respecto al producto si y solo si sus cabeceras son disjuntas (es decir. Por tanto. Adviértase que MINUS tiene cierta direccionalidad. es decir. el producto cartesiano de dos conjuntos es el conjunto de todos los pares ordenados de elementos tales que el primer elemento de cada par pertenece al primer conjunto y el segundo elemento de cada par pertenece al segundo conjunto.. no tienen nombres de atributo en común). El producto cartesiano se incluye en el álgebra relacional sobre todo por razones conceptuales. ¨5 . la combinación de las dos es la tupla única (A1:a1.. no es muy importante en la práctica que un sistema relacional maneje esa operación (aunque de hecho la mayor parte de ellos lo hacen ). Am. En particular. . Pero (una vez más) deseamos conservar la propiedad de cerradura.. A2: A2.. Ejemplo: Sean A y B las relaciones presentadas en la figura. am. véase la parte inferior de la figura. A TIMES B. deseamos un resultado compuesto de tuplas. Ejemplo: Sean A y B las relaciones presentadas en la figura (A.. consiste en todos los números de proveedores vigentes y B en todos los números de parte vigentes) Entonces A TIMES B. en términos intuitivos..

es decir. por comodidad.77-146 S2 S3 S4 S5 P2 P3 P4 P5 P6 Producto Cartesiano (A TIMES B) S# S1 S1 S1 S1 S1 S1 P# P1 P2 P3 P4 P5 P6 S2 S2 S2 S2 S2 S2 P1 P2 P3 P4 P5 P6 S3 S3 S3 S3 S3 S3 P1 P2 P3 P4 P5 P6 S4 S4 S4 S4 S4 S4 P1 P2 P3 P4 P5 P6 S5 S5 S5 S5 S5 S5 P1 P2 P3 P4 P5 P6 Figura 3: Ejemplo de producto cartesiano. si A. es decir. nos permitiremos escribir una secuencia de uniones sin insertar paréntesis. entonces las expresiones ( A UNION B) UNION C y A UNION (B UNION C) son equivalentes Así. cualquiera de las dos expresiones anteriores puede simplificarse a: A UNION B UNION C Sin provocar ambigüedad. las expresiones A UNION B . Señalamos también que la unión. la intersección y el producto (pero no la diferencia) son conmutativas.B y C son ¨proyecciones¨ arbitrarias (en el sentido de la figura 13. Asociatividad Es fácil comprobar que la unión es asociativa. Algo análogo puede decirse de la intersección y el producto (pero no de la diferencia). por ejemplo.2).

A WHERE c1 OR c2 Se define como equivalente a ( A WHERE c1) UNION (A WHERE c2) 3. Se puede especificar un valor literal en vez del atributo X o del atributo Y (o de ambos. La operación de restricción tal como se acaba de definir permite sólo una comparación simple en la cláusula WHERE (donde). A WHERE c1 AND c2 Se define como equivalente a (A WHERE c1) INTERSECT (A WHERE c2) 2. >. Además. — Restricción Sea theta la representación de cualquier operador de comparación escalar simple (por ejemplo =. proyección. desde luego).). Por ejemplo: A WHERE X theta literal Adviértase que el operador de restricción theta produce en realidad un subconjunto ¨horizontal¨ de una relación dada. de hecho. Operaciones relacionales especiales: Ahora nos ocuparemos de las operaciones relacionales especiales restricción. (Los atributos X y Y deben estar definidos sobre el mismo dominio y la operación theta debe ser aplicable a ese dominio. No obstante. La restricción theta de la relación A según los atributos X y YA WHERE X theta Y Es una relación con la misma cabecera que A y con un cuerpo formado por el conjunto de todas las tuplas t de A tales que la evaluación de la comparación ¨X theta Y¨ resulta verdadera en el caso de esa tupla t. es decir.>=. A WHERE NOT c Se define como equivalente a A MINUS (A WHERE c) . es posible. Nota: se acostumbra abreviar ¨restriccion theta¨ a sólo ¨restriccion¨.78-146 y B UNION A Son equivalentes también. etc. según se indica con las siguientes equivalencias: 1. la relación A no debe ser por fuerza una relación nombrada. esto es lo más común en la práctica. por supuesto. reunión (varias clases) y división. <>. y lo mismo sucede con INTERSECT y TIMES. en virtud de la propiedad de cerradura. ampliar la definición sin ambigüedad a una forma en al cual la expresión arbitraria de tales comparaciones simples. el subconjunto de las tuplas de la relación dada para las cuales se satisface una comparación especificada. y puede representarse mediante una expresión arbitraria del álgebra relacional).

por ejemplo.. representa la proyección identidad. la sintaxis de la figura 13.. y el valor z en Z. Una expresión condicional como ésta (es decir. en este caso la relación A tampoco necesita ser una relación nombrada.Z:z) tales que una tupla t aparece en A con el valor X en X..2 si permite omitir del todo la lista de atributos. En la figura 4 se presentan algunos ejemplos de restricción.Y.. lo mismo puede decirse también de los otros ejemplos.79-146 En adelante daremos por hecho que la expresión condicional en la cláusula WHERE de una restricción está formada por este tipo de combinaciones booleanas arbitrarias de comparaciones simples.... la especificación de una lista vacía..6 se presentan algunos ejemplos de proyección.. y puede representarse mediante una expresión arbitraria. S (CIUDAD) CIUDAD .. Sin embargo.. S WHERE CIUDAD = ¨Londres¨ S# S1 S4 P WHERE PESO < 14 SNOMBRE Salazar Corona SITUACION 20 20 CIUDAD Londres Londres P# P1 P5 PNOMBRE Tuerca Leva COLOR Rojo Azul PESO 12 12 CIUDAD Londres Paris SP WHERE S# = ¨S1¨ AND P# = ¨P1¨ S# S1 Figura 4: Ejemplos de restricción. Omitir por completo esta lista equivale a especificar una lista con todos los atributos de la relación original. En la figura 13. (En cambio. Obsérvese en el primer ejemplo (la proyección de proveedores según el atributo CIUDAD) que. el valor y en Y. . es decir. representaría la proyección nula...Y.. como en R (). Así... P# P1 CANTIDAD 300 — Proyección La proyección de la relación A según los atributos X. Y:y. Nota: ningún atributo puede especificarse más de una vez en la lista de atributos de una operación de proyección (¿por qué no?). las tuplas repetidas se elimina (como siempre). el operador de proyección produce un subconjunto ¨vertical¨ de una relación dada. una validez en el caso de una tupla determinada puede establecerse con sólo examinar esa tupla aislada) se conoce como condición de restricción. sólo hay tres ciudades en el resultado. ZA (X.Z) Es una relación con (X. aunque la relación S tiene cinco tuplas y por tanto cinco ciudades...Y. Desde luego. como ya se explicó. o sea. Desde luego.... Z) como cabecera y cuyo cuerpo está formado por el conjunto de todas las tuplas (X:x. el subconjunto obtenido mediante la selección de los atributos especificados y la eliminación de las tuplas repetidas dentro de los atributos seleccionados.

Definitivamente. Y2... Y:y. La reunión natural de A y B A JOIN B Es una relación con la cabecera (X..... es decir. respectivamente.. Vamos a suponer también que los atributos correspondientes (es decir..80-146 Londres Paris Atenas P (COLOR.Zp son los demás atributos de B.Y. Y2...Yn) y (Z1.. según el atributo común CIUDAD) .. Consideremos ahora (X1. — Reunión natural La operación de reunión tiene varias formas distintas.Y2...X2.. Como siempre. Sean las cabeceras de las relaciones A y B.... YN son (los únicos) comunes a las dos relaciones.Y y Z.. las relaciones A y B pueden estar representadas por expresiones arbitrarias.X2. X2.. En la figura se presenta un ejemplo de reunión natural (la reunión natural S JOIN P.Z2. (X1.... los atributos Y1...Z2.Y2..Z) y un cuerpo formado por el conjunto de todas las tuplas (X:X.. CIUDAD) COLOR Rojo Verde Azul Azul CIUDAD Londres Paris Roma Paris ( S WHERE CIUDAD = ¨Paris¨) (S#) S# S2 S3 Figura 5: Ejemplos de proyección. que definimos como sigue.. y los atributos Z1. Yn) y (Y1.. los atributos con el mismo nombre) están definidos sobre el mismo dominio... Y1.Xm.Xm son los demás atributos de A. los atributos X1.....Xm).Zp) como tres atributos compuestos X. Z2.Zp) respectivamente... (Y1.Z1.... y una tupla b aparezca en B con el valor y en Y y el valor z en Z.Yn. la más importante es la reunión natural. Z:z) tales que una tupla a aparezca en A con el valor x en X y el valor y en Y..

La reunión theta es adecuada para aquellas ocasiones (poco frecuentes en comparación. la reunión natural degenera en el producto cartesiano. a A JOIN B JOIN C Además. Sean las relaciones A y B compatibles . en este caso).81-146 La reunión natural. ( A JOIN B ) JOIN C y A JOIN (B JOIN C) Se puede simplificar. A JOIN B es equivalente a A TIMES B (es decir. es tanto asociativa como conmutativa (Ejercicio: Comprobar estas aseveraciones). En consecuencia. las dos expresiones A JOIN B Y B JOIN A son equivalentes. sin provocar ambigüedad. las dos expresiones. tal como la hemos definido.theta Ahora pasamos a la operación de reunión theta. si A y B no tienen nombres de atributos en común. Cabe señalar que. S# S1 S1 S1 S2 S2 S3 S3 S4 S4 S4 SNOMBRE SITUACION CIUDAD P# Salazar 20 Londres P1 Salazar Salazar Jaime Jaime Bernal Bernal Corona Corona Corona 20 20 10 10 30 30 20 20 20 Londres P4 Londres P6 Paris Paris Paris Paris P2 P5 P2 P5 PNOMBRE COLOR PESO Tuerca Rojo 12 Birlo Engrane Perno Leva Perno Leva Tuerca Birlo Engrane Rojo Rojo Verde Azul Verde Azul Rojo Rojo Rojo 14 19 17 12 17 12 12 14 19 Londres P1 Londres P4 Londres P6 Figura 6: La reunión natural S JOIN P — Reunión . pero de ninguna manera desconocidas) en las cuales necesitamos juntar dos relaciones con base en alguna condición diferente a la igualdad.

siempre es equivalente a obtener el producto cartesiano ampliado de las dos relaciones (con modificaciones apropiadas de los nombres de los atributos. y sea theta un operador según la definición dada en el análisis de la restricción. S JOIN P Es equivalente a la siguiente expresión. y con un cuerpo formado por el conjunto de todas las tuplas t tales que t pertenece a ese producto cartesiano y la evaluación de condición ¨X theta Y¨ resulta verdadera para esa tupla t. la reunión natural tampoco es una operación primitiva. véase el análisis del producto cartesiano en la sección 13. La reunión theta de la relación A según el atributo X con la relación B según el atributo Y se define como el resultado de evaluar la expresión. CIUDAD. es una proyección de una restricción de un producto (una vez más. si es necesario). la única razón para cambiar el nombre de los dos es la simetría. (Los atributos X y Y deberán estar definidos sobre el mismo dominio. es una relación con la misma cabecera que el producto cartesiano de A y B. Adviértase que la reunión theta no es una operación primitiva. más compleja: ( ( S TIMES ( P RENAME CIUDAD AS PCIUDAD ) ) WHERE CIUDAD = PCIUDAD) (S#. por ejemplo. SNOMBRE.3). la reunión theta se llama equirreunion. PESO) S# SNOMBRE SITUACION CIUDAD P# PNOMBRE COLOR PESO PCIUDAD P1 Tuerca S2 Jaime 10 Paris Rojo 12 Londres S2 Jaime S2 Jaime S3 Bernal S3 Bernal S3 Bernal 10 10 30 30 30 Paris Paris Paris Paris Paris P4 Birlo P6 Engrane P1 Tuerca P4 Birlo P6 Engrane Rojo Rojo Rojo Rojo Rojo 14 19 12 14 19 Londres Londres Londres Londres Londres . PNOMBRE. COLOR. y la operación theta debe ser aplicable a ese dominio) Vamos a suponer. Nota: seria suficiente renombrar sólo uno de los dos atributos CIUDAD. Si theta es ¨igual a¨. El resultado se muestra en la figura. P#. con las operaciones apropiadas para renombrar atributos) Por ejemplo.82-146 respecto al producto (o sea. el resultado de una equirreunión debe incluir dos atributos con la propiedad de que los valores de esos dos atributos son iguales entre si en cada tupla de la relación. no tienen nombres de atributos en común. SITUACIÓN. y después realizar una restricción apropiada sobre el resultado. Por la definición. ( A TIMES B) WHERE X theta Y En otras palabras. que deseamos calcular la ¨reunion mayor que de la relación S según CIUDAD con la relación P según CIUDAD¨ Una expresión apropiada del álgebra relacional es: ( ( S RENAME CIUDAD AS SCIUDAD) TIMES ( P RENAME CIUDAD AS PCIUDAD) ) WHERE SCIUDAD > PCIUDAD. el resultado será la ¡la reunión natural! Por tanto. la expresión que representa la reunión natural de proveedores y partes (según ciudades). Si se elimina uno de esos dos atributos (lo cual puede hacerse mediante una proyección).

Yn) como dos atributos compuestos X y Y. el conjunto de resultados posee filas y columnas. — División: Sean las cabeceras de las relaciones A y B (X1... Además. los atributos Y1. MODULO III: Consultar y modificar datos TEMA 2: Acceder a los datos en una Base de Datos SQL Server El comando SELECT se utiliza para recuperar datos desde una base de datos SQL Server y para presentarlos al usuario en uno o mas conjuntos de resultados. Las tablas de donde se grabarán los datos del conjunto de resultados Las condiciones que las filas de las tablas fuentes deben cumplir para ser incluidas en el conjunto de resultado.. Yn) y (Y1. Como siempre... en términos informales). Al igual que una tabla. La división de A entre B. Por ejemplo.. El ordenamiento de las filas en el conjunto de resultados.....que de S y P según ciudades.Yn) respectivamente.83-146 Figura 7: La reunión mayor . Un conjunto de resultados es un arreglo tabular de los datos que se recupera al ejecutarse el comando SELECT.... Consideremos ahora a (X1. el resultado contiene todos los valores de X en A cuyos valores de Y correspondientes en A incluyen a todos los valores de Y en B. A tiene los atributos X1..Xm) y (Y1. Y1.X2...Yn son comunes a las dos relaciones. En otras palabras.. A DIVIDEBY B Es una relación con la cabecera (X) y un cuerpo formado por el conjunto de todas las tuplas (X:x) tales que aparece una tupla (X:x. Y2.. X2.. La mayoría de los comandos SELECT incluyen cuatro propiedades primarias del conjunto de resultados: • • • • La columnas a ser incluidas en el conjuntos de resultados... Y2.Y2. los atributos con el mismo nombre) están definidos sobre el mismo dominio. respectivamente) Vamos a suponer que los atributos correspondientes ( es decir.X2. y de cómo estos componentes pueden ser usados para recuperar datos específicos desde una base de datos SQLServer. Este tema proveerá de una vista general de los principales componentes del comando SELECT. (Las relaciones A y B representan al dividendo y al divisor..Xm y B no tiene otros atributos.. las relaciones A y B pueden ser expresiones.Y2.. el siguiente comando SELECT recupera el ID. es decir. nombre y precio unitario de cualquier producto cuyo precio unitario supere los $40: . Y:y) en A para todas las tuplas (Y:y) presentes en B.Xm. Los Fundamentos del comando SELECT Un comando SELECT en Transact-SQL permite recuperar datos desde una base de datos SQL Server.

La lista de selección es una serie de expresiones separadas por comas. la cláusula SELECT define qué columnas deberán ser recuperados y la cláusula FROM identifica la tabla que contiene estas columnas La cláusula WHERE limita las filas que serán incluidas en el conjunto de resultados a aquellos productos que tengan un valor de PrecioUnit mayor a $40. ingrese el siguiente código: SELECT DISTINCT CiudadVenta. Por último. La lista de selección puede también contener palabras claves que controlen el formato final del conjunto de resultados. la tabla Ordenes en la base de datos Northwind contiene valores duplicados en la columna CiudadVenta. Por ejemplo el siguiente comando SELECT retorna las primeras 10 ciudades en orden alfabético de la tabla Ordenes: . ProductoNombre. PrecioUnit FROM Productos WHERE PrecioUnit > 40 ORDER BY PrecioUnit ASC En este ejemplo. Por ejemplo. pero las principales cláusulas se pueden resumir como sigue: SELECT lista_de_selección [INTO nueva_tabla] FROM lista_de_tablas [WHERE condiciones_de_búsqueda] [GROUP BY lista_de_agrupamientos] [HAVING condiciones_de_búsqueda] [ORDER BY lista_de_ordenamiento [ASC | DESC] ] En el resto de este tema se verá cada cláusula en detalle. PERCENT especifica que n es el porcentaje de filas en el conjunto de resultados que se retornarán. RegionVenta FROM Ordenes ORDER BY CityVenta La palabra clave TOP n La palabra clave TOP n especifica que solo serán devueltas las primeras n filas del conjunto de resultados. Las columnas en el conjunto de resultados estarán en el mismo orden que la secuencia de expresiones en la lista de selección. la cláusula ORDER BY especifica que el conjunto de resultados estará ordenado de manera ascendente según el valor de la columna PrecioUnit. las filas son seleccionadas después que el conjunto de resultados se ordena. La palabra clave DISTINCT La palabra clave DISTINCT elimina filas duplicadas del conjunto de resultados. Para obtener una lista con los valores duplicados de la columna CiudadVenta removidos. Si se especifica ORDER BY. junto a ejemplos sobre como definir estas cláusulas para recuperar datos específicos desde una base de datos SQL Server. La sintaxis completa del comando SELECT es compleja. Usar palabras claves en la lista de selección. La cláusula SELECT La cláusula SELECT incluye la palabra clave SELECT y la lista de selección.84-146 SELECT ProductoID. Cada expresión define una columna del conjunto de resultado. El valor n indica el número de filas a ser retornadas (siempre que la palabra clave PERCENT no sea indicada).

RegionVenta FROM Ordenes ORDER BY CityVentas La palabra clave AS Se puede mejorar la comprensión de un comando SELECT dando a la tabla un alias.Empleados ORDER BY Apellido. el alias p se asigna a la tabla Editores: USE pubs SELECT p. Region FROM Northwind. y la columna Region. El nombre de la columna que contendrá los nombres de los empleados será Nombre_Empleado. tal como una expresión simple o una subconsulta escalar. Telefono_casa. toda referencia explícita a la tabla en un comando Transact-SQL debe usar el alias. El conjunto de resultado se ordenará primero por apellido y después por nombre.dbo. Se puede usar para crear una tabla nueva desde un servidor conectado. IDENTITYCOL AS "ID_Empleado". la columna Telefono_casa. Tipos de información en la lista de selección Una lista de selección puede incluir muchos tipos de información.. p.. Nombre ASC En este ejemplo.ed_id. El ejemplo utiliza un comando SELECT para recuperar valores desde las columnas Apellido y Nombre de la tabla Empleados: SELECT Nombre.ed_nonmbre FROM editores AS p IMPORTANTE Si se asigna un alias a una tabla. Los ejemplos siguientes muestran varios de los ítems que se pueden incluir en las listas de selección: SELECT Nombre + ' ' + Apellido AS "Nombre_Empleado". El conjunto de resultados también incluirá la columna de identificación llamada ID_Empleado.85-146 SELECT DISTINCT TOP 10 CiudadVenta. El comando SELECT. Se puede asignar un alias de tabla usando o no la palabra clave AS: • • nombre_tabla AS alias_tabla nombre_tabla alias_tabla En el ejemplo siguiente. Un espacio se inserta entre el nombre y el apellido. Apellido INTO NombresEmpleados FROM Empleados .INTO se utiliza para combinar datos de varias tablas o vistas en una nueva tabla. en vez del nombre de la tabla. los apellidos y los nombres de los empleados son combinados en una columna. La cláusula INTO La cláusula INTO habilita para especificar que el conjunto de resultados se utilizará para crear una tabla nueva con el nombre definido en la cláusula.

Cantidad) AS Precio FROM [Detalle_Orden] AS OrdD1 WHERE OrdD1.Cantidad) AS "Ventas_Unidas". una cláusula GROUP BY.dbo. Por ejemplo. lo que se discutirá mas adelante en detalle. la cláusula WHERE en el siguiente comando SELECT retornará solo aquellas filas cuyo valor para la región sea Washington: SELECT IDCliente. se puede usar la cláusula FROM para especificar combinaciones entre dos tablas o vistas. El conjunto de resultados no se muestra en el panel Results a no ser que específicamente se consulte la nueva tabla. y una cláusula HAVING: SELECT OrdD1. y solo se utilizan para construir el conjunto de resultados aquellas filas que satisfacen las condiciones de filtro. y la cláusula HAVING incorpora una restricción adicional tomando aquellas órdenes que incluyen más de 100 unidades. El siguiente comando SELECT incluye una cláusula WHERE.Precio_Unitario > $100) GROUP BY OrdD1. La cláusula FROM es una lista separada por comas de nombres de tablas.OrdenID HAVING SUM(OrdD1. y HAVING Las cláusulas WHERE y HAVING en un comando SELECT controlan qué filas de las tablas fuentes serán usadas para construir el conjunto de resultados. El comando SELECT usa la cláusula FROM para especificar la tabla Vendedores: SELECT * FROM Vendedores Por otra parte. NombreCompañia FROM Northwind. La cláusula GROUP BY . la cláusula FROM para unir tablas especificando las condiciones de unión en la cláusula JOIN. La cláusula FROM La cláusula FROM se requiere en todo comando SELECT que recupere datos de tablas o vistas. GROUP BY.Cantidad) > 100 En este comando SELECT. además. SUM(OrdD1. Las cláusulas WHERE y HAVING son filtros. La cláusula HAVING especifica filtros adicionales y posteriores a los aplicados por la cláusula WHERE. aún cuando se puede especificar sin la cláusula GROUP BY.PrecioUnitario * OrdD1. Las cláusulas WHERE. Se puede utilizar. La nueva tabla contendrá las columnas Nombre y Apellido. Especifican una serie de condiciones de búsqueda. la cláusula WHERE retornará solo aquellas órdenes que incluyan un producto con un precio unitario mayor a $100. Se dice que estas filas califican para participar del conjunto de resultados.86-146 El comando crea una nueva tabla llamada NombresEmpleados y guarda en ella el conjunto de resultados generado. La cláusula GROUP BY limitará las filas a valores distintos de la columna OrdenID. Se pueden asignar alias a las tablas y vistas mediante el uso de la cláusula AS. SUM(OrdD1. y estas columnas contendrán los valores de la tabla Empleados.OrdenID AS OrdenID. Se usa la cláusula FROM para listar las tablas y vistas que contienen las columnas referenciadas en la lista de selección y en la cláusula WHERE.Clientes WHERE Region = 'WA' La cláusula HAVING se usa típicamente en conjunción con la cláusula GROUP BY.OrdenID in (SELECT DISTINCT OrdD2.OrdenID FROM [Detalle_Orden] AS OrdD2 WHERE OrdD2. vistas y de cláusulas JOIN.

conocidas como columnas de agrupamiento. Cómo se procesan las cláusulas WHERE. La cláusula GROUP BY restringe las filas del conjunto de resultados. Esto reduce el número de filas a ser agrupadas. Para cualquier condición de búsqueda que se podría aplicar indistintamente antes o después de la operación de agrupamiento. Si se indican más de una columna en la cláusula ORDER BY el ordenamiento es anidado. Tipo. primero por Editor (en orden descendente). SQL Server tiene restricciones sobre los ítems que pueden ser especificados en la lista de selección cuando un comando SELECT contiene una cláusula GROUP BY. Cada fila del conjunto de resultados contendrá datos resumidos relacionados con el valor específico de la columna de agrupamiento. luego por tipo (en orden ascendente dentro de cada editor). La lista de selección puede contener las columnas de agrupamiento y expresiones que retornen sólo un valor para cada valor de las columnas de agrupamiento. Las únicas condiciones de filtro que deben ser indicadas en la cláusula HAVING son aquellas que deben ser aplicadas después que se realicen las operaciones de agrupamiento. La palabra clave GROUP BY se sigue de una lista de columnas. y HAVING Entender la secuencia correcta en la que las cláusulas WHERE. Habrá una sola fila para cada valor distinto de la o las columnas de agrupamiento. El siguiente comando ordena las filas en la tabla Titulos.87-146 La cláusula GROUP BY se utiliza para producir valores agregados para cada fila en el conjunto de resultados. Titulo. La cláusula ORDER BY La cláusula ORDER BY ordena el resultado de una consulta por una o más columnas (hasta 8060 bytes). La cláusula GROUP BY se aplica para agrupar el resultado de la cláusula WHERE. Precio MODULO III: Consultar y modificar datos Tema 3: Usar Técnicas Avanzadas de Consulta para Acceder a los Datos . se debe especificar el nombre de la columna de la tabla o vista. la cláusula HAVING se utiliza para filtrar las filas del resultado agrupado. se puede agrupar una tabla por una combinación de columnas. dado que no se indica DESC): USE Pubs SELECT Pub_id. esto es. y finalmente por precio (en orden ascendente. aunque no necesariamente. no el nombre de la columna del conjunto de resultados asignada con una cláusula AS. ayuda a formular consultas eficientes: • • • La cláusula WHERE se usa para filtrar las filas que resultan de aplicar las operaciones indicadas en la cláusula FROM. tal como funciones de agregación que tienen un nombre de columna como uno de sus parámetros Típicamente la cláusula HAVING se usa con la cláusula GROUP BY. Un ordenamiento puede ser ascendente (ASC) o descendente (DESC). GROUP BY. GROUP BY. Cuando no se usa la cláusula GROUP BY. se asume ASC. Si no se especifica una ordenamiento. Precio FROM Titulos ORDER BY Pub_id DESC. Tipo. Por último. En una cláusula GROUP BY. las funciones de agregación retornan un solo valor para un comando SELECT. Se puede listar más de una columna en la cláusula GROUP BY para anidar grupos. es más eficiente indicarla en la cláusula WHERE. y HAVING se aplican.

En caso que los tipos de datos no puedan ser convertidos de manera implícita. el motor de consultas elige el método más eficiente (de entre varias posibilidades) para procesar la combinación. Las combinaciones outer. mencionada en la cláusula FROM. se puede especificar cualquier otro operador relacional. Especificar las condiciones de combinación en la cláusula FROM. todas las columnas referenciadas deben ser indicadas de manera no ambigua. está listo para aprender técnicas de consultas más avanzadas. Se aplican las condiciones de combinación y las condiciones de búsqueda de la cláusula WHERE. la condición de combinación debe explícitamente convertir los tipos de datos usando la función CAST. No se requiere que la lista de selección contenga las columnas de todas las tablas en la combinación. Aunque la ejecución física de varias combinaciones usa diferentes caminos. UPDATE. Si los tipos de datos no son idénticos. Por ejemplo. siempre que esa fila cumpla con las condiciones de búsqueda de las cláusulas WHERE y HAVING. sin embargo. El nombre de la tabla debe ser utilizado para calificar cualquier nombre de columna que esté duplicado en dos o más tablas referenciadas en una consulta simple. y está familiarizado con varias de sus cláusulas. y muchas subconsultas pueden ser reescritas como combinaciones. así como otros predicados. se respeta la siguiente secuencia lógica: • • • Se aplican las condiciones de combinación de la cláusula FROM. Las condiciones de combinación se unen con las condiciones de búsqueda de las cláusulas WHERE y HAVING para controlar qué filas serán seleccionadas desde las tablas base referenciadas en la cláusula FROM. Ud. Las columnas usadas en las condiciones de combinación. Esta secuencia puede. Subconsultas pueden también ser anidadas dentro de otras subconsultas. y no ser referenciada en la lista de selección ninguna de las columnas de la tabla puente Aunque las condiciones de combinación utilizan generalmente el operador de comparación igual (=). Usar combinaciones para recuperar datos Usando combinaciones (joins). sirve para separarlas de cualquier otra condición que podría ser especificada en una cláusula WHERE y se recomienda para especificar combinaciones. Se pueden usar los elementos de Transact-SQL tales con CUBE y ROLLUP para resumir datos. NOTA La mayoría de las combinaciones pueden ser reescritas como subconsultas (una consulta anidada dentro de otra consulta). se pueden recuperar datos desde dos o más tablas basados en relaciones lógicas entre las tablas. retornan todas las filas desde al menos una tabla o vista. una tabla puede ser utilizada como puente desde una de las otras tablas a la tercera tabla.88-146 Una vez que ha logrado sentirse confortable con los fundamentos del comando SELECT. o DELETE. Cuando SQL Server procesa combinaciones. en una combinación de tres tablas. Otra técnica es la de usar subconsultas. Veremos subconsultas en detalle mas adelante. Cuando se referencian múltiples tablas en una sola consulta. La lista de selección para una combinación puede referenciar a todas las columnas de las tablas combinadas o a cualquier subconjunto de columnas. Las combinaciones se pueden especificar tanto en la cláusulas FROM o WHERE. Muchas combinaciones pueden ser categorizadas como combinaciones inner o outer. INSERT. Se aplican las condiciones de búsqueda de la cláusula HAVING. deben ser compatibles o ser tipos que SQL Server pueda convertir de manera implícita. no necesariamente deben tener el mismo nombre o el mismo tipo de datos. sin embargo. . Las combinaciones inner retornan las filas sólo cuando existe al menos una fila en ambas tablas que cumplen con la condición de combinación. las cuales se anidan dentro de otros comando SELECT. algunas veces. Una de estas técnicas es la de combinar el contenidos de una o mas tablas para producir un conjunto de resultados que incorpore filas y columnas de cada tabla. influenciar el resultado de la consulta si se mueven las condiciones entre la cláusulas FROM y WHERE. eliminando las filas que no se asocian a otra fila en la otra tabla. sin embargo. Las combinaciones indican cómo el SQL Server utilizará los datos de una tabla para seleccionar las filas en otra tabla.

a. y todas las filas de la tabla derecha son referenciadas en una combinación outer derecha. p. se usa una combinación outer izquierda para recuperar los apellidos y nombres de los autores y (cuando corresponda) los nombres de cualquier editor que se encuentre en la misma ciudad que el autor: USE Pubs SELECT a. a.Ed_id y la t.Ciudad = p.Au_apellido ASC.Ed_Nombre FROM Editores AS p INNER JOIN Titulos AS t ON p. Dado que este comando utiliza una combinación inner. SELECT t. esta retornará sólo aquellas columnas que tengan un valor igual en las columnas de la combinación (la columna p.Ed_id ORDER BY Titulo ASC Este comando SELECT recupera datos desde la columna Titulo en la tabla Titulos (t) y desde la columna Ed_Nombre en la tabla Editores (p).Au_nombre. un valor nulo es retornado para la columna Ed_nombre del conjunto de resultados. Combinaciones Outer SQL Server soporta tres tipos de combinaciones outer: izquierda (left). El siguiente comando SELECT usa una combinación inner para recuperar datos desde la tabla Editores y la tabla Titulos en la base de datos Pubs.Ed Publishers). Combinaciones inner establecidas en la cláusula WHERE son conocidas como combinaciones al viejo estilo.Ciudad ORDER BY p. a.Au_nombre ASC El conjunto de resultados para esta consulta listará el nombre de todos los autores de la tabla Autores. derecha (right).Ed_nombre ASC. En el SQL-92 estándar. Si un editor no se encuentra en la ciudad del autor.Titulo. p.Ed_nombre FROM Autores a LEFT OUTER JOIN Editores p ON a. El conjunto de resultados incluirá sólo aquellos editores que se encuentren en las mismas ciudades de los autores. Las únicas columnas que serán recuperadas de la tabla izquierda serán aquellas que cumplan con la condición de la combinación. Todas las filas de ambas tablas son retornadas en una combinación outer completa. En el siguiente comando SELECT. se usa una combinación outer derecha para obtener la lista de editores y los nombres y apellidos de los autores. Usar combinaciones outer izquierdas Un conjunto de resultados generado por un comando SELECT que incluye una combinación outer izquierda incluye todas las filas de la tabla referenciada a la izquierda del LEFT OUTER JOIN.Ed_id = t. si estos autores se encuentran en la misma ciudad de los editores: . Las únicas filas de la tabla de la derecha que se recuperarán serán aquellas que cumplan con la condición de la combinación.89-146 Combinaciones Inner Una combinación inner es una combinación en la cual los valores de las columnas a ser combinadas son comparados a través de un operador de comparación. Usar combinaciones outer derecha Un conjunto de resultados generado por un comando SELECT que incluye una combinación outer derecha incluirá todas las filas de la tabla referenciada a la derecha del RIGHT OUTER JOIN. y completa (full). Todas las filas recuperadas desde la tabla izquierda son referenciadas con una combinación outer izquierda. Las combinaciones inner son el único tipo de combinación que el SQL-92 soporta en la cláusula WHERE. las combinaciones inner pueden ser especificadas tanto en las cláusulas FROM o WHERE. En el siguiente comando SELECT.Au_apellido.

a. un valor nulo se retorna para las columnas Au_apellido y Au_ nombre del conjunto de resultados.Au_apellido.Ed_nombre FROM Autores a FULL OUTER JOIN Editores p ON a. a. .Au_nombre ASC El conjunto de resultados de esta consulta listará los nombre de todos los editores de la tabla Editores. En el ejemplo siguiente.Ciudad ORDER BY p. Si un autor no se encuentra en la ciudad del editor.Au_nombre. Una subconsulta puede usarse en cualquier lugar en que una expresión lo permita.Ciudad = p. El conjunto de resultados incluirá solo aquellos autores que se encuentren en la misma ciudad del editores. En el siguiente comando SELECT. un valor nulo se retorna en la columnas Au_apellido y Au_nombre del conjunto de resultados. p. a. Definir subconsultas dentro del comando SELECT Una subconsulta es un comando SELECT que retorna un valor simple y se encuentra anidado dentro de un comando SELECT. INSERT. sin tener en cuenta si los valores cumplen con la condición de la combinación. se retorna un valor nulo en la columna Ed_nombre del conjunto de resultados. la subconsulta puede ser evaluada como una consulta independiente.Ciudad ORDER BY p. En algunos comandos Transact-SQL. el cual es de $10.Au_nombre ASC El conjunto de resultados de esta consulta listará el nombre de todos los editores de la tabla Editores y todos los autores de la tabla Autores.Ciudad = p. a. las columnas de esta tabla no pueden ser incluidas en el resultado de la consulta exterior.90-146 USE Pubs SELECT a. Si una tabla figura solo en la subconsulta y no en la consulta exterior. Si un editor no se encuentra en la misma ciudad del autor. a.Au_apellido ASC. se anida una subconsulta en la cláusula WHERE de un comando SELECT: USE Northwind SELECT NombreProducto FROM Productos WHERE PreciioUnit = ( SELECT PrecioUnit FROM Productos WHERE NombreProducto = 'Sir Rodney''s Scones' ) El comando SELECT embebido primero ubica el valor de PrecioUnit de los Sir Rodney's Scones. a. Cuando se cumple la condición todas las columnas del conjunto de resultados tendrán un valor. Si un autor no se encuentra ubicado en la misma ciudad del editor.Ed_nombre ASC.Ed_nombre ASC. s usa una combinación outer completa para obtener la lista de los editores y los nombres y apellidos de los autores: USE Pubs SELECT a.Ed_nombre FROM Autores a RIGHT OUTER JOIN Editores p ON a. o DELETE o dentro de otra subconsulta. Usar combinaciones outer completas Un conjunto de resultados generado por un comando SELECT que incluya una combinación outer completa incluirá todas las filas desde ambas tablas. Este valor ($10) se usa luego en el comando SELECT exterior para obtener los nombres de los productos que tienen el mismo precio unitario. p.Au_apellido.Au_apellido ASC.Au_nombre. UPDATE.

la consulta exterior lo utiliza. La consulta trabaja exactamente igual que una con IN. la subconsulta retorna los números de identificación de los editores que tienen libros de negocios publicados. La palabra clave SOME del SQL-92 estándar es equivalente a ANY. Las subconsultas introducidas con un operador de comparación modificado retornan una lista de cero o más valores y pueden incluir una cláusula GROUP BY o HAVING. Segundo. Las palabras clave ALL y ANY comparan un valor escalar con un conjunto de valores simples. mientras que ANY indica que al menos a un valor. Las subconsultas introducidas con la palabra clave NOT IN también retornan una lista de cero o más valores. Subconsultas que son usadas con operadores de comparación Los operadores de comparación que introduce una subconsulta se pueden modificar con las palabras claves ALL o ANY. el operador de comparación mayor que (>) es usado con ANY: USE Pubs SELECT Titulo FROM Titulos WHERE Adelanto > ANY ( SELECT Adelanto . Después que la subconsulta devuelve el resultado. Primero. Estas consultas pueden tener la cláusula EXISTS. Una subconsulta se anida dentro de la cláusula WHERE. estos valores se sustituyen en la consulta exterior.91-146 Conceptualmente. En el siguiente ejemplo. excepto que con NOT IN se seleccionan a todos aquellas filas cuyos valores en la columna de comparación (Ed_in en este caso) no se encuentren del conjunto de resultados de la subconsulta. Sin embargo. la cual encuentra los nombres de los editores que tienen números de identificación dentro del conjunto de resultados de la subconsulta en la tabla Editores. la cual encuentra los nombres que igualan estos números de identificación. Primero. usando la palabra clave IN: USE Pubs SELECT Ed_nombre FROM Editores WHERE Ed_id IN ( SELECT Ed_id FROM Titulos WHERE Tipo = 'negocios' ) Se puede evaluar este comando en dos pasos. La palabra clave ALL indica que se debe aplicar a todos los valores. los comandos que incluyen subconsultas generalmente adoptan uno de los siguientes formatos: • • • WHERE <expresión> [NOT] IN (<subconsulta>) WHERE < expresión > <operador_de_comparación> [ANY | ALL] (<subconsulta>) WHERE [NOT] EXISTS (<subconsulta>) Subconsultas que se usan con IN o con NOT IN El resultado de una subconsulta introducida con IN (o con NOT IN) es una lista de cero o más valores. En el ejemplo siguiente. Luego estos valores son sustituidos en la consulta exterior. el resultado de una subconsulta se sustituye dentro de la consulta exterior (aún cuando no sea necesariamente cómo SQL Server resuelve los comandos Transact-SQL que tienen subconsultas) Tipos de subconsultas Las subconsultas se pueden definir en muchos lugares dentro de un comando SELECT. la subconsulta retorna los números de ID de los editores que han publicado libros de negocios.

La subconsulta en realidad no produce ningún dato. excepto que la cláusula WHERE que tiene NOT EXIST será satisfecha solo si la subconsulta no devuelve ninguna fila. La cláusula WHERE en el comando SELECT exterior contiene una subconsulta que usa una combinación para recuperar monto de adelantos para Algodata Infosystems. Se pueden usar los operadores CUBE o ROLLUP. 1. Subconsultas que se usan con EXISTS y NOT EXISTS Cuando se introduce una subconsulta con la palabra clave EXISTS.Ed_id = Editores. El mínimo adelanto es utilizado para determinar que títulos obtener de la tabla Titulos. o datos que registran eventos individuales.Ed_id AND Tipo = 'negocios' ) Para determinar el resultado de esta consulta. La cláusula WHERE de la consulta exterior comprueba por la existencia de las filas retornadas por la subconsulta.Titulo_id = Titulos.Titulo_id . También se pueden usar los operadores COMPUTE o COMPUTE BY. El siguiente comando SELECT usa al operador CUBE en la cláusula GROUP BY: USE Pubs SELECT SUBSTRING(Titulo. se toma cada fila de la tabla Editores y se verifica que exista dentro de las filas de la base titulo que sean de ese editor (Titulos.Ed_id AND Ed_nombre = 'Algodata Infosystems' ) Este comando encuentra los títulos que reciben un adelanto mayor que el mínimo adelanto pagado por Algodata Infosystems. SUM(cant) AS 'Cantidad' FROM Ventas INNER JOIN Titulos ON Ventas. Los operadores COMPUTE y COMPUTE BY se mantienen por compatibilidad con versiones anteriores.Ed_id = Editores. Esta funciona como un test de existencia. La expansión está basada sobre columnas que el usuario desea analizar. Un cubo multidimensional es una expansión de datos sobre sucesos. el nombre de ese editor figurará en el conjunto de resultados.Ed_id = Editores. La palabra clave NOT EXISTS trabaja como EXISTS.Ed_id) y el tipo sea "negocios". Si existe algún título que cumpla. Resumir datos Transact-SQL incluye varios elementos que lo habilitan para generar reportes simples resumidos. Usar el operador CUBE para resumir datos El operador CUBE genera un conjunto de resultados que es un cubo multidimensional. 65) AS Titulo. Estas columnas son llamadas dimensiones. solo retorna un valor de TRUE o FALSE. En el siguiente ejemplo.92-146 FROM Editores INNER JOIN Titulos ON Titulos. los que también se asocian a la cláusula GROUP BY. los que son parte de la cláusula GROUP BY del comando SELECT. la cláusula WHERE en el comando SELECT exterior contiene una subconsulta que usa EXISTS: USE Pubs SELECT Ed_nombre FROM Editores WHERE EXISTS ( SELECT * FROM Titulos WHERE Titulos. El cubo es un conjunto de resultados conteniendo un tabla cruzada de todas las combinaciones posibles.

Ed_id = t. . el comando devuelve una columna extra. SQL Server soporta métodos para agregar filas de datos a las tablas de una base de datos SQL Server. ROLLUP genera un conjunto de resultados mostrando agregaciones para jerarquías en las columnas seleccionadas. el comando generará los siguientes datos cuando se listen las columnas Ed_nombre. Las diferencias entre los operadores CUBE y ROLLUP son las siguientes: • • CUBE genera un conjunto de resultados mostrando agregaciones para todas las combinaciones de valores en las columnas seleccionadas.Titulo_id = ta.Titulo_id GROUP BY Ed_nombre. Titulo. Si se usa un comando SELECT sin el operador ROLLUP. y eliminar filas.Titulo_id INNER JOIN Editores p ON p. Usar el operador ROLLUP para resumir datos El operador ROLLUP es útil para generar reportes que contienen subtotales y totales. Al usar el operador CUBE. El operador ROLLUP genera un conjunto de resultados que es similar al conjunto de resultados del operador CUBE.Titulo_id = t. Au_apellido. cambiar los datos en las filas existentes.93-146 GROUP BY Titulo WITH CUBE ORDER BY Titulo Este comando SELECT cubre una relación uno a muchos entre los títulos de los libros y las cantidades vendidas de cada uno. SUM(cant) AS 'Sum' FROM Autores a INNER JOIN TituloAutor ta ON a. y Titulo (en ese orden) en la cláusula GROUP_BY: • • • Cantidad de cada título que cada editor vendió para cada autor. usar el operador CUBE o el operador ROLLUP retorna el mismo resultado. Cantidad de todos los títulos que cada editor vendió Cantidad total de todos los títulos vendidos por todos los editores para todos los autores. El conjunto de resultado devuelve los valores para la cantidad vendida de todos los títulos. La columna extra (la cual contiene un valor nulo en la columna Titulo del conjunto de resultados) representa a todos los valores en la columna Titulo de la tabla Titulos.Au_id INNER JOIN Titulos t ON t. Titulo WITH ROLLUP Al usar el operador ROLLUP. En este caso. El siguiente comando SELECT contiene un operador ROLLUP en la cláusula GROUP BY: USE Pubs SELECT Ed_nombre. MODULO III: Consultar y modificar datos Tema 4: Modificar datos en una Base de Datos SQL Server Un componente esencial de un sistema de bases de datos es la capacidad para modificar los datos que se encuentran almacenados dentro del sistema.Au_id = ta.Ed_id INNER JOIN Ventas s ON s. se pueden crear agrupamientos en el conjunto de resultados. Para las filas agrupadas. se usa un valor nulo para representar todos los valores para la columna (excepto la columna Sum). Au_nombre. Au_apellido.

no se deben asignar valores a los siguientes tipos de columnas.. La lista de los nombres de columnas (lista_de_columnas). Los valores son indicados a través de una lista de expresiones escalares separadas por comas. todas las columnas de la tabla o vista recibirán datos. suponga que se crea la siguiente tabla en la base de datos Pubs: USE Pubs CREATE TABLE NuevosLibros ( LibroID INT IDENTITY(1. La cantidad de valores provistos debe ser igual a la cantidad de columnas indicadas en la lista de columnas. Los valores ingresados deben coincidir con la lista de columnas. separadas por comas.. el resto de las columnas recibirán un valor nulo o el valor configurado por defecto para esa columna. precisión. NOTA Un comando INSERT trabaja tanto sobre tablas como sobre vistas (con algunas restricciones). Además. dado que SQL Server genera automáticamente este valor. Si solo se indica una lista parcial de columnas.VALUES para agregar datos Una cláusula VALUES permite especificar los valores para una fila de la tabla.. Si no se indican columnas. se usan para especificar las columnas que recibirán los datos.94-146 Insertar datos en un base de datos SQL Server SQL Server varios métodos para insertar datos a una base de datos: • • • El comando INSERT El comando SELECT. LibroTitulo VARCHAR(80) NOT NULL. el comando INSERT toma la siguiente forma: INSERT [INTO] tabla_o_vista [(lista_de_columnas)] valores_de_datos Este comando hace que los valores de los datos (valores_de_datos) sean insertados como una o mas filas en la tabla o vista. precisión y escala de las columnas correspondientes. • • • NOTA La palabra clave INTO en un comando INSERT es opcional y solo se utiliza para clarificar el código. Columnas con la propiedad IDENTITY Columnas con una definición DEFAULT que use la función NEWID() Columnas computadas .1) NOT NULL. Estos valores deben ser implícitamente convertibles al tipo. Por ejemplo. se puede usar la cláusula VALUES para especificar los valores de los datos para una fila o usar una subconsulta SELECT para especificar los valores para una o más columnas. Cuando se define un comando INSERT. los datos deben ser ingresados en el mismo orden que tiene en la definición de la tabla o vista. En un tratamiento simplificado. en caso que lo tenga.. Usar el comando INSERT. Si no se especifica la lista de columnas. Usar el comando INSERT para agregar datos El comando INSERT agrega una o más nuevas filas a una tabla. y escala de cada valor debe coincidir con los de las columnas correspondientes.INTO El comando WRITETEXT y varias opciones en la API (Application Programming Interface) de la base de datos. que se pueden usar para agregar texto e imágenes a una fila. y el tipo de dato.

LibroTipo) SELECT Titulo. CiudadEd VARCHAR(50) NULL ) Una vez creada la tabla. ntext. text. 'Chicago') En este comando. se decide ingresar datos a una fila de la tabla. o binary. porque los valores para esa columna se generan automáticamente. dado que la columna LibroID se define con la propiedad IDENTITY. EL siguiente comando INSERT utiliza la cláusula VALUES para insertar una nueva fila en la tabla NuevosLibros: USE Pubs INSERT INTO NuevosLibros (LibroTitulo. nchar. NOTA: Una subconsulta SELECT en un comando INSERT se utiliza para agregar subconjuntos de datos existentes a una tabla. o imagen a un fila: • • Se pueden especificar relativamente pequeños montos de datos en un comando INSERT de la misma forma que se especifican datos char. Además. que permite actualización interactiva. Usar el comando SELECT. mientras que la cláusula VALUES se usa para guardar datos nuevos en una tabla.95-146 LibroTipo CHAR(12) NOT NULL CONSTRAINT [tipolibro_df] DEFAULT ('no informado'). Un comando WRITETEXT no puede usarse sobre columnas de una vista. Las aplicaciones ADO (Active Data Object) pueden usar el método AppendChunk para especificar grandes cantidades de datos tipo ntext. utilizan la interfase ISequentialStream. y no registrada. Tipo FROM Titulos WHERE Tipo = 'mod_cook' Este comando INSERT usa la salida de una subconsulta SELECT para proveer los datos que se usarán para ser insertados en la tabla NuevosLibros.INTO para agregar datos EL comando SELECT INTO permite crear una nueva tabla y llenarla con el resultado del comando SELECT. o image. El siguiente comando INSERT usa una subconsulta SELECT para insertar filas en la tabla NuevosLibros: USE Pubs INSERT INTO NuevosLibros (LibroTitulo. Utilizar el comando WRITETEXT. Ver Tema 2 de este módulo Agregar datos ntext. por su parte. Usar una subconsulta SELECT para agregar datos Se puede usar una subconsulta SELECT dentro de un comando INSERT para agregar datos a una tabla desde otra u otras tablas o vistas.. text. los valores han sido definidos para la columnas LibroTitulo y CiudadEd. al no ingresarse un valor para la columna TipoLibro. o image.. de una columna existente tipo text. CiudadEd) VALUES ('Life Without Fear'. Una subconsulta permite agregar más de una fila a la vez. Este comanado sobrescribe completamente cualquier dato preexistente en la columna que afecta. • • . text. Sin embargo. Las aplicaciones OLE DB. no es necesario incluir la columna LibroID en el comando INSERT. SQL Server automáticamente inserta el valor por defecto (no informado) en la columna al ejecutar el comando. o imagen a filas ya insertadas SQL Server incluye varios métodos para agregar valores ntext.

Las cláusulas más importantes del comando UPDATE son: • • • SET WHERE FROM Usar la cláusula SET para modificar datos. Por último. OPENDATASOURCE. no se usa la cláusula WHERE. o en todas las columnas de una tabla o vista. Este comando se puede usar también para actualizar filas en un servidor remoto. el siguiente comando UPDATE incluye la cláusula SET que incrementa el precio de los libros en la tabla NuevosLibros un 10 por ciento: USE Pubs UPDATE NuevosLibros SET Precio = Precio * 1. Un comando UPDATE que referencia a una tabla o una vista puede cambiar los datos en sólo un tabla base por vez. cambiar y actualizar los datos se convierte en una tarea de mantenimiento diario SQL Server provee varios métodos para cambiar datos en una tabla existente: • • • El comando UPDATE La API de la base de datos y los cursores El comando UPDATETEXT Estos procedimientos se pueden tanto a tablas como a vistas (con algunas restricciones) Usar el comando UPDATE para modificar datos El comando UPDATE puede cambiar datos en una columna simple. o image. Si no se especifica la cláusula WHERE. NOTA Una actualización será exitosa sólo si el nuevo valor es compatible con el tipo de datos de la columna y cumple con todas las restricciones asociadas a esta. las aplicaciones DB-Library usan la función Dbwritetext. SET indica que columna será actualizada y los nuevos valores que se guardarán. y OPENQUERY (siempre y cuando el proveedor OLE DB usada para acceder al servidor remoto soporte actualizaciones). todas las columnas serán actualizadas. Los valores en las columnas indicadas serán actualizados con los valores provistos en la cláusula SET en todas las filas que cumplan con la condición de búsqueda especificada en la cláusula WHERE.1 En este comando. text. ya sea usando el nombre de un servidor conectado o las funciones OPENROWSET. en grupos de columnas. Por ejemplo.96-146 • • Las aplicaciones ODBC (Open Database Connectivity) usan el SQLPutData para ingresar nuevos valores del tipo ntext. Modificar datos en una base de datos SQL Server Una vez que se crean las tablas y que se ingresan datos. . por lo que todas las filas serán modificadas (salvo aquellas que tengan un valor nulo para la columna Precio).

text. Las aplicaciones OLE DB.97-146 Usar la cláusula WHERE para modificar datos La cláusula WHERE realiza dos funciones: • • Indica las filas a actualizar Indica las filas de la tabla fuente que califican para proveer valores de actualización cuando se especifica la cláusula FROM.LibroTitulo = Titulos. En el siguiente comando UPDATE.Titulo En este comando. en el siguiente comando UPDATE. Por ejemplo. Utilizar los comandos WRITETEXT o UPDATETEXT. o image. o binary. Si no se indica la cláusula WHERE. para modificar datos ntext. Si no se hubiese puesto la cláusula WHERE todos los valores de LibroTipo tomarían el valor popular. Este punto se verá más en detalle en otro módulo del Kit. la cláusula FROM incluye un inner join que combina los títulos en las tablas NuevosLibros y Titulos: USE Pubs UPDATE NuevosLibros SET Precio = Titulos. Los cambios realizados con esta cláusula sólo afectarán a la fila donde se encuentre posicionado el cursor. la cláusula WHERE se utiliza para limitar la actualización a sólo aquellas filas que cumplen con la condición definida en la cláusula: USE Pubs UPDATE NuevosLibros SET LibroTipo = 'popular' WHERE LibroTipo = 'popular_comp' Este comando cambia el nombre del tipo de libro de aquellas filas con el valor popular_comp por el de popular.Precio FROM NuevosLibros JOIN Titulos ON NuevosLibros. Usar APIs y cursores para modificar datos Las APIs ADO. todas las filas serán actualizadas. . text. nchar. o image SQL Server provee varios métodos para modificar valores del tipo ntext. o image. Las aplicaciones ADO (Active Data Object) pueden usar el método AppendChunk para especificar grandes cantidades de datos tipo ntext. utilizan la interfase ISequentialStream. text. cuando se usa un cursor del servidor Transact-SQL. Usar una cláusula FROM para modificar los datos Se puede usar la cláusula FROM para traer datos desde una o más tablas o vistas a la tabal que se quiere actualizar. por su parte. text. Modificar datos ntext. los valores de Precio en la tabla LibrosNuevos se actualizan al mismo valor que la columna Precio de la tabla Titulos. y ODBC soportan actualizar los datos de la fila actual sobre la que la aplicación se encuentra posicionada en un conjunto de resultados. OLE DB. Además. o image en una fila cuando se reemplazan los valores completos: • • • • Se pueden especificar relativamente pequeños montos de datos en un comando UPDATE de la misma forma que se modifican datos char. se puede actualizar la fila actual utilizando el comando UPDATE con la cláusula WHERE CURRENT OF.

actualizaciones de sólo una porción de datos del tipo ntext. procedimientos almacenados y disparadores pueden usar el comando UPDATETEXT para actualizar sólo una porción de columnas ntext. La sintaxis siguiente es una forma simplificada del comando DELETE: DELETE tabla_o_vista FROM tabla_fuente WHERE condicion_de_busqueda En tabla_o_vista se colocan los nombre de la tabla o vista en que serán eliminadas las filas. Si a una tabla se le eliminan todas tablas las misma permanece en la base de datos de todos modos. o image. Usar el comando TRUNCATE TABLE para eliminar datos . SQL Server soporta. se puede eliminar la fila actual utilizando el comando UPDATE con la cláusula WHERE CURRENT OF. Este valor de royalty se toma de la columna royalty de la tabla Titulos. las aplicaciones DB-Library usan la función Dbwritetext.Royalty = 10 En este comando. No se borran las filas de las tablas indicadas en la cláusula FROM. se puede hacer usando la función Dbupdatetext.98-146 • • Las aplicaciones ODBC (Open Database Connectivity) usan el SQLPutData para ingresar nuevos valores del tipo ntext. text. Usar APIs y Cursores para eliminar datos Las APIs ADO.Titulo AND Titulos. cuando se usa un cursor del servidor Transact-SQL. text. batches. Si esta no se indica. En DB-Library. La cláusula FROM indica tablas.LibroTitulo = Titulos. Todas las otras aplicaciones y los scripts Transact-SQL. se eliminarán todas las filas de la tabla o vista. Por último. Eliminar datos de una base de datos SQL Server SQL Server soporta varios métodos para eliminar datos de una tabla: • • • El comando DELETE APIs y cursores El comando TRUNCATE TABLE Usar el comando DELETE para eliminar datos Un comando DELETE remueve una o más filas en una tabla o vista. Para eliminar la tabla de la base de datos se debe usar el comando DROP TABLE. OLE DB. Además. Este punto se verá más en detalle en otro módulo del Kit. o image. o image. Serán eliminadas todas las filas que cumplan con la condición de búsqueda especificada en la cláusula WHERE. Considere el comando DELETE siguiente: USE Pubs DELETE NuevosLibros FROM Titulos WHERE NuevosLibros. además. vistas o combinaciones adicionales que se pueden usar en el predicado de condición de la cláusula WHERE. y ODBC soportan eliminación de la fila actual sobre la cual se encuentra posicionada la aplicación en el conjunto de resultados. text. Los cambios realizados con esta cláusula sólo afectarán a la fila donde se encuentre posicionado el cursor. se borrarán aquellas filas de la tabla NuevosLibros con un royalty del 10 por ciento. sino sólo de la especificada en la cláusula DELETE.

tal como desde el Query Analizer. Posteriormente se los puede invocar de diversas maneras. A los grupos de comandos los llamaremos scripts (guiones). El comando TRUNCATE TABLE siguiente elimina todas las filas de la tabla NuevosLibros en la base de datos Pubs: USE Pubs TRUNCATE TABLE NuevosLibroswBooks Como en el caso del comando DELETE. Para eliminar la definición de la tabla se debe usar el comando DROP TABLE. o conjunto de comandos.99-146 El comando TRUNCATE TABLE es una forma rápida y no registrada de eliminar todas las filas en una tabla. El SQL Server provee una serie de procedimientos almacenados del sistema. código precompilado. Las capacidades de seguridad incluye encriptación y limitaciones de privilegios que permiten mantener a los usuarios fuera de la vista de la estructura de la base de datos subyacente. A estos scripts se les puede dar un nombre y guardar como procedimientos almacenados en el SQL Server. Estos procedimientos son guardados en la base de datos Master y contienen comando Transact SQL que facilitan muchas tareas. mientras que TRUNCATE TABLE solo graba registro de liberación de las páginas de datos completas. MODULO IV: Implementar procedimientos almacenados TEMA 1: Introducción a los procedimientos almacenados Hasta ahora hemos utilizado el Query Analizer (o la herramienta on-line) para ejecutar comandos o grupos de comandos en el lenguaje Transact SQL. es enviado el servidor para su procesamiento. la definición de la tabla se mantiene en la base de datos después que se aplica un comando TRUNCATE TABLE (incluidos sus índices y objetos asociados). configurar un comportamiento y administrar al servidor o para manipular datos contenidos en una base de datos. algunos de los cuales ya hemos utilizado en este Kit. Rendimiento Cada vez que un comando Transact-SQL. El comando TRUNCATE TABLE inmediatamente libera el espacio ocupado por los datos de la tabla e índices. y manejo de cachés (almacenamientos temporarios). Una vez que los permisos y la sintaxis de los comandos se han verificado. porque DELETE graba un registro de transacciones por cada fila eliminada. . También se liberan las páginas de distribución de todos los índices. Cuando se ejecuta un script. Propósito y ventajas de los procedimientos almacenados Los procedimientos almacenados proporcionan ventajas de performance. para que realicen el procesamiento de los comandos Transact SQL incorporados. SQL Server construye un plan de ejecución para procesar el pedido. Este método es casi siempre más rápido que un comando DELETE sin condiciones. El marco de programación se logra a través de construcciones comunes de programación tales como parámetros de entrada/salida y reutilización de los procedimientos. el servidor debe determinar si el remitente tiene suficientes privilegios para ejecutar esos comandos y si los comandos son válidos. mientras se los habilita a ejecutar procedimientos almacenados que actúan sobre la base de datos. los comandos son ejecutados por SQL Server para mostrar un conjunto de resultados. La mejora en el rendimiento se logra a través de un almacenamiento local (en la base de datos). un marco de trabajo. y mayores capacidades de seguridad.

100-146 Los procedimientos almacenados son más eficientes en parte porque el procedimiento es almacenado en el SQL Server cuando se crea. La sintaxis de los comandos contenidos en un procedimiento almacenado se comprueba que este libre de errores antes de ser guardado. El nombre del procedimiento almacenado se almacena en la tabla SysObjects, mientras que el texto del procedimiento se guarda en la tabla SysComments. Por otro lado, invocar al procedimiento almacenado implica ejecutar un solo comando en vez de cientos de comandos que un procedimiento almacenado podría contener. La primera vez que se ejecuta el procedimiento, se crea un plan de ejecución y se compila al procedimiento almacenado. Los procesamientos subsecuentes del procedimiento almacenado son mucho más rápidos ya que el SQL Server no vuelve a controlar la sintaxis, ni recrea un plan de ejecución, ni se recompila el procedimiento. Por último se verifica el caché por si ya existe un plan de ejecución para ese procedimiento antes de generar un nuevo plan de ejecución. La relativa pérdida de rendimiento producida por ubicar los planes de ejecución de los procedimientos almacenados en el caché de procedimiento se reduce ya que los planes de ejecución para todos los comandos SQL se guardan ahora en el caché de procedimientos. Por lo que un comando Transact-SQL tratará de utilizar un plan de ejecución ya existente en todos casos posibles. Marco de programación Una vez que se crea un procedimiento almacenado, puede ser llamado todas las veces que sea necesario. Esta capacidad provee modulación y habilita la reutilización del código. La reutilización del código mejora el mantenimiento de la base de datos al aislar la base de datos de los cambios en las prácticas del negocio. Si las reglas de negocios cambian en una organización, se puede modificar a los procedimientos almacenados para cumplir con las nuevas reglas de negocio. Todas las aplicaciones que llaman a esos procedimientos almacenados cumplirán con la nuevas reglas, sin tener que ser directamente modificados. Tal y como otros lenguajes de programación, los procedimientos almacenados pueden aceptar parámetros de ingreso, retornar parámetros de salida, producir información de retroalimentación de la ejecución en la forma de códigos de estatus y texto descriptivo, y llamar a otros procedimientos. Por ejemplo, un procedimiento almacenado puede retornar un código de estatus a un procedimiento que lo llamó para que este procedimiento realice una operación según el código recibido. Los desarrolladores de software pueden escribir sofisticados en un lenguaje como el C++; luego, se puede utilizar un tipo especial de procedimiento almacenado, denominado procedimiento almacenado extendido, para invocar al programa desde dentro del SQL Server. Ante cualquier tarea simple, se debería escribir un procedimiento almacenado. Mientras más genérico sea el procedimiento más útil será para muchas bases de datos. Por ejemplo; el procedimiento almacenado sp_rename cambia el nombre de un objeto creado por el usuario, tal como una tabla, una columna o un tipo de datos definido por el usuario en la base de datos actual, pudiéndose aplicar a cualquier base de datos. Seguridad Otro capacidad importante de los procedimientos almacenados es que mejoran la seguridad a través de la encriptación y el aislamiento. Los usuarios de las bases de datos pueden tener permisos de ejecutar un procedimiento almacenado sin tenerlos para acceder directamente a los objetos de la bases de datos sobre las que opera el procedimiento almacenado. Además un procedimiento almacenado puede ser encriptado cuando se lo crea o modifica inhabilitando a los usuarios a leer los comandos Transact-SQL contenidos en el procedimiento almacenado. Estas capacidad de seguridad permiten aislar la estructura de la base de datos del usuario de la base de datos, con la consiguiente ganancia en seguridad. Categorías de procedimientos almacenados

101-146 Existen cinco categorías de procedimientos almacenados: procedimientos almacenados del sistema, procedimientos almacenados locales, procedimientos almacenados temporarios, procedimientos almacenados extendidos y procedimientos almacenados remotos. Procedimientos almacenados del sistema Los procedimientos almacenados del sistema son guardados en la base de datos Master y son típicamente identificados por el prefijo sp_ . Ellos realizan una amplia variedad de tareas para soportar las funciones del SQL Server soportando: llamadas de aplicaciones externas para datos de las tablas del sistema, procedimientos generales para administración de las bases de datos, y funciones de administración de seguridad. Por ejemplo, se pueden ver los privilegios de una tabla usando el procedimiento almacenado de catálogo sp_table_privileges. El comando siguiente utiliza este procedimiento almacenado para mostrar los privilegios de la tabla stores en la base de datos Pubs: USE Pubs GO EXECUTE sp_table_privileges Stores Una tarea común de administración de bases de datos es consultar la información acerca de los usuarios y procesos que se están ejecutando en una base de datos. Este paso es importante cuando se debe dar de baja la base de datos. El siguiente comando usa el procedimiento sp_who para mostrar todos los procesos en uso por el usuario LAB1\Administrator: EXECUTE sp_who @loginame=’LAB1\administrator’ La seguridad de base de datos es crítica para la mayoría de las organizaciones que almacenan datos privados en su base de datos. El comando siguiente usa el procedimiento almacenado del sistema sp_validatelogins para mostrar cualquier usuario y grupo de usuarios Windows NT o Windows 2000 huérfanos que no existan más y que aún tengan entradas en las tablas del sistema del SQL Server: EXECUTE sp_validatelogins Hay cientos de procedimientos almacenados del sistema incluidos con el SQL Server. Para una lista completa de los procedimientos almacenados, consultar “System Store Procedures” en SQL Server Books Online. Procedimientos almacenados locales Los procedimientos almacenados locales son usualmente almacenados en una base de datos y están típicamente diseñados para completar tareas en la base de datos donde residen. Un procedimiento almacenado local se podría crear también para personalizar código de los procedimientos almacenados del sistema. Para crear una tarea personalizada basada sobre un procedimiento almacenado del sistema, primero copie el contenido del procedimiento almacenado del sistema y guarde el nuevo procedimiento almacenado y guarde el nuevo procedimiento almacenado como un procedimiento almacenado local. Procedimientos almacenados temporarios Un procedimiento almacenado temporario es similar a un procedimiento almacenado local, pero existe sólo hasta que se cierre la conexión que lo creó o se dé de baja el SQL Server, dependiendo del tipo de procedimiento almacenado. Estos procedimientos tienen una existencia volátil debido a que son creados son almacenados en la base de datos TempDB. TempDB se recrea cuando se reinicia el servidor; por lo tanto, todos los objetos dentro de la base de datos desaparecen después de la base de datos. Los procedimientos almacenados temporarios son muy útiles si Ud. está accediendo a versiones anteriores del SQL Server que no soportan la reutilización de los planes de ejecución y si no se quiere almacenar las tareas que serán ejecutadas con distintos parámetros.

Comentario [AMA1]:

102-146 Hay tres tipos de procedimiento almacenado temporarios: locales (también llamados privados), globales, y procedimientos almacenados en TempDB. Un procedimiento almacenado temporario local siempre comienza con #, un procedimiento almacenado temporario global siempre comienza con ##. Mas adelante se explicará como crear cada tipo de procedimiento almacenado temporario. El alcance de ejecución de un procedimiento almacenado local esta limitado a la conexión que lo creó. Todos los usuarios que tienen conexión a la base de datos, sin embargo, pueden ver el procedimiento almacenado en la ventana del Object Browser del Query Analizer. Dado que se encuentra limitado en su alcance, no existe la posibilidad de colisión de nombres con otras conexiones que crean procedimientos almacenados temporarios. Para asegurar unicidad, SQL Server agrega al nombre de un procedimiento almacenado con una serie de caracteres _ y un número único de conexión. Los privilegios no pueden ser garantizado a otros usuarios para el procedimiento almacenado temporario. Cuando la conexión que creó el procedimiento almacenado temporario se cerró, el procediemiento se elimina de la TempDB. Cualquier conexión para la base de datos puede ejecutar un procedimiento almacenado temporario global. Este tipo de procedimientos debe tener un nombre único , dado todas las conexiones pueden ejecutarlo y, cómo todos los procedimientos almacenados temporarios, este es creado en TempDB. El permiso para ejecutar procedimientos almacenados es automáticamente garantizado al rol público y no puede ser cambiado. Un procedimiento almacenado temporario global es casi tan volátil como los locales. Este tipo de procedimiento es removido cuando la conexión usada para crear el procedimiento se cierra y cualquier conexión que este ejecutando el procedimiento almacenado es completada. Los procedimientos almacenados temporarios creados directamente en la TempDB son diferentes a los procedimientos almacenados locales y globales en lo siguiente: • • • Se pueden configurar permisos para ellos. Existen aún después que la conexión que los creó se terminan No son removidos hasta que el SQL Server no sea apagado.

Ya que este tipo de procedimiento almacenado se crea directamente en la TempDB, es importante calificar completamente los objetos de base de datos referenciados por comandos Transact-SQL en el código. Por ejemplo, se debe referenciar la tabla Authors, la cual es propiedad de dbo en la base de datos Pubs, como pubs.dbo.authors. Procedimientos almacenados extendidos Un procedimiento almacenado extendido usa un programa externo, compilado como una DLL, librería de vínculos dinámicos (dynamic link library) para expandir las capacidades de un procedimiento almacenado. Un número de procedimiento almacenado del sistema son también calificados como procedimientos almacenados extendidos. Por ejemplo, el programa xp_sendmail, el cual envía un mensaje y un archivo de conjunto de resultados de una consulta adjunto a una dirección específica de email, es tanto un procedimiento almacenado de sistema como un procedimiento almacenado extendido. La mayoría de los procedimientos almacenados extendidos usan el prefijo xp_ como un convención de nombre. Sin embargo, hay algunos procedimientos almacenados extendidos que comienzan con el prefijo sp_, y hay algunos procedimientos almacenados del sistema que no son procedimientos extendidos y usan el prefijo xp_. Por lo tanto, no se puede depender sobre convención de nombres para identificar procedimientos almacenados del sistema y procedimientos almacenados extendidos. Se puede usar la función OBJECTPROPERTY para determinar si un procedimiento almacenado es extendido o no. OBJECTPROPERTY retorna un valor de 1 si es un procedimiento extendido (IsExtendedProc), indicando un procedimiento almacenado extendido, o retorna un valor de 0, indicando que no es un procedimiento extendido. El siguiente ejemplo demuestra que el sp_prepare es un procedimiento almacenado extendido y que xp_logininfo no es un procedimiento almacenado extendido: USE Master

103-146 • un procedimiento almacenado extendido que usa el prefijo sp_ SELECT OBJECTPROPERTY(object_id(‘sp_prepare’), ‘IsExtendedProc’)

Este ejemplo retorna un valor de 1
USE Master • un procedimiento almacenado que no es extendido y usa el prefijo xp_ SELECT OBJECTPROPERTY(object_id(‘xp_logininfo’), ‘IsExtendedProc’)

Este ejemplo retorna un valor de 0.

MODULO IV: Implementar procedimientos almacenados TEMA 2: Creando, ejecutando, modificando y borrando procedimientos almacenados
Como se guarda un procedimiento Cuando se crea un procedimiento, SQL Server chequea la sintaxis de los comandos Transact-SQL que incluye. Si la sintaxis es incorrecta, SQL Server generará un mensaje de error “sintax incorrect” (sintaxis incorrecta), y el procedimiento no será creado. Si el procedimiento pasa el chequeo de sintaxis, el procedimiento se guarda, escribiéndose su nombre y otras informaciones (tal como un número autogenerado de identificación) en la tabla SysObject. El texto usado para crear el procedimiento se escribe en la tabla SysComments de la base de datos actual. El siguiente comando SELECT consulta a la tabla SysObjects en la base de datos Pubs para mostrar el número de identificación del procedimiento almacenado ByRoyalty: SELECT [name].[id] FROM [pubs].[dbo].[SysObjects] WHERE [name] = ‘byroyalty’ Esta consulta retorna lo siguiente: name byroyalty id 581577110

Usando la información retornado de la tabla SysObjects, el próximo comando SELECT consulta a la tabla SysComments al usar el número de identificación del procedimiento almacenado ByRoyalty: SELECT [text] FROM [pubs].[dbo].[SysComments] WHERE [id] = 581577110 Esta consulta retorna el texto del procedimiento almacenado, cuyo número de identificación es el 581577110.

104-146 Usar el procedimiento almacenado de sistema sp_helptext es una mejor opción para mostrar el texto usado para crear un objeto (tal como un procedimiento almacenado no encriptado), dado el texto es retornado en múltiples filas. Métodos para crear procedimientos almacenados SQL Server provee muchos métodos que se pueden usar para crear un procedimiento almacenado: el comando Transact-SQL CREATE PROCEDURE, SQL-DMO (usando el objeto StoredProcedure y escapa alcance de este Kit), a través del árbol de consola del Enterprise Manager, el asistente para crear procedimientos almacenados (al cual se puede acceder a travé del Enterprise Manager). El comando CREATE PROCEDURE Se puede usar el comando CREATE PROCEDURE, o su versión abreviada, CREATE PROC, para crear un procedimiento almacenado en el Query Analyzer o una herramienta de comando como osql. Cuando utiliza CRETE PROC, se pueden realizar las siguientes tareas: • Especificar agrupamientos de procedimientos almacenados

• Definir parámetros de entrada-salida, sus tipos de datos, y sus valores por defecto. Cuando se definen parámetros de entrada y salida, estos siempre van precedidos por el signo @, seguido del nombre del parámetro y luego una designación del tipo de dato. Los parámetros de salida deben incluir la palabra clave OUTPUT para diferenciarlos de los de entrada. • Usar códigos de retorno para mostrar información acerca del éxito o falla de una tarea.

• Controlar si un plan de ejecución debería ser guardado temporariamente (en el cache) para un procedimiento. • • Encriptar el contenido del procedimiento almacenado por razones de seguridad. Especificar las acciones que deberá tomar el procedimiento almacenado cuando se ejecute.

Proveer de contexto a un procedimiento almacenado
Con la excepción de los procedimiento almacenado temporarios, un procedimiento almacenado se crea siempre en la base de datos actual. Por lo tanto, Ud. siempre debería especificar la base de datos actual usando el comando USE nombre_base seguido por el por el comando GO ntes de crear un procedimiento almacenado- Se puede usar la lista desplegable Cahnge Database en el Query Analizer para seleccionar la base de datos actual. El script siguiente selecciona la base Pubs y luego crea un procedimientos llamado ListAuthorNames (lista de los nombres de los autores) , que pertenece a dbo: USE Pubs GO CREATE PROCEDURE [dbo].[ListAuthorNames] AS SELECT [au_fname], [aufname] FROM [pubs].[dbo].[authors]

Un nombre de procedimiento almacenado totalmente incluye el nombre de su propietario (en este caso dbo) y el nombre del procedimiento.[dbo].[authors] GO • crear un procedimiento temporario global CREATE PROCEDURE #globaltemp AS SELECT * from [pubs]. Para crear un procedimiento almacenado directamente en la TempDB que no es ni local ni global haga que la TempDB sea la base de datos actual y luego cree el procedimiento. un procedimiento almacenado temporario global y un procedimiento directamente en la TempDB: • crear un procedimiento temporario local CREATE PROCEDURE #localtemp AS SELECT * from [pubs]. que también será creado en la TempDB.[dbo].[authors] GO . Por definición. El nombre de la base de datos no es parte del nombre totalmente calificado de un procedimiento almacenado cuando se usa el comando CREATE PROCEDURE. SQL Server ignora la base de datos actual cuando crea un procedimiento temporario. Se especifica dbo como propietario si se quiere asegurar que la tarea del procedimiento almacenado correrá sin importar la tabla propietaria en la base de datos. Este signo numeral instruye al SQL Server para que cree el procedimiento en la TempDB. El ejemplo siguiente crea un procedimiento almacenado temporario local.[dbo]. un procedimiento almacenado sólo puede existir en la TempDb.105-146 Fíjese que el nombre del procedimiento está totalmente calificado en el ejemplo. agregue adelante del nombre del procedimiento el símbolo #. . se agrega adelante del nombre del procedimiento un doble símbolo numeral ##. Para crear un procedimiento almacenado temporario global.[authors] GO • crear un procedimiento almacenado temporario que sea local en tempdb USE TEMPDB GO CREATE PROCEDURE directtemp AS SELECT * from [pubs]. ListAuthorNames. Crear procedimientos almacenados temporarios Para crear un procedimiento almacenado temporal local.

Se puede también forzar una recompilación mediante el uso del procedimiento almacenado del sistema sp_recompile o especificando WITH RECOMPILE cuando se ejcuta el procedimiento. Para agrupar procedimientos almacenados. se debe hacer a la base de datos TempDB la base actual antes de crearlo.[protected] WITH ENCRYPTION AS SELECT [au_fname]. Para provocar que un procedimiento almacenado sea recomplilado cada vez que se ejecuta. [au_lname] FROM [pubs].[authors] Las palabras claves WITH ENCRYPTION encriptan la columna de texto del procedimiento almacenado en la tabla SysComments. y no es cacheado de nuevo hasta que el servidor se reinicie o hasta que la estructura de una tabla usada por el procedimiento almacenado cambie. se ve el código para ambos ProcAgrupado. cuando los parámetros de un procedimiento almacenado varían considerablemente de una ejecución a la siguiente. ‘IsEncrypted’) . agregue las palabras claves WITH RECOMPILE cuando crea el procedimiento almacenado. Por ejemplo: el denominar a dos procedimientos almacenados con ProcAgrupado. Por razones de performance se podría no querer cachear un plan de ejecución de un procedimiento almacenado. que se guardan en la base Masters. Agrupar.2 al momento de su creación. use la palabra clave WITH ENCRYPTION cuando crea el procedimiento. Si el procedimiento no se ejecuta en el contexto de una base de datos específica. los procedimientos almacenados temporarios locales y globales están disponibles para ser usados por su nombre corto (sin importar la base de datos actual). Por ejemplo. Tal como los procedimientos almacenados del sistema. Por defecto.[dbo]. cachear un plan de ejecución es contraproducente. almacenar temporariamente en memoria y encriptar procedimientos almacenados Los procedimientos almacenados puedes ser agrupados lógicamente al momento de su creación. En el tercer parte del ejemplo. Un modo simple para determinar si un procedimiento almacenado está encriptado es usar la función OBJECTPROPERTY: • controla si el procedimiento almacenado esta encriptado retornando 1 para IsEncrypted SELECT OBJECTPROPERTY(object_id(‘protected’). un plan de ejecución de un procedimiento almacenado se guarda en memoria temporal (cacheo) la primera vez que se ejecuta. Cuando se ve el contenido de ProcAgrupado.1 y ProcAgrupado.[dbo]. cuando se crea un procedimiento almacenado temporario directamente en la base de datos TempDB. Esta técnica es muy útil para procedimientos almacenados que deberían ser administrados cono una unidad independiente y que son usados por una aplicación específica. se debe asignar a cada procedimiento del grupo el mismo nombre y agregarle un número único separado por un punto y coma. el código siguiente crea un procedimiento encriptado llamado Protected: USE Pubs GO CREATE PROC [dbo]. Para encriptar un procedimiento almacenado.1 y ProcAgrupado.2.[directtemp]). luego nombre de bases de datos totalmente calificadas aseguran que se está referenciando a la base de datos apropiada. los agrupa lógicamente. Encriptar un procedimiento almacenado protege su contenido de ser visto.106-146 Nombres de bases de datos totalmente calificadas son especificadas en los comandos SELECT. o se debe calificar totalmente el nombre ([TempDb]. Por ejemplo.

Su definición no puede ser desencriptada para ser vista por nadie. se expande el árbol de la consola para su servidor y luego se expande la base de datos donde se creará el procedimiento almacenado. se puede abrir las propiedades del procedimiento y configurar los permisos.107-146 O llamando al procedimiento con sp_halptext: • si el procedimiento esta encriptado. incluido el propietario del procedimiento almacenado. Clic derecho sobre el nodo Stored Procedure. El asistente Create Stored Procedure . SQL Server lo desencripta para sólo para su ejecución. Por lo tanto. Una vez que el procedimiento almacenado se crea. Comúnmente se agrega texto al encabezamiento que describe como se deberá documentar cada procedimiento almacenado que se crea. Enterprise Manager Se puede crear un procedimiento almacenado directamente en el Enterprise Managrer. controlar la sintaxis del procedimiento almacenado antes de su creación y guardar una plantilla que aparecerá siempre que se cree un nuevo procedimiento almacenado y se configuren permisos. se debe estar seguro que se cuenta con una copia en algún lugar seguro antes de encriptar un procedimiento almacenado. Cuando aparezca el cuadro de diálogo Stored Procedure Properties – New Stored Procedure se ingresa el contenido del nuevo procedimiento almacenado. La figura muestra el cuadro de diálogo Stored Procedure Properties – New Stored Procedure que contiene el código del ejemplo anterior. y luego clic sobre New Stored Procedure. retorna “The objects comments have been encrypted. Para ello. Las plantillas son muy útiles porque proveen un marco de trabajo para crear documentación consistente sobre los procedimientos almacenados. Por defecto el propietario del procedimiento y el administrador tienen permisos totales sobre el procedimiento almacenado. Se puede. además.” EXEC sp_helptext protected Un procedimiento almacenado encriptado no puede ser replicado. Después que un procedimiento almacenado es encriptado.

Los procedimientos almacenados extendidos sólo pueden ser agregados a la base de datos Master. El asistente Create Stores Procedures lo habilita para que Ud. La verificación de la existencia de los objetos se produce al momento de la efectiva ejecución del procedimiento. tal como una tabla referenciada en un procedimiento almacenado no existe al momento de la creación del procedimiento almacenado. En la ventana Select Wizard (seleccionar asistente). . expandir la opción Database (base de datos). Resolución diferida de nombres Cuando se crea un procedimiento almacenado. A partir de quí se deben completar los pasos indicados por el asistente. expanda la base de datos Master. o actualicen datos en las tablas. Esto es así porque es posible que un objeto. Sólo los usuarios que tiene permisos de administrador pueden registrar un procedimiento almacenado con el SQL Server. se puede editarlos dentro del asistente o utilizar otras herramientas (como el Query Analizer). Crear y agregar procedimientos almacenados extendidos Después de crear un procedimiento almacenado extendido. y clic sobre la opción New Extended Stored Procedure (nuevo procedimiento almacenado extendido). Esta capacidad se denomina resolución diferida de nombres. SQL Server no controla por la existencia de los objetos que este pueda referenciar. se debe registrar con SQL Server. Para modificar los procedimientos almacenados que crea el asistente. y luego seleccionar Create Stored Procedure Wizard (asistente para crear procedimientos almacenados) y presionar Ok. Para registrar un procedimiento almacenado extendido. cree procedimientos que inserten. eliminen. clic derecho sobre el nodo Extended Stored Procedure (procedimiento almacenado extendido). La Figura muestra la pantalla de bienvenida del Create Stored Procedure Wizard mostrando las cosas que se pueden hacer con él. se puede usar el procedimiento del sistema sp_addextendedproc en el Query analyzer o usar el Enterprise Manager.108-146 El asistente Create Stored Procedure (crear procedimientos almacenados) permite crear nuevos procedimientos almacenados paso a paso. En el Enterprise Manager. Se puede acceder al asistente seleccionando Wizars (asistentes) desde el menú Tools (herramientas).

el nombre del parámetro). mediante el comando USE.109-146 Cuando se refiere a un objeto (como una tabla) en un procedimiento almacenado se debe asegurar que se especifica el propietario del objeto. o se lo invoca por su nombre totalmente calificado o se cambia la base actual a la que pertenece el procedimiento. SQL Server buscará en la base Master por cualquier procedimiento almacenado que tenga el prefijo sp_ donde el propietario sea dbo. o globales. El nombre del procedimiento almacenado a ser visto es en este caso el valor del parámetro. se puede simplemente especificar [nombre_proc]. seguido por el nombre del parámetro y la designación del tipo de dato. Para evitar confusión. con fines de claridad de los ejemplos. entonces se puede ejecutar el procedimiento almacenado especificando sólo [propietario]. SQL Server asume que el creador del procedimiento almacenado es también el propietario de los objetos referenciados en el procedimiento. Si el nombre de el nombre del procedimiento es único en la base de datos activa. Por defecto. ni para procedimientos almacenados temporarios locales. Para evitar confusión. Por ejemplo se vió el contenido de un procedimiento almacenado ingresando sp_helptext seguido del nombre del procedimiento almacenado a ser visto. Si ello ocurre. Especificar parámetros y sus valores Si un procedimiento almacenado requiere valores de parámetros. se deben especificar cuando se ejecuta el procedimiento. aún cuando dichos nombres no violan la reglas de nombres de objetos. se puede correr un procedimiento almacenado en el Query Analyzer simplemente ingresando su nombre y cualquier parámetro requerido. Nombres totalmente calificados no son necesarios cuando se ejecutan procedimientos del sistema que tienen el prefijo sp_.[nombre_proc]. Cuando se definen parámetros de entrada y salida se los precede del símbolo @. Si el procedimiento almacenado no es el primer comando en un batch. para ejecutarlo se debe preceder el nombre del procedimiento con las palabras claves EXECUTE o EXEC. se debe incluir un valor para el parámetro (y opcionalmente. Nota: En este tema se han utilizado los identificadores entre [] en los nombres de los objetos. no se debe nombrar procedimientos almacenados locales con los mismos nombres de procedimientos almacenados en la base Master. Por lo tanto.[nombre_proc] o. Ejecutar un procedimiento almacenado Como ya vimos. Cuando se los invoca para ser ejecutados. se debe asegurar que el propietario de la base sea otro que dbo.[propietario]. tal como [nombre_base]. SQL Server no busca automáticamente en la base master por procedimientos almacenados extendidos. Llamar un procedimiento almacenado para ejecución Cuando se especifica el nombre de un procedimiento. Marjorie --llama al procedimiento alamcenado con los valores y nombres de los parámetros . Los próximos dos ejemplos corren el procedimiento almacenado au_info de la base Pubs con dos parámetros: @lastname (apellido) y @firstname (nombre): --llama al procedimiento almacenado con los valores de los parámetros USE Pubs GO EXECUTE au_info Green. considere especificar a dbo como el propietario de todos objetos (tanto los procedimientos almacenados como los objetos referenciados dentro de estos). si la base que contiene al procedimiento es la base actual. el nombre puede ser totalmente calificado.

La lista siguiente muestra algunas sintaxis opcionales disponibles cuando se ejecuta un procedimiento almacenado: • Un variable de código de retorno de tipo entero (integer) para almacenar valores retornados desde el procedimiento almacenado. se puede correr a ambos ingresando EXEC ProcAgrupado.2. o cumplimiento de tareas.2. se puede ejecutar el procedimiento 2 escribiendo EXEC ProcAgrupado. se puede indicar que al arrancar el SQL Server se ejecuten procedimientos almacenados. @optionname = startup. La palabra clave RETURN con un valor (o unos valores) debe ser especificada en el procedimiento almacenado para que este variable opcional funcione. El comando siguiente configura un procedimiento almacenado llamado AutoStart para que arrnque automáticamente: USE Master GO EXECUTE sp_procoption @procname = autostart. . En el segundo ejemplo. • • Ejecutar procedimiento almacenado cuando arranca SQL Server Ya sea por razones de performance. Se utiliza para ello el procedimiento almacenado sp_procoption. Aquellos parámetros a los que se les especifica un valor por defecto en la definición del procedimiento no necesitan ser obligatoriamente especificados cuando se los llama. @OptionName y @OptionValue. Este procedimiento acepta tres parámetros: @ProcName. Para procedimientos almacenados agrupados. Las variables son definidas con el uso de la palabra clave DECLARE antes de usar EXECUTE.110-146 USE Pubs GO EXECUTE au_info Green. se puede o ejecutar todos los procedimientos en el grupo simplemente especificando el nombre del procedimiento almacenado. Por ejemplo. @firstname = ‘Marjorie’ En el primer ejemplo. los nombres y los valores son ambos indicados. Si se especifican los valores sin sus correspondientes nombres. Variables para mantener los parámetros definidos en el procedimiento almacenado. o se puede incluir un número para indicar cual procedimiento almacenado se desea ejecutar. los valores se deben indicar en el mismo orden con se especificaron en la definición del procedimiento. cada nombre de parámetro debe ser único en el grupo.1 y ProcAgrupado. Si se definen parámetros en los procedimientos almacenados agrupados. se los puede poner en cualquier orden. administración. En este caso. Marjorie @lastname = ‘Green’. si se crean dos procedimientos almacenados llamados ProcAgrupado. Un punto y coma seguida por un número de grupo. los valores de los parámetros fueron especificados pero los nombres no. O.

se puede correr el procedimiento almacenado sp_configure. se puede ejecutar la función OBJECTPROPERTY y controlar la propiedad ExecIsStartup. Llamar a un procedimiento desde otro se denomina llamadas anidadas.111-146 @optionvlue = true Sólo los procedimientos de dbo y ubicados en la base master pueden ser configurados para ejecutarse automáticamente. se hace clic en el nodo Stored Procedures. Por ejemplo el código siguiente invoca a la función para determinar si el procedimiento AutoStart está configurado para ejecutarse automáticamente: USE Master SELECT OBJECTPROPERTY(object_id(‘autostart’). Para mantener la encriptación o la configuración de recompilación. Se accede a la base Master. El conjunto de permisos.para modificar el contenido de un procedimiento almacenado de usuario. El siguiente comando configura al SQL Server para que los procedimientos almacenados configurados para ejecutarse automáticamente no se arranquen la próxima vez que se encienda el SQL Server: EXECUTE sp_configure @configname = ‘scan for startup procs’. Se selecciona al procedimiento almacenado. tales como su ID. y su bandera de arranque. La sintaxis del comando ALTER PROCEDURE es casi idéntica a la del CREATE PROCEDURE. utilizando el Query Analyzer o una herramienta de comandos como osql. La ventaje de usar el comando ALTER PROCEDURE en vez de eliminar el procedimiento y crearlo de nuevo es que con este comando se retiene la mayoría de la propiedades configuradas para el procedimiento. y luego clic derecho. ‘ExecIsStartup’) Para deshabilitar procedimientos para que no continúen ejecutándose automáticamente. . Se puede configurar a un procedimiento para que arranque automáticamente desde el Enterprise Manager. Se abre el cuadro de diálogo Properties (Propiedades) y se marca la casilla de selección Execute Whenever SQL Server Start (ejecutar siempre que el SQL Server arranca). @configvalue = 0 RECONFIGURE GO Modificar procedimientos almacenados Se puede usar el comando ALTER PROCEDURE (ALTER PROC en su versión abreviada). Para determinar si un procedimiento almacenado arranca automáticamente. Para ejecutar al arrancarse el SQL Server a procedimientos ubicados en otras bases deberán ser llamados desde un procedimiento almacenado ubicado en la Master y configurado para arrancar automáticamente.

El comando siguiente borra dos procedimientos en la base de datos Pubs: Procedure01 y Procedure02: USE Pubs GO DROP PROCEDURE procedure01. Los procedimientos almacenados pueden ser anidados.[nombre_procedimiento]. como tablas.112-146 se debe especificar con las palabras claves WITH ENCRYPTION o WITH RECOMPILE cuando se ejecuta ALTER PROCEDURE. Usando el Query Analyzer. para eliminar un procedimiento almacenado definido por el usuario. En el Enterprise Manager. el procedimiento que llama no podrá ubicar al objeto renombrado y generará un mensaje de error. Eliminar procedimientos almacenados Se puede usar el comando DROP PROCEDURE. procedure02 Fíjese que primero se configuró a Pubs como la base actual. El comando siguiente renombra el procedimiento almacenado ByRoyalty a RoyaltyByAuthorID: USE PUBS GO EXECUTE sp_rename @objname = ‘byroyalty’. clic derecho sobre el procedimiento almacenado y luego clic en Properties. Se puede usar el Enterprise Manager o el Query Analyzer para modificarprocedimientos almacenados de usuario. y luego clic en OK. @newname = ‘RoyaltyByAutorID’. Si se . o su versión abreviada DROP PROC. se usa el procedimiento almacenado sp_rename. modifique los comandos del procedimiento que aparecen en la caja Text. Si se produce una llamada a un objeto renombrado. @objtype = ‘object’ Procedimientos almacenados definidos por el usuario pueden ser renombrados en el Enterprise Manager haciendo clic derecho en el nombre del procedimiento almacenado y clic en Rename (renombrar) Se deberá tener cuidado cuando se renombre un procedimiento almacenado u otros objetos. Después de modificar un procedimiento almacenado ejecútelo. No se puede especificar un nombre de base de datos cuando se elimina un procedimiento. En el cuadro de diálogo Stored Procedure Properties. varios procedimientos a la vez o un conjunto de procedimientos agrupados. El nombre totalmente calificado para eliminar procedimientos es [propietario]. Para modificar el nombre de un procedimiento almacenado definido por el usuario. clic derecho en el procedimiento almacenado y clic en Edit.

Los valores de salida típica de muestran en pantalla una vez que terminó la ejecución del procedimiento. se elimina el grupo y luego se lo recrea sin el procedimiento a eliminar. se guarda en memoria un valor para el parámetro de salida.1 y ProcAgrupados. especifique el nombre del procedimiento. Los cuidados indicados al final del punto anterior también son válidos para las operaciones de eliminación.2 no se puede borrar ProcAgrupados. Cuando se ejecuta el procedimiento.SalesForTitle @Title. Los datos desde un parámetro de salida son capturados en memoria cuando el procedimiento se ejecuta. Para borrar un grupo de procedimientos almacenados. Para retornar un valor desde el parámetro de salida se debe crear una variable para que lo mantenga. En resumen. se declara una variable para mantener al valor. Los parámetros de salida amplían la salida de los procedimientos almacenados mas allá del conjunto de resultados retornado por una consulta. Se puede mostrar el valor con los comando SELECT o PRINT.2.varchar(80). Por ejemplo si se tiene un grupo de procedimientos llamados ProcAgrupados conteniendo ProcAgrupados.1 sin borrar ProcAgrupados. el comando DROP PROC buscará primero en la base actual y luego en la Master. Si se necesita eliminar un procedimiento dentro de un grupo de procedimientos. o usar el valor para completar otro comando en el procedimiento. El siguiente procedimiento muestra el uso de ambos parámetros.113-146 ha creado un procedimiento almacenado del sistema definido por el usuario (con prefijo sp_). Para utilizarlo. Un parámetro de salida se define usando la palabra clave OUTPUT. --Parámetro de entrada . de salida y de entrada: USE Pubs GO CREATE PROCEDURE dbo. un parámetro de entrada se define en el procedimiento almacenado y un valor es provisto cuando el procedimiento se ejecuta. Los parámetros de entrada habilitan al usuario que está ejecutando el procedimiento a pasar valores al procedimiento almacenado. No se puede borrar parte de un grupo de procedimientos almacenados con el comando DROP PROCEDURE. MODULO IV: Implementar procedimientos almacenados TEMA 3: Programar procedimientos almacenados Parámetros y variables Los parámetros y las variables son una parte fundamental de hacer dinámico a un procedimiento almacenado.

Primero. Cuando se ejecuta el procedimiento. “Número de Ventas” = @y_YtdSales GO Se declaran dos variables: @y_YtdSales y @t_TitleText. El siguiente comando ejecuta el procedimiento almacenado que vimos: -.configura los valores de variables con los parámetros de salida @YtdSales = @y_YtdSales OUTPUT. Estas dos variables pueden tener el mismo nombre que los parámetros de . @Title = “%Garlic%” – especifica un valor para el parámetro de entrada -.Muestra las variables retornadas por el procedimiento SELECT “Title” = @t_TitleText.114-146 @YtdSales int OUTPUT. --Primer parámetro de salida @TitleText varchar(80) OUTPUT –Segundo parámetro de salida AS -.Declara variables para recibir las salidas del procedimiento DECLARE @y_YtdSales int. @TitleText = title FROM titles WHERE title LIKE @Title GO El parámetro de entrada es @Title (título). @t_TitleText varchar(80) EXECUTE SalesForTitle -. Cuando se ejecuta la consulta. Estas dos variables recibirán los valores almacenados en los parámetros de salida. @Title.controla por un título que coincida con el parámetro de entrada SELECT @YtdSales = ytd_sales. se debe proveer un valor para el parámetro de entrada o fallará la consulta.Asigna la columna de datos a los parmetros de salida y -. el comando SELECT utiliza a los tres parámetros. y los de salida son @YtdSales y @TitleText. a los parámetros de salida se les asigna a las columnas de la consulta. @Titletext = @t_TitleText OUTPUT. Fíjese que los tres parámetros tienen definidos sus tipos de datos. Después que se definen los parámetros. los parámetros de salida contendrán los valores de esas dos columnas. La cláusula WHERE del comando SELECT contiene el parámetro de entrada. Advierta que el tipo de datos de la variables que reciben son los mismos que los tipos de los correspondientes parámetros de salida. Los parámetros de salida incluye la palabra clave OUTPUT.

el parámetro de entrada @Title es igualado a %Garlic%.115-146 salida correspondientes dado que las variables en un procedimiento almacenado son locales al batch que las contiene. Cuando se declara una variable. Fíjese que la palabra OUTPUT se indica cuando el parámetro se asigna a la variable. Aún cuando el comando SELECT en el procedimiento devuelve múltiples filas. la variable no puede mostrar los valores en el comando SSELECT al final del código. Por claridad. Mas adelante veremos algunas soluciones a este problema. tales como una base no disponible o errores de usuarios. esta no se asigna con un parámetro de salida.recibe el primer parámetro de salida @t_TitleText OUTPUT -. se necesita codificar para manejar errores. cada variable mantiene sólo un valor (la última fila de datos retornada). Fíjese que no es necesario asignar específicamente las variables desde el procedimiento almacenado al valor del parámetro de salida o a las variables de salida declaradas aquí: DECLARE @y_YtdSales int. Dado que la cláusula WHERE usa la palabra clave KEYWORD. Por ‘ultimo. SQL Server provee funciones y comandos para tratar con los errores que se producen durante la ejecución de un procedimiento almacenado. este retorna lo siguiente: Title Number Return of Sales NULL NULL Un interesante resultado de este procedimiento es que se retorna sólo una fila. se pueden usar caracteres comodines (tal como %) para que que la consulta busque aquellos títulos que contienen la palabra Garlic. A continuación se muestra un modo mas sucinto de ejecutar el procedimiento.muestra las variables retornadas por la ejecución del procedimiento SELECT “Title” = @t_TitleText.recibe el segundo parámetro de salida -. “Número de ventas” = @y_YtdSales GO Cuando se ejecuta el procedimiento. Este valor se envía a la cláusula WHERE del comando SELECT del procedimiento almacenado. los nombres de las variables son diferentes a los de los parámetros de salida. Las dos categorías primarias de errores de computo. -. @t_TitleText varchar(80) EXECUTE SalesForTitle “%Garlic%”. Las variables son asignadas con parámetros de salida después del comando EXECUTE. Si no se especifica OUTPUT.configura el valor del parámetro de entrada @y_YtdSales OUTPUT -. Se utilizan códigos de retorno y la . El comando RETURN y el manejo de errores A menudo.

El ejemplo siguiente muestra como modificar el procedimiento almacenado SalesForTitle para usar un código de retorno (y proveer un mensaje mas útil): ALTER PROCEDURE dbo. El comando RETURN se usa para generar códigos y salidas de un batch. @titletext varchar (80) OUTPUT AS -. Sino. Considere el procedimiento almacenado SalesForTitle del punto anterior. ejecutar el procedimiento retorna el siguiente conjunto de resultados: Title Onions. el procedimiento almacenado termina inmediatamente. Los códigos de retorno pueden usarse para otros propósitos además de manejar errores.SalesForTitle @Title varchar(80). El comando RETURN se usa primariamente para el manejo de errores porque cuando se corre el comando RETURN. sale y devuelve 1 IF (SELECT COUNT(*) FROM titles WHERE title LIKE @Title) = 0 RETURN(1) ELSE SELECT @YtdSales = ytd_sales. and Garlic: Cooking Secrets of the Mediterranean Number Return of Sales 375 Code 0 Es mas claro explicar el usuario que no se han encontrado registroa. Si el valor especificado para el valor de entrada (@Title) no existe en la base ded atos. Veremos ejemplos de códigos que usan los códigos de retorno para proveer un valor tanto como para manejar errores o para otros fines. @TitleText = title FROM titles WHERE title LIKE @Title GO .116-146 función @@ERROR para manejar errores que se producen cuando se ejecuta el procedimiento. Leeks. @YtdSales int OUTPUT.Controla para ver si el titulo esta la base. y puede proveer d cualquier valor entero al programa que llamador.

"Number of Sales" = @y_YtdSales. Es un medio para acceder uniformemente a todos los tipos de datos.117-146 La sentencia IF posterior la palabra clave AS determina si el parámetro de entrada es provisto cuando el procedimiento se ejecuta y si coincide con algún registro de la base de datos. "Return Code" = @r_Code ELSE IF @r_Code = 1 PRINT 'No matching titles in the database. En este caso el código de retorno es igual a 0. sean relacionales o no.ActiveX Data Objects Definición ADO en ActiveX Data Objets es un modelo de objetos de acceso a datos que se apoya sobre OLEDB. Oracle…). mientras que OLEDB permite el acceso a todos los tipos de datos. fuentes de datos que no son de Microsoft. El ejemplo siguiente configura al parámetro de entrada @Title igual a Garlic%: --Agrega @r_Code para mantener el resultado DECLARE @y_YtdSales int. RETURN(1).Determina el valor de @r_Code y ejecuta el codigo IF @r_Code = 0 SELECT "Title" = @t_TitleText.Ejecuta el procedimeinto e iguala @r_Code al el procedimiento EXECUTE @r_Code = SalesForTitle @YtdSales = @y_YtdSales OUTPUT. Permite dirigir los datos que vienen de bases de datos relacionales (SQL Server. entonces el código de retorno es puesto en 1. En otro caso. @t_TitleText varchar(80). Return code=' + CONVERT(varchar(1). @Title = "Garlic%" -. etc. . o de otras fuentes de datos no relacionales como ficheros de texto. Si la función COUNT retorna 0.@r_Code) GO MODULO IV: Conectarse a un SQL Server TEMA 1: Comenzando con ADO . Para invocar el procedimiento se necesitan hacer algunos cambios. @r_Code int -. @TitleText = @t_TitleText OUTPUT. En cierta manera podemos decir que ODBC permite acceder a bases de datos relacionales. se ejecuta la consulta SELECT por las ventas anuales y la información del libro.

Esta tecnología tiene como objetivo reemplazar a la tecnología ODBC. Facilidad de utilización: modelo de objetos automatizado Tiene en cuenta los conocimientos adquiridos por los desarrolladores sobre la otras tecnologías como DAO o RDO Arquitectura tecnológica OLEDB es una tecnología que tiene como objetivo resolver ciertas restricciones de ODBC. y tiene en cuenta las restricciones de la web. Sus principales características son las siguientes: Mínimo tráfico en la red Thread Safe (soportando accesos concurrentes o multithread) Número mínimo de capas entre las aplicaciones y los datos. Permite a un usuario OLEDB alcanzar todo tipo de fuentes de datos de una manera uniforme a través de este juego de interfaces documentado. un proveedor OLEDB es similar a un driver ODBC que proporciona un mecanismo uniforme de .118-146 Este modelo de objetos se ha introducido como modelo de acceso de datos para IIS. Esta tecnología autoriza el acceso a todo tipo de datos. En cierto sentido. permitiendo administrar el aspecto de tener distribuidas las fuentes de datos. ADO es el modelo de objetos que permite simplificar el acceso a esta tecnología. Un proveedor OLEDB implementa las interfaces OLEDB.

por lo tanto. una vez que éste contiene los datos. Descripción de los objetos y colecciones La colección Properties proporciona la información sobre las características de los diferentes objetos Connection. Objeto Recordset Permite ver y manipular los resultados de una consutla Colección Parameters Es utilizada cuando la consulta del objeto Command necesita los parámetros. . permite obtener información precisa sobre la causa del error. Objetos y Colecciones del modelo de objetos ADO Los objetos Connection. Colección Errors La colección Errors y el objeto Error se acceden a través del objeto Connection. Clásicamente. Cada objeto de Property es accesible a través de la colección Properties de cada uno de estos objetos. El objeto Error es diferente del objeto Err de VB. Command. Colección Fields La colección Fields y el objeto Field se utilizan a través del objeto Recordset. El modelo de objetos ADO El esquema siguiente muestra los objetos y las relaciones existentes entre los objetos y el modelo. como las consultas SQL o las actualizaciones de una base de datos. Además. en la medida en que no contiene los errores generados y definidos por el proveedor. a no ser que se produzca un error de proveedor . Recordset y Field. los proveedores OLEDB se construyen sobre la base del modelo COM (Component Objet Model) mientras que los drivers ODBC están basados en una especificación de APIs de C. una aplicación las utiliza como: Objeto o Colección Objeto Connection Objeto Command Utilización Permite establecer las conexiones entre el cliente y el origen de datos Permite realizar los comandos.119-146 acceso a los datos relacionales. Los proveedores OLEDB no sólo proporcionan un mecanismo uniforme de acceso a los datos relacionales. Recordset y Command son los objetos más significativos de este modelo. si no que también a datos no relacionales.

Por consiguiente. lo muestra. If cn. Por ejemplo. cn. ADO es un modelo de objetos que permite una gran flexibilidad al programador.Connection Set cn = New ADODB.Workspace para poder crearse). En resumen. sin hacer referencia al objeto relacionado. y contraseña. excepto Error. Esto es diferente de los objetos DAO y RDO. este es un diagrama que muestra las relaciones entre los diferentes objetos que constituyen ADO: Ejemplos de ADO Abrir y cerrar una conexión con una base de datos SQL Server usando el proveedor por defecto que es el proveedor de OLEDB para ODBC Sub ConnectionExample1() Dim cn As ADODB. especificando el nombre del origen de datos.Print "Conexión abierta. es decir.Close End Sub . para ejecutar una consulta. cn. es posible usar el método Execute del objeto Command o bien el del objeto Connection. "" ' Si la conexión está abierta.Open "DSNPubs". Field y Property pueden crearse de forma autónoma. los objetos de ADO.120-146 Colección Properties Aunque ADO es un modelo del tipo jerárquico." End If ' Cerrar la conexión. hay distintas posibilidades para lograr la misma tarea. un objeto DAO.Connection ' Abrir la conexión.State = adStateOpen Then Debug. que requieren en la mayoría de los casos la creación del objeto Parent (por ejemplo. "sa".Connection necesita un objeto DAO. ' id de usuario.

MoveNext Loop ' Cerrar el recordset. especificando la sentencia SQL ' y la cadena de conexión." End If ' Cerrar la conexión.Open "Select * fromtitles"."DSN=pubs. cmd. If cn.Open "Data Source=MySQLServerName.CommandText = "Select * from titles" cmd. y especificar que es ' una sentencia SQL.Close End Sub Usar el método Execute del objeto Command para ejecutar una consulta de tipo texto Sub CommandExample() Dim cmd As New ADODB. cn.Print "Conexión abierta.UID=sa" ' Bucle a través del recordset e impresión del primer campo.Close Set cn = Nothing End Sub Abrir y cerrar un Recordset Sub RecordsetExample() Dim rs As New ADODB.Connection cn.Print rs(0) rs.EOF Debug.Initial Catalog=pubs. Do While Not rs.Provider = "SQLOLEDB" cn.".UID=sa" ' Establecer el comando texto.CommandType = adCmdText ' Crear un recordset.Recordset ' Establecer el comando conexión usando una cadena de conexión. lo muestra.ActiveConnection = "DSN=pubs.121-146 Abrir y cerrar una conexión con una base de datos SQL Server usando el proveedor OLEDB para SQL Server que es el proveedor recomendado Private Sub ConnectionExemple2() Dim cn As New ADODB.Recordset ' Abrir el recordset. Set rs = cmd.Command Dim rs As New ADODB. cmd. rs. "" ' Si la conexión está abierta. rs.Execute() . "sa".State = adStateOpen Then Debug.

cmd.CommandType = adCmdStoredProc ' Establecer un nuevo parámetro para el procedimiento guardado.Open "Provider=Microsoft.mdb" cn. adParamInput.EOF Debug.Close Set cn = Nothing .Append prm ' Crear un recordset. Set rs = cmd.Close End Sub Usar el método Execute del objeto Command para ejecutar un procedimiento de almacenado Sub ParameterExample() Dim cmd As New ADODB.Connection cn.Recordset Dim prm As ADODB.[Sheet3] From Clients" cn.xls.Connection Set cn = New ADODB.MoveNext Loop ' Cerrar el recordset.Execute "Select * into [Excel8.Jet.Parameter ' Establecer el comando conexión usando una cadena de conexión. Set prm = cmd.0.0].Print rs(0) rs.ActiveConnection = "DSN=pubs.CreateParameter("Royalty".Close End Sub Almacenar los resultados de una consulta Access en un fichero Excel Private Sub Command1_Click() Dim cn As ADODB.Execute ' Bucle a través del recordset e impresión del primer campo.MoveNext Loop ' Cerrar el recordset. rs.Print rs(0) rs.OLEDB.Database=c:\Test1. cmd.EOF Debug.Hdr=Yes]. . Do While Not rs.uid=sa" ' Establecer el comando texto.Command Dim rs As New ADODB. 50) cmd.CommandText = "byroyalty" cmd.Data Source= c:\bd1. y especificar que es ' una sentencia SQL.122-146 ' Bucle a través del recordset e impresión del primer campo. Do While Not rs.Parameters.4. adInteger. rs.

Print errLoop. For Each fld In rs.Connection Set cn = New ADODB.Recordset ' Abrir el recordset.Open "Select * fromauthors".Print errLoop.Value Next fld ' Cierre del recordset. "" Exit Sub AdoError: Dim Errs As ADODB.Fields Debug.123-146 End Sub ' Explorar la colección Errors.Close End Sub Mostrar los valores de ciertas propiedades de una conexión (el curso de la colección de Properties) .Recordset Dim fld As ADODB. rs."DSN=pubs.Print "Name: " & fld. tipo y valor) de un recordset Sub FieldExample() Dim rs As ADODB.UID=sa" Debug.Open "MissingDSN".Name & vbCr & _ "Type: " & fld. especificando la sentencia SQL ' y la cadena de conexión.Print "Fields in Authors Table:" & vbCr ' Bucle hasta el objeto Field en la ' Colección Fields de la tabla y muestra las propiedades.Errors Dim errLoop As Error Dim strError As String ' Bucle hasta el objeto Error en la ' colección Errors y muestra las propiedades.Description Next End Sub Enumerar los campos (nombre. "sa". Set Errs = cn.Print errLoop.SQLState Debug.NativeError Debug. rs.Connection On Error GoTo AdoError ' Abrir la conexión usando un DSN que no existe.Errors For Each errLoop In Errs Debug.Field Set rs = New ADODB. cn.Type & vbCr & _ "Value: " & fld. Sub ErrorExample() Dim cn As ADODB.

Print rs. Set rs = cmd. u contraseña. especificando el nombre del origen de datos.Print cn.ActiveConnection = cn ' Establecer el comando texto. Debug. especificando que es una sentencia SQL.Close End Sub Las cadenas de conexión Si necesita escribir una cadena de conexión. hacer clic en el botón derecho sobre Connection1 para ver las características de la conexión (el proveedor. Probar la conexión antes de hacer clic en el botón de Aceptar Entrar en la ventana de propiedades y seleccionar el objeto Connection1: La propiedad DataSource contiene la cadena de conexión necesaria. Debug.Connection Dim cmd As New ADODB.Properties("Command Time out") ' Muestra la propiedad Updatability del recordset.Properties("Updatability") ' Cierra el recordset.Properties("Connect Timeout") ' Muestra la propiedad CommandTimeout del comando.CommandText = "Select * from titles" cmd.Open "pubs". las propiedades específicas).124-146 Sub PropertyExample() Dim cn As New ADODB. . "sa" ' Establecer el comando conexión usando una cadena de conexión.Recordset ' Abrir la conexión.Execute() ' Muestra la propiedad ConnectionTimeout de la conexión. existe una manera de generarla con el asistente de creación de una conexión de datos. ' id del usuario. Set cmd. cn.CommandType = adCmdText ' Crear el recordset.Command Dim rs As New ADODB. Debug. Se puede usar esta herramienta de creación de conexiones de datos en VB: • • • • • Utilize el menú Ver y seleccione Ventana de la vista Datos Cree un Entorno de datos haciendo clic en el botón derecho en la ventana de datos. DSN. rs. cmd.Print cmd. En la ventana Entorno de datos.

125-146 .

ADO es la única interfaz de datos necesaria para programar soluciones cliente/servidor de 1 a n capas y soluciones basadas en datos Web. ADO constituye un método de acceso a datos coherente y de alto rendimiento. ADO está diseñada como una interfaz de nivel de aplicación. texto y gráficos. puesto que los ADO han sido diseñados para combinar las mejores funciones de RDO y DAO.Recordset y Field También tiene una colección Properties. para toda clase de datos.126-146 MODULO IV: Conectarse a un SQL Server TEMA 2: Modelo de objetos de ADO Objetos de datos ActiveX Los Objetos de datos ActiveX® (ActiveX® Data Object. Y. ADO es fácil de usar porque se activa mediante un método conocido: la interfaz OLE. OLE DB. disponible prácticamente en todas las herramientas y lenguajes existentes actualmente en el mercado. lenguaje o. etc. ADO se implementa con un mínino de tráfico de red en escenarios Internet clave y con un mínino de capas entre los datos de origen y los resultados proporcionando una interfaz ligera y de altas prestaciones. ADO) constituyen una interfaz de Microsoft. como si se crea un objeto de trabajo de capas intermedias con una aplicación. como las bases de datos relacionales y no relacionales. los sistemas de correo electrónico y archivo. herramienta. utiliza convenciones similares con semántica simplificada que facilitan el aprendizaje a los programadores. . tanto cuando se crea una base de datos cliente de usuario. incluso. OLE DB proporciona acceso de alto rendimiento a cualquier origen de datos. Modelo de objetos de ADO Cada uno de los objetos Connections. y eventualmente para sustituirlos. con un explorador de Internet. fácil de usar. los objetos de trabajo personalizados. para el modelo más reciente y potente de acceso a datos de Microsoft. estratégica y de alto nivel.Command.

Para crear un objeto Command independientemente de un objeto Connection previamente definido.127-146 MODULO IV: Conectarse a un SQL Server TEMA 3: Objetos ADO Command. — Controlar con la propiedad Prepared. — Especificar el tipo de comando con la propiedad CommandType antes de la ejecución para optimizar el rendimiento. métodos o propiedades de Command pueden generar un error cuando se les haga referencia. si el proveedor guarda una versión preparada (o compilada) del comando antes de la ejecución. — Ejecutar un comando y obtener un objeto Recordset si resulta apropiado con el método Execute. esto asigna el objeto Connection a una variable de objeto. — Asociar una conexión abierta con un objeto Command estableciendo su propiedad ActiveConnection. una instrucción SQL) con la propiedad CommandText. Sin embargo. Nota: Para ejecutar una consulta sin utilizar un objeto Command. puede hacer lo siguiente: — Definir el texto ejecutable del comando (por ejemplo. establezca su propiedad ActiveConnection a una cadena de conexión válida. métodos y propiedades de un objeto Command. pero no asigna dicho objeto a una variable de objeto. o utilizar parámetros en la consulta. si va a asociar varios objetos Command con la misma conexión. Si no establece la propiedad ActiveConnection . objeto (ADO) Descripción Un objeto Command es la definición de un comando específico que se piensa ejecutar contra un origen de datos. — Establecer el número de segundos que un proveedor esperará que el comando se ejecute con la propiedad CommandTimeout. algunas colecciones. se requiere un objeto Command cuando quiera que el texto del comando persista y volver a ejecutarlo. Con las colecciones. Sin embargo. — Definir consultas parametrizadas o argumentos de procedimientos almacenados con los objetos Parameter y la colección Parameters. ADO sigue creando un objeto Connection. — Pasar un objeto Command a la propiedad Source de un Recordset para obtener los datos. Dependiendo de la funcionalidad del proveedor. tiene que crear y abrir de forma explícita un objeto Connection. Utilice un objeto Command para consultar una base de datos y obtener registros en un objeto Recordset para ejecutar una operación de manejo masivo de datos o para manipular la estructura de una base de datos. pase una cadena de consulta al método Execute de un objeto Connection o al método Open de un objeto Recordset. — Establecer la propiedad Name para identificar el objeto Command como un método del objeto Connection asociado.

Método Execute (ADO Connection). — Especificar un proveedor de OLE DB con la propiedad Provider. — Establecer. ConnectionTimeout y Mode.128-146 de los objetos Command a esta variable de objeto. Propiedad CommandTimeout (ADO). Métodos Método Cancel (ADO). Un objeto Connection representa una sesión única con un origen de datos. Si el objeto Command tuviera parámetros. Propiedades Propiedad ActiveConnection (ADO). métodos o propiedades de un objeto Connection puede que no estén disponibles. — Establecer la propiedad CursorLocation para invocar al Client Cursor Provider. — Administrar transacciones en la conexión abierta. . Connection. puede ser equivalente a una conexión de red actual con el servidor. Propiedad CommandType (ADO). Colección Parameters. objeto (ADO) Descripción Un objeto Connection representa una conexión abierta con un origen de datos. Propiedad CommandTect (ADO). la conexión física con el origen de datos con los métodos Open y Close. con los métodos BeginTrans. y después romper. Dependiendo de la funcionalidad que acepte el proveedor. Para ejecutar un Command. — Ejecutar un comando en la conexión con el método Execute y configurar la ejecución con la propiedad CommandTimeout. Propiedad State (ADO). Colecciones Colección Properties. El objeto Command ha de tener su propiedad ActiveConnection establecida al objeto Connection. pase los valores de los parámetros como argumentos del método. incluso si utiliza la misma cadena de conexión. métodos y propiedades de un objeto Connection puede hacer lo siguiente: — Configurar la conexión antes de abrirla con las propiedades ConnectionString. incluyendo transacciones anidadas si el proveedor las acepta. Método Execute (ADO Command). — Establecer la base de datos predeterminada para la conexión con la propiedad DefaultDatabase. ADO crea un nuevo objeto Connection por cada objeto Command. algunas colecciones. Método CreateParameter (ADO). CommitTrans y Rolí-backjrans y la propiedad Attributes. que acepta actualizaciones por lotes. En el caso de un sistema de base de datos cliente/servidor. Mediante las colecciones. sólo invóquelo utilizando su propiedad Name en el objeto Connection asociado. Propiedad Prepared (ADO). — Establecer el nivel de aislamiento de las transacciones abiertas en la conexión con la propiedad IsolationLevel.

Propiedad ConnectionString (ADO). Propiedad Provider (ADO). se borra la colección Errors y el nuevo conjunto de objetos Error se agrega a la colección Errors. Método Save (Conjunto de Registros ADO). Propiedad Version (ADO). seguido de sus parámetros. Propiedad Mode (ADO). objeto (ADO) Descripción Un objeto Error contiene los detalles sobre los errores de acceso a los datos pertenecientes a una única operación relacionada con el proveedor. se requiere un objeto Command cuando se quiere que el texto del comando persista y se vuelva a ejecutar. Método Open (Conjunto de Registros ADO). dé un nombre al comando mediante la propiedad Name del objeto Command. seguido de cualquier parámetro. Método Cancel (ADO). Colección Errors. Método OpenSchema (ADO). . emita una instrucción donde se utilice el nombre del procedimiento almacenado como si fuese un método del objeto Connection. Establezca la propiedad ActiveConecction del objeto Command como la conexión. o utilice parámetros en la consulta. Error. Método Close (ADO). Propiedad CommandTimeout (ADO). Nota: Para ejecutar una consulta sin utilizar un objeto Command. seguido de un objeto Recordset si se devuelve alguna fila. Propiedad ConnectjonTimeout (ADO). Cualquier operación relacionada con objetos ADO puede generar uno o varios errores del proveedor. CommitTrans y RollbackTrans (ADO>. Puede crear objetos Connection de forma independiente de cualquier objeto previamente definido. Método Open (Conexión ADO). Propiedad IsolationLevel (ADO). Propiedad DefaultIDatabase (ADO). Método Execute (Comando ADO). Establezca las propiedades del Recordset para personalizar el conjunto de registros resultante: Para ejecutar un procedimiento almacenado. — Leer la versión de la implementación de ADO en uso con la propiedad Version. Propiedad CursorLocation (ADO). uno o varios objetos Error se agregan a la colección Errors del objeto Connection. Para ejecutar un comando. Sin embargo. Objetos ADO 1315 Métodos Métodos BeginTrans. ADO realizará una "mejor suposición" de los tipos de parámetros Propiedades Propiedad Attributes (ADO). — Obtener información del esquema de la base de datos con el método OpenSchema. pase una cadena de consulta al método Execute de un objeto Connection. Nota: Se pueden ejecutar comandos o procedimientos almacenados como si fuesen métodos nativos del objeto Connection. Después emita una instrucción donde el nombre del comando se utilice como si fuese un método del objeto Connection.129-146 — Examinar los errores devueltos por el origen de datos con la colección Errors. Colecciones Colección Properties. Propiedad State (ADO). Al ocurrir los errores. Método Execute (Conexión ADO). Cuando otra operación ADO genera un error.

que contiene el texto del error. Por ejemplo. que proporcionan información desde orígenes de datos SQL. invoque el método Clear de la colección Errors para que pueda leer la propiedad Count de la colección Errors y comprobar las advertencias devueltas. el método Open de un objeto Connection. Propiedad SQLState (ADO). Los errores de ADO pasan al mecanismo de control de excepciones de ejecución. Propiedad Source (ADO Error). Igual que los proveedores. que identifica el objeto que ha provocado el error. — La propiedad Number.130-146 Nota: Cada objeto Error representa un error del proveedor concreto. . Puede leer las propiedades de un objeto Error para obtener detalles específicos sobre cada error. Algunas propiedades y métodos devuelven advertencias que aparecen como objetos Error en la colección Errors. puede hacer lo siguiente: — Obtener el nombre de un campo con la propiedad Name. UpdateBatch o CancelBatcb de un objeto Recordset. incluyendo los siguientes: — La propiedad Description. Field. ADO acepta la devolución de varios errores por una misma operación ADO para permitir tener acceso a la información de error específica del proveedor. Para obtener esta rica información de error en un controlador de errores. Si no hay un objeto Connection válido. utilice las funciones de interceptación de errores apropiadas de su lenguaje o entorno de trabajo y después utilice bucles anidados para enumerar las propiedades de cada objeto Error de la colección Errors. La propiedad Value de los objetos Field se utiliza para establecer u obtener los datos del registro actual. Cada objeto Field se corresponde con una columna del Recordset. la ocurrencia de un error concreto de ADO desencadenará un evento On Error y aparecerá en el objeto Err. Con las colecciones. objeto (ADO) Un objeto Field representa una columna de datos con un tipo de datos comun. Un objeto Recordset tiene una colección Fields que consiste en varios objetos Field. tendrá que obtener la información de error desde el objeto Err. Antes de invocar los métodos Resync. se agrega a la colección Errors del objeto Connection. Dependiendo de la funcionalidad ofrecida por el proveedor. métodos o propiedades de un objeto Field puede que no estén disponibles. Archivo Help. Esto es particularmente útil cuando tiene varios objetos Error en la colección Errors después de una petición a un origen de datos. o de establecer la propiedad Filter de un objjeto Recordset. Propiedades Propiedad Description (ADO). vea el tema Códigos de error ADO tema. pero no detienen la ejecución de los programas. — La propiedad Source. métodos y propiedades de un objeto Field. ADO borra el objeto OLE Error Info antes de hacer una llamada que pueda generar un nuevo error del proveedor. Microsoft Visual Basic y VBScript. que contiene el valor entero Long de la constante del error. la colección Errors del objeto Connection sólo se borra y se llena cuando el proveedor genera un nuevo error. no un error de ADO. Propiedad NaviteError (ADO). Para obtener la lista completa de los errores de ADO. o cuando se invoca el método Clear. Cuando ocurre un error en el proveedor. — Las propiedades SQLState y NativeError. en Microsoft Visual Basic. Propiedad Number (ADO). algunas colecciones. Sin embargo.

Su establecimiento en tal momento es útil en la generación dinámica de formularios. — Si el proveedor acepta actualizaciones por lotes. y otro para definir el nombre de la columna de la cláusula SORT BY. Los objetos Parameter representan parámetros asociados con consultas parametrizadas.131-146 — Ver o modificar los datos del campo con la propiedad Value. — Pasar datos binarios o de gran tamaño a un parámetro con el método AppendChunk. — Obtener el tamaño declarado de un campo con la propiedad DefinedSize. algunas colecciones. Propiedad Value (ADO). — Establecer u obtener características de un parámetro con las propiedades Attributes. Si conoce los nombres y las propiedades de los parámetros asociados con el procedimiento almacenado o la consulta parametrizada a la que vaya a invocar. Estos son comandos en los que la acción deseada está definida una sola vez. puede utilizar el método Createparameter para crear . Método GetChunk (ADO). Parameter. Precision. Type. Propiedad NumericScale (ADO). Propiedad Precision (ADO). Propiedad Type (ADO). métodos y propiedades de un objeto Parameter. Dependiendo de la funcionalidad del proveedor. objeto (ADO) Un objeto Parameter representa un parámetro o un argumento asociado con un objeto Command basado en una consulta parametrizada o en un procedimiento almacenado. NumericScale. Propiedad Attributes (ADO). — Obtener las características básicas de un campo con las propiedades Type. pero se utilizan variables (o parámetros) para alterar algunos detalles del comando. Métodos Método AppendChunk (ADO). — Manipular los valores de los campos que contengan datos binarios o de gran tamaño con los métodos AppendChunk y GetChunk. Direction. Precision y NumericScale) están disponibles antes de abrir el Recordset del objeto Field. DefinedSize. — Establecer u obtener el valor de un parámetro con la propiedad Value. Propiedad DefinedSize (ADO). puede hacer lo siguiente: — Establecer u obtener el nombre de un parámetro con la propiedad Name. una instrucción SQL SELECT podría utilizar un parámetro para definir los criterios de búsqueda de la cláusula WHERE. Propiedad UnderlyingValue (ADO). Precision y NumericScale. Muchos proveedores aceptan comandos parametrizados. Colecciones Colección Properties. Propiedad OriginalValue (ADO). Size y Type. Por ejemplo. — Determinar qué tipos de funcionalidad se aceptan para un campo dado con la propiedad Attributes y la colección Properties. Propiedad Name (ADO). — Obtener el tamaño actual de los datos de un campo dado con la propiedad ActualSize. Todas las propiedades de metadatos (Name. Propiedades Propiedad ActualSize (ADO). resolver discrepancias en los valores de tos campos durante una actualización por lotes con las propiedades OriginalValue y UnderlyingValue. métodos o propiedades de un objeto Parameter puede que no estén disponibles. o los argumentos de entrada/salida y los valores devueltos por los procedimientos almacenados. Con las colecciones.

por tanto. Colecciones Colección Properties. Recordset.Recordset son ProgID que se utilizan para crear objetos Recordset. — Cursor estático: proporciona una copia estática de un conjunto de registros para que se utilicen en búsquedas de datos o para generar informes.).Recordset y ADODB. Los objetos Recordset se utilizan para manipular los datos de un proveedor. objeto (ADO) Un objeto Recordset representa todo el conjunto de registros de una tabla o del resultado de un comando ejecutado. Cuando se utiliza ADO. Propiedad Value (ADO). cliente. Las modificaciones en los datos efectuadas por otros usuarios siguen siendo visibles. ADOR. independientemente del ProgID. una operación que potencialmente consume bastantes recursos. excepto que impide ver registros agregados por otros usuarios. Dependiendo de la funcionalidad aceptada por el proveedor. En cualquier momento. por tanto. e impide el acceso a registros eliminados por otros usuarios.Recordset se instala con Internet Explorer de Microsoft®. modificaciones y eliminaciones de otros usuarios. servidor. Esto le permite establecer y obtener valores de parámetros sin tener que invocar el método Refresh de la colección Parameters para obtener información de los parámetros desde el proveedor. Internet Explorer. llamado registro actual. Las inserciones. ADOR. — Cursor de conjunto de claves: se comporta como un cursor dinámico. El comportamiento de un objeto Recordset esta afectado por su entorno (esto es. Hay cuatro tipos diferentes de cursores en ADO: — Cursor dinámico: le permite ver inserciones. Los objetos Recordset que resultan se comportan de forma idéntica. algunos métodos o propiedades del objeto Recordset puede que no estén disponibles. permite siempre los marcadores y. métodos y eventos. el objeto Recordset sólo hace referencia a un único registro dentro del conjunto. Propiedades Propiedad Attributes (ADO). Propiedad NumericScale (ADO). Métodos Método AppendChunk (ADO). Tollos los objetos Recordset se construyen utilizando registros (filas) y campos (columnas). Método Delete (Colección de parámetros ADO). Método Delete (Conjunto de Registros ADO).Recordset se instala con ADO. se manipulan los datos casi completamente con objetos Recordset. modificaciones o eliminaciones efectuadas por otros usuarios no serán visibles. etc.132-146 objetos Parameter con los valores apropiados y utilizar el método Append para agregarlos a la colección Parameters. Acepta siempre marcadores y. permite todos los tipos de movimientos a través del Recordset. permite marcadores si el proveedor los acepta. ADODB. Propiedad Type (ADO). y permite todos los tipos de movimientos a través del Recordset que estén relacionados con marcadores. Propiedad Precision (ADO). Las diferencias se describen en los temas de Ayuda de sus propiedades. Propiedad Name (ADO>. Este es el único tipo de cursor permitido cuando se abre un objeto Recordset en el lado del cliente (ADOR). Propiedad Size (ADO). permite todos los tipos de movimientos a través del Recordset. Propiedad Direction (ADO). .

Propiedad EditMode (ADO). Propiedad MarshalOption (ADO). Después de invocar el método UpdateBatch. Propiedad CursorType (ADO). Propiedad PageCount (ADO). o cuando utilice parámetros en la consulta. Método Resync (ADO). Propiedad CursorLocation (ADO). Cuando se utilizan con algunos proveedores (como Microsoft ODBC Provider para OLE DB junto con Microsoft SQL Server). Método Save (Conjunto de registros ADO). Update y Delete. Propiedad BOF. . si se están abriendo varios objetos Recordset en la misma conexión. Método Move (ADO). ADO crea un nuevo objeto Connection por cada nuevo Recordset.133-146 — Cursor de tipo Forward-only: se comporta de forma idéntica al cursor dinámico. Propiedad RecordCount (ADO). y las propiedades AbsolutePosition. Propiedad Status (ADO). los valores de las propiedades BOF y EOF son True. se puede hacer que el proveedor guarde en la caché las modificaciones efectuadas en varios registros y transmitirlos después en una sola llamada a la base de datos con el método UpdateBatch. AbsolutePage y Filter para volver a colocar el registro actual. Propiedad Source (Conjunto de Registros ADO). excepto en que sólo le permite recorrer los registros hacia delante. Pueden utilizarse los métodos Movelfirst. Cuando se utilizan métodos Move para visitar todos los registros (o para enumerar el Recordset). Método Update (ADO). Propiedad CacheSize (ADO). Propiedad AbsolutePosition (ADO). Los objetos Recordset pueden aceptar dos tipos de actualización: inmediata y por lotes. asumiendo que el proveedor acepta la funcionalidad necesaria. Si no se especifica el tipo del cursor. Método Requery (ADO). MoveLast. Propiedad ActiveConnection (ADO). Método Delete (Conjunto dc registros ADO). Sin embargo. Sin embargo. Propiedad State (ADO). ADO abre un cursor de tipo Forward-only de manera predeterminada. Método CancelUpdate (ADO). Propiedad MaxRecords (ADO). EOF (ADO). Propiedad Bookmark (ADO). Método Open (Conexión ADO) Método Open (Conjunto de regi~tros ADO). MoveLast. Método Delete (Colección de campos ADO). Propiedades Propiedad AbsolutePage (ADO). Método UpdateBatch (ADO). Métodos Método AddNew (ADO). También se pueden pasar matrices de valores como parámetros en los métodos AddNew y Update y actualizar de forma simultánea varios campos de un registro. pero no asigna dicho objeto a una variable de objeto. Método Cancel (ADO). Si un proveedor acepta la actualización por lotes. ADO sigue creando un objeto Connection. MoveNext y MovePrevious (ADO). Algunos proveedores no aceptan todos los tipos de cursores. Esto se aplica a las modificaciones efectuadas con los métodos AddNew. MoveNext y MovePrevious. Compruebe la documentación del proveedor. Si no hay registros. Método Supports (ADO). Los objetos Recordset de tipo Forward-only sólo aceptan el método MoveNext. Propiedad F'ilter (ADO). el registro actual está situado en el primer registro (si lo hay) y las propiedades BOBy EOF están establecidas a False. o pase un argumento CursorType con el método Open. se tiene que crear y abrir explícitamente un objeto Connection. Método CancelBatch (ADO). incluso si se pasa la misma cadena de conexión. todas las modificaciones se escriben inmediatamente en el origen de datos después de invocar el método Update. Se pueden crear tantos objetos Recordset como sea necesario. así se asigna el objeto Connection a una variable de objeto. se requiere un objeto Command cuando quiera que el texto del comando persista para volver a ejecutarlo. Nota: Para ejecutar una consulta sin utilizar un objeto Command. Método NextRecordset (ADO). Método Delete (Colección de parámetros ADO). se puede utilizar la propiedad Status para comprobar si ha habido algún conflicto en los datos para resolverlo. Propiedad LockType (ADO). Método Clone (ADO). se puede utilizar las propiedades BOF y EOF para saber si ha llegado al principio o al final del Recordset. Propiedad PageSize (ADO). así como el método Move. Métodos MoveFirst. Cuando se abre un Recordset. Establezca la propiedad CursorType antes de abrir el Recordset para elegir el tipo de cursor. Esto aumenta el rendimiento en situaciones en las que sólo tenga que efectuar un paso a través de un Recordset. En la actualización inmediata. pase una cadena de consulta al método Open de un objeto Recordset. Si no se utiliza dicha variable de objeto cuando se abren los objetos Recordset. se pueden crear objetos Recordset independientemente de un objeto Connection definido previamente pasando una cadena de conexión al método Open.

El puntero del registro actual está al comienzo del archivo (C5 decir. la posición actual se desconoce o el proveedor no admite la propiedad AbsoltitePage. cada una de las cuales debe tener un número de registros igual a PageSize (excepto la última página. Configuración y valores devueltos Establece o devuelve un valor de tipo Long entre 1 y el número de registros del objeto Recordset (RecordCount) o devuelve una de las constantes siguientes: Constante Descripción adPosUnknown adPosBOF adPosEOF El objeto Recordset está vacío. . la posición actual se desconoce o el proveedor no admite la propiedad AbsoltitePage. propiedad (ADO) Especifica la posición ordinal del registro actual de un objeto Recordset. El puntero del registro actual está al final del archivo (es decir. El puntero del registro actual está al final del archivo (es decir. la propiedad EOF tiene el valor True). Al igual que la propiedad AbsolutePosition. la propiedad BOF tiene el valor True). El proveedor debe ser compatible con la funcionalidad apropiada para que esta propiedad esté disponible. Configuración y valores devueltos Establece o devuelve un valor de tipo Long entre 1 y el número Recordset (PageCount) o devuelve una de las constantes siguientes: adPosUnknown adPosBOF adPosEOF El objeto Recordset está vacío.134-146 MODULO IV: Conectarse a un SQL Server TEMA 4: Propiedades ADO AbsolutePage. El puntero del registro actual está al comienzo del archivo (C5 decir. Se aplica a Objeto Recordset (ADO). Utilice la propiedad PageSize para dividir lógicamente el objeto Recordset en varias páginas. Utilice la propiedad AbsolutePage para identificar el número de la página en que se encuentra el registro actual. Establezca esta propiedad para moverse al primer registro de una página específica. la propiedad AbsolutePage está en base 1 v es igual a 1 cuando el registro actual es el primer registro del objeto Recordset. que puede tener menos registros). la propiedad EOF tiene el valor True). AbsolutePosition. Se aplica a Objeto Recordset (ADO). propiedad (ADO) Especifica en qué página reside el registro actual. la propiedad BOF tiene el valor True). Obtenga el número total de páginas a partir de la propiedad PageCount.

Password=. adCmdTable ' Enumerate Recordset. Cuando establece la propiedad AbsoiutePos¡tion.RecordCount & ")" If MsgBox(strMessage.UserId=sa. La posición de un registro dado cambia cuando se elimina un registro anterior Tampoco hay ninguna seguridad de que un registro dado tendrá la misma propiedad AbsolutePosition si se vuelve a consultar o se vuelve a abrir el objeto Recordset. El proveedor debe ser compatible con la funcionalidad apropiada para que esta propiedad esté disponible." & _ "Data Source=srv.CursorLocation = adUseClient rstEmployees. strCnn. ADO vuelve a cargar la memoria caché con un nuevo grupo de registros que comienza con el registro especificado. Nota: No debería utilizar la propiedad AbsolutePosition como un número de registro sustirntorio. Los marcadores siguen siendo la forma recomendada para conservar y volver a una posición dada.EOF ' Display current record information. . Utiliza la propiedad CursorLocation para habilitar la propiedad AbsolutePosition ajustando el cursor a un cursor de cliente: Public Sub AbsolutePositionX() Dim rstEmployees As ADODB. Puede obtener el número total de registros contenidos en dicho objeto Recordset a partir de la propiedad RecordCount. Al igual que la propiedad AbsolutePage. " Set rstEmployees = New ADODB. vbOKCancel) = vbCancel _ Then Exit Do rstEmployees.Open "employee".MoveNext Loop rstEmployees. .135-146 Utilice la propiedad AbsolutePosition para moverse a un registro según su posición ordinal en el objeto Recordset o para determinar la posición ordinal del registro actual.Recordset Dim strCnn As String Dim strMessage As String ' Open a recordset for the Employee table ' using a client cursor. v son la única manera de posicionamiento en todos los tipos de objetos Recordset. EOF. la propiedad AbsolutePosition está en base 1 y es igual a 1 cuando el registro actual es el púrner registro del objeto Recordset.AbsolutePosition & _ " of " & rstEmployees. rstEmployees.Initial Catalog= pubs. propiedades (ADO) . Ejemplo Este ejemplo muestra cómo la propiedad AbsolutePosition puede llevar cuenta del progreso de un bucle que enumera todos los registros de un Recordset.Close End Sub BOF. strCnn = "Provider=sqloledb. incluso si es para un registro contenido en la memoria caché actual. strMessage = "Employee: " & rstEmployees!lName & vbCr & _ "(record " & rstEmployees.Recordset ' Use client cursor to enable AbsolutePosition property. La propiedad CacheSize determina el tamaño de este grupo. Do While Not rstEmployees.

MovePrevious. Si se abre un objeto Recordset que no contiene registros las propiedades BOF y EOF se establecen a True y el valor de la propiedad RecordCount del objeto Recordset es cero. y devuelve False (O) si la posición del retristro actual esta en o después del primer registro. pero no puede localizar correctamente un registro: BOF MoveFirst.EOF=True Permitido Ambas True Ambas False Error Permitido Error Permitido Error Permitido Error Error Error Permitido Error Error Permitido Permitido Permitir un método Move no garantiza que el método localizará correctamente un registro.Recordset strCnn As String strMessage As String intCommand As Integer varBookmark As Variant . La propiedad BOF devuelve True (-1) si la posición del registro actual está antes del primer registro. Se aplica a Objeto Recordset ADO. Valor devuelto Las propiedades BOF y EOF devuelven valores Boolean. sólo significa que al llamar al método Move especificado no se producirá un error. La tabla siguiente muestra qué ocurre en los valores de las propiedades BOF y EOF cuando se llama a varios métodos Move. Utiliza la propiedad Bookmark para permitir al usuario etiquetar un registro en un Recordset y volver a él más tarde: Public Sub BOFX() Dim Dim Dim Dim Dim rstPublishers As ADODB. las propiedades BOF y EOF pueden conservar el valor False hasta que se intente volver a colocar el registro actual. Utilice las propiedades BOF y BOF para determinar si un objeto Recordset contiene registros o si se han sobrepasado los límites de un objeto Recordset al moverse de un registro a otro. Ningún cambio E¡emplo Este ejemplo utiliza las propiedades BOF y EOF para visualizar un mensaje si un usuario intenta desplazarse más allá del primer o último registro de un Recordset. Move > O Ningún cambio Ningún cambio EOF Ningún cambio Se establece a True. La propiedad EOF devuelve True si la posición del registro actual está después del último registro.136-146 BOF indica que la posición del registro actual está antes del primer registro de un objeto Recordset EOF indica que la posición del registro actual esta después del último registro de un objeto Recordset. Se establece a True. un registro. Esta tabla muestra qué métodos Move se permiten con diferentes combinaciones de las propiedades BOF y EOF: MoveFirst. MoveLast Move O MoveNext. Se establece a True. Cuando se abre un objeto Recordset que contiene. Si una de las dos propiedades BOF o EOF es true. Move <O Se establece a True. Move O MoveLast Move<O Move>O BOF=True. Si se elimina el último registro que queda en el objeto Recordset. MovePrevious. no hay ningún registro actual. al menos. el primer registro es el registro actual y las propiedades BOF y BOF tienen el valor False. MoveNext. y devuelve False si la posición del registro actual está en o después del último registro.EOF=False Permitido BOF=False.

Password=." rstPublishers.CursorLocation = adUseClient rstPublishers.RecordCount & ")" & vbCr & vbCr & _ "Enter command:" & vbCr & _ "[1 .Bookmark ' Go to the record indicated by the stored ' bookmark. strCnn." & _ vbCr & "Try again.MoveLast End If Case 2 rstPublishers.UserId=sa.Open "SELECT pub_id. trapping for BOF ' or EOF.MovePrevious If rstPublishers.EOF Then MsgBox "Moving past the last record. .BOF Then MsgBox "Moving past the first record.Bookmark = varBookmark End If Case Else Exit Do End Select Loop .MoveNext If rstPublishers.AbsolutePosition & _ " of " & rstPublishers. Case 1 rstPublishers.CursorType = adOpenStatic ' Use client cursor to enable AbsolutePosition property. ." & _ "Data Source=srv.previous /" & vbCr & _ "3 . Case 3 varBookmark = rstPublishers.137-146 ' Open recordset with data from Publishers table. Case 4 If IsEmpty(varBookmark) Then MsgBox "No Bookmark set!" Else rstPublishers. strMessage = "Publisher: " & rstPublishers!pub_name & _ vbCr & "(record " & rstPublishers.MoveFirst End If ' Store the bookmark of the current record.next / 2 . " Set rstPublishers = New ADODB. rstPublishers.set bookmark / 4 .Recordset rstPublishers. strCnn = "Provider=sqloledb. pub_name FROM publishers " & _ "ORDER BY pub_name"." rstPublishers.go to bookmark]" intCommand = Val(InputBox(strMessage)) Select Case intCommand ' Move forward or backward.Initial Catalog= pubs. adCmdText rstPublishers." & _ vbCr & "Try again.MoveFirst Do While True ' Display information about current record ' and get user input.

El valor predeterminado es 30.Recordset Dim bmk(10) rs. Comentarios Use la propiedad CommandTimeout en un objeto Connection o en un objeto Command para permitir la cancelación de una llamada al método Execute.EOF <> True Debug. el intervalo de espera para que se ejecute un comando.Print "Number of records before filtering: ".MoveFirst While rs. Sólo son accesibles los registros referenciados por la matriz de marcadores: Public Sub BOFX2() Dim rs As New ADODB.Print rs.EOF <> True And ii < 11 bmk(ii) = rs. en segundos. adOpenStatic. se produce un error y ADO cancela el comando. debida a demoras en el tráfico de la red o a una sobrecarga en el servidor. rs.CursorLocation = adUseClient rs.Open "select * from authors". .UserId=sa. adLockBatchOptimistic Debug. rs("au_lname") rs. propiedad (ADO) Descripción Indica el intervalo de espera para que se ejecute un comando antes de que finalice el intento y se genere un error. Si establece la .Move 2 Wend rs.ActiveConnection = "Provider=sqloledb.138-146 rstPublishers.Bookmark ii = ii + 1 rs.RecordCount rs.MoveNext Wend End Sub CommandTimeout.Print "Number of records after filtering: ". Configuración y valores devueltos Establece o devuelve un valor Long que indica." rs. rs. Se aplica a Objeto Command (ADO)." & _ "Data Source=srv.Close End Sub Este ejemplo utiliza las propiedades Bookmark y Filter para crear una vista limitada del Recordset.Password=. Objeto Connection (ADO).Initial Catalog= pubs.RecordCount ii = 0 While rs.Filter = bmk Debug. Si transcurre el intervalo establecido en la propiedad CommandTimeout antes de que termine la ejecución de la orden.AbsolutePosition.

139-146 propiedad a cero. ADO admite cuatro argumentos con la propiedad ConnectionString. Argumento Descripción Provider Especifica el nombre del proveedor que se usa con la conexion. File Name Remote provider Especifica el nombre de un proveedor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service). Especifica el nombre de un proveedor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service). un objeto de origen de datos persistente) que contiene información sobre la conexión preestablecida. Remote Server Especifica la ruta de acceso del servidor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service). Se aplica a Objeto Connection (ADO). la propiedad CommandTimeout del objeto Command no hereda el valor de CommandTimeout del objeto Connection.. es posible que el proveedor modifique el contenido de la propiedad: por ejemplo. ConnectionString. Los argumentos compatibles con ADO son los siguientes: Argumento Provider= File Name= Remote provider= Remote Server= Descripción Especifica el nombre del proveedor que se usa con la conexion Indica el nombre de un archivo especifico del proveedor (por Qíempío. En un objeto Connection. Use la propiedad ConnectionString para especificar un origen de datos pasando una cadena de conexión detallada que contenga una serie de instrucciones argumento = valor separadas con punto y coma. Después de que se establezca la propiedad ConnectionString y se abra el objeto Connection. asignando los nombres de argumento definidos con ADO a sus equivalentes en el proveedor. la propiedad CommandTimeout permanece en modo lectura/escritura después de que se abra Connection. es decir. Compruebe que el proveedor y el origen de datos para los que está escribiendo código admiten la funcionalidad CommandTimeout. cualquier otro argumento pasa directamente al proveedor sin que ADO lo procese. La propiedad ConnectionString hereda automáticamente el valor que se utiliza con el argumento Connections del método Open para que se pueda hacer caso omiso de la propiedad connectionString actual durante la llamada al método Open. El valor de CommandTimieout en un objeto Connection no afecta al valor de CommandTimeout en un objeto Command de la misma Connection. propiedad (ADO) Contiene la información que se utiliza para establecer una conexión a un origen de datos. ADO esperará indefinidamente hasta que termine la ejecución. Debido a que el argumento File Name hace que ADO cargue el proveedor asociado. Indica el nombre de un archivo especifico del proveedor (por Qíempío. Configuración y valores devueltos Establece o devuelve un valor String. un objeto de origen de datos persistente) que contiene información sobre la conexión preestablecida. no se pueden pasar . Especifica la ruta de acceso del servidor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service).

Si la propiedad Count es cero.. Debido a que la numeración de miembros de una colección empieza por cero. Predeterminado. Estos cursores son. debe codificar siempre los bucles empezando siempre con el miembro cero y terminando con el valor de la propiedad Count menos 1. Devuelve un valor Long. Provider y File Name. propiedad (ADO) Descripción Establece o devuelve la posición de un motor de cursores. Establece o devuelve un valor Long que se puede establecer a alguna de las siguientes constantes: Constante adUseNone Descripción No se usan servicios de cursor.140-146 ambos argumentos. Los motores de cursores locales admitirán a menudo muchas características que los cursores adUseClient proporcionados por controladores no admitirán.. Normalmente. muy flexibles y conceden un margen de sensibilidad adicional a los cambios realizados por otros usuarios en el origen de datos. adUseServer algunas características de Microsoft Client Cursor Provider (como los conjuntos de registros disociados) no pueden ser simuladas con cursores del lado del servidor y no estarán disponibles con esta configuración. No obstante. se admite también el sinónimo adUseClientBatch. CursorLocation. Colección Properties (ADO). . por tanto. Usa cursores suministrados por el controlador o por el proveedor de datos. Esta propiedad le permite elegir entre distintas bibliotecas de cursores accesibles para el proveedor. La propiedad ConnectionString es de lectura/escútura cuando la conexión está cerrada y de sólo lectura cuando está abierta.) Usa cursores del lado del cliente suministrados por una biblioteca de cursores locales. Si está usando Microsoft Visual Basic y desea hacer un recorrido por los miembros de una colección sin comprobar la propiedad Count use el comando For Each. (Esta constante es obsoleta y aparece únicamente por compatibilidad con versiones anteriores. no hay ningún objeto en la colección. puede elegir entre usar una biblioteca de cursores del lado del cliente o una ubicada en el servidor.Next. Use la propiedad Count para determinar cuántos objetos hay en una colección dada. Colección Fields (ADO) Colección Parameter (ADO). propiedad (ADO) Indica el número de objetos de una coleccion. Se aplica a Colección Errors (ADO). el uso de esta configuración puede proporcionar una ventaja con respecto a características que serán habilitadas. Uso de Remote Data Service. Cuando se usa el objeto Connection del lado del cliente. Se aplica a Objeto Connection (ADO). la propiedad ConnectionString solamente puede incluir los parámetros Remote provider y Remote Server Count. Por compatibilidad con versiones anteriores. Objeto Recordset (ADO). en ocasiones.

Recordset intRoyalty As Integer strAuthorID As String strCnn As String ' Define a command object for a stored procedure. Los cursores de Connection. Valor predeterminado. Se aplica a Objeto Parameter (ADO). " cnn1. Uso de Remote Data Service." & _ "Data Source=srv. Ejemplo Este ejemplo utiliza las propiedades ActiveConnection.Recordset rstAuthors As ADODB.Connection strCnn = "Provider=sqloledb.Command prmByRoyalty As ADODB.Execute heredarán esta configuración.Password=. CommandType. Utilice la propiedad Direction para especificar cómo se pasa un parámetro hacia o desde un procedimiento. y de sólo lectura en un Recordset abierto. En estos casos. adParamReturnValue Indica un valor devuelto. Indica un parámetro de entrada. CommandTimeout. debe establecer la propiedad Direction antes Ejecutar la consulta.Open strCnn Set cmdByRoyalty = New ADODB.Parameter rstByRoyalty As ADODB.Command . un parámetro de salida o ambos bien. esto le permite trabajar con proveedores que no devuelven esta información o establecer esta información cuando desea que ADO realice una llamada adicional al proveedor para recuperar información acerca del parámetro. Cuando se usa en un objeto Recordset o Connection (ADOR) del lado del cliente.Connection cmdByRoyalty As ADODB. Los cambios en la propiedad CursorLocation no afectan a las conexiones existentes.UserId=sa. si el parámetro es el valor devuelto por un procedimiento almacenado.141-146 El valor de esta propiedad afecta solamente a las conexiones establecidas después de que se haya establecido la propiedad. adParamlnputOutput Indica un parámetro de entrada y otro de salida. Establece o devuelve uno de los siguientes valores de ParameterDirectionEnum: Constante adParamUnknown adParamlnput adParamOutput Descripción Indica que la dirección del parámetro es desconocida. la propiedad CursorLocation sólo se puede establecer a adUseClient: Direction. La propiedad Direction es de lectura/escritura.Initial Catalog= pubs. Set cnn1 = New ADODB. propiedad (ADO) Indica si Parameter representa un parámetro de entrada. Esta propiedad es de lectura/escritura en un Connection o Recordset cerrado. Size y Direction para ejecutar un procedimiento almacenado: Public Sub ActiveConnectionX() Dim Dim Dim Dim Dim Dim Dim Dim cnn1 As ADODB. CommandText. No todos los proveedores pueden determinar la dirección de los parámetros en sus procedimientos almacenados. Indica un parámetro de salida. Los objetos Recordset heredarán automáticamente esta configuración de sus conexiones asociadas.

propiedad (ADO) Indica cuántas páginas de datos contiene el objeto Recordset.CommandType = adCmdStoredProc cmdByRoyalty. se cuenta como una página adicional en el valor de PageCount. .MoveNext Loop rstByRoyalty.Direction = adParamInput prmByRoyalty. Las páginas son grupos de registros cuyo tamaño es igual al valor de la propiedad PageSize. el valor será -l para indicar que no se puede determinar . rstByRoyalty!au_id & ".Print . strCnn. ". Set rstAuthors = New ADODB. rstAuthors.CommandTimeout = 15 ' Define the stored procedure's input parameter.Close cnn1.Append prmByRoyalty ' Create a recordset by executing the command. .Close End Sub PageCount.Close rstAuthors.Parameter prmByRoyalty.Parameters.ActiveConnection = cnn1 cmdByRoyalty.Filter = "au_id = '" & strAuthorID & "'" Debug.EOF strAuthorID = rstByRoyalty!au_id Debug. Utilice la propiedad PageCount para determinar cuántas páginas de datos hay en el objeto Recordset.CommandText = "byroyalty" cmdByRoyalty. adCmdTable ' Print current data in the recordset. Incluso si la última página no está completa. Devuelve un valor de tipo Long. Debug.Print rstAuthors!au_fname & " " & _ rstAuthors!au_lname rstByRoyalty. Set rstByRoyalty = cmdByRoyalty. Si el objeto Recordset no admite esta propiedad.142-146 Set cmdByRoyalty.Open "authors".Type = adInteger prmByRoyalty.Recordset rstAuthors.Execute() ' Open the Authors table to get author names for display. adding ' author names from Authors table.Value = intRoyalty cmdByRoyalty.Size = 3 prmByRoyalty.Print "Authors with " & intRoyalty & _ " percent royalty" Do While Not rstByRoyalty. debido a que hay menos regístros que el valor de la propiedad PageSize. Se aplica a Objeto Recordset (ADO). intRoyalty = Trim(InputBox( _ "Enter royalty:")) Set prmByRoyalty = New ADODB.

MoveNext If rstEmployees.Open "employee". .143-146 el valor de PageCount.PageSize = 5 intPageCount = rstEmployees. Vea las propiedades PageSize y AbsolutePage para obtener más información acerca de la funcionalidad de las páginas. five records ' at a time. Se aplica a Objeto Recordset (ADO).Recordset strCnn As String strMessage As String intPage As Integer intPageCount As Integer intRecord As Integer ' Open a recordset using a client cursor ' for the employee table. strCnn = "Provider=sqloledb. rstEmployees.Recordset ' Use client cursor to enable AbsolutePosition property. . PageCount y PageSize para visualizar nombres y tomar fechas de la tabla Empleado cinco registros cada vez: Public Sub AbsolutePageX() Dim Dim Dim Dim Dim Dim rstEmployees As ADODB. . " Set rstEmployees = New ADODB.CursorLocation = adUseClient rstEmployees. strCnn.EOF Then Exit For Next intRecord MsgBox strMessage Next intPage rstEmployees. propiedad (ADO) Indica cuántos registros constituyen una página en el objeto Recordset.AbsolutePage = intPage strMessage = "" For intRecord = 1 To rstEmployees.PageCount For intPage = 1 To intPageCount rstEmployees.Password=.Close End Sub PageSize.Initial Catalog= pubs." & _ "Data Source=srv. rstEmployees.PageSize strMessage = strMessage & _ rstEmployees!fname & " " & _ rstEmployees!lname & " " & _ rstEmployees!hire_date & vbCr rstEmployees. adCmdTable ' Display names and hire dates. Ejemplo Este ejemplo utiliza las propiedades AbsolutePage.UserId=sa.

144-146 Establece o devuelve un valor de tipo Long que indica cuántos registros hay en una página. Es necesaria la función FilterField para que funcione este procedimiento: Public Sub FilterX() Dim Dim Dim Dim Dim Dim rstPublishers As ADODB.Recordset strCnn As String intPublisherCount As Integer strCountry As String strMessage As String ' Open recordset with data from Publishers table. El valor predeterminado es 10. intPublisherCount = rstPublishers.Initial Catalog= pubs.RecordCount ' Get user input. este valor será el número exacto de registros del objeto Recordset independientemente de si se ha llenado completamente. Si el objeto Recordset no admite el posicionamiento aproximado.Password=. esta propiedad puede consumir muchos recursos debido a que será necesario recuperar y contar todos los recursos para devolver un valor preciso de RecordCount. respectivamente. propiedad (ADO) Indica el número actual de registros de un objeto Recordset. se produce un error.CursorType = adOpenStatic rstPublishers. RecordCount.Recordset rstPublishers. . La propiedad devuelve -1 cuando ADO no puede determinar el número de registros. Utilice la propiedad RecordCount para averiguar cuántos registros hay en un objeto Recordset. Se aplica a Objeto Recordset (ADO). Devuelve un valor de tipo Long. puede utilizar la propiedad AbsolutePage para moverse al primer registro de una página específica. . strCnn = "Provider=sqloledb. Esta propiedad se puede establecer en cualquier momento y su valor se utilizará para calcular la ubicación del primer registro de una página específica. strCountry = Trim(InputBox( _ "Enter a country to filter on:")) If strCountry <> "" Then . Utiliza la propiedad RecordCount para mostrar el número de registros en los dos Recordsets. devuelven True.Open "publishers". Al leer la propiedad RecordCount de un objeto Recordset cerrado. Si el objeto Recordset admite el posicionamiento aproximado o los marcadores. es decir.Recordset rstPublishersCountry As ADODB.UserId=sa. Ejemplo Este ejemplo utiliza la propiedad Filter para abrir un Recordset nuevo basado en una condición específica aplicada a un Recordset existente. " Set rstPublishers = New ADODB. Esto es útil en las situaciones de servidor Web cuando se desea permitir que el usuario pase páginas de datos y vea cierto número de registros al mismo tiempo. si las propiedades Supports (adApproxPosition) o Supports (adBookmark)." & _ "Data Source=srv. Utilice la propiedad PageSize para determinar cuántos registros componen una página lógica de datos. Al establecer un tamaño de página. adCmdTable ' Populate the Recordset. strCnn.

rstTemp. " Set rstPublishers = New ADODB. strFilter As String) As ADODB. strCountry) If rstPublishersCountry. strMessage = "Orders in original recordset: " & _ vbCr & intPublisherCount & vbCr & _ "Orders in filtered recordset (Country = '" & _ strCountry & "'): " & vbCr & _ rstPublishersCountry.Open "SELECT * FROM publishers " & _ "WHERE Country = 'USA'".RecordCount MsgBox strMessage End If rstPublishersCountry.Recordset ' Set a filter on the specified Recordset object and then ' open a new Recordset object.MoveFirst Do While Not rstPublishers.Filter = strField & " = '" & strFilter & "'" Set FilterField = rstTemp End Function Nota: Cuando sabe los datos que desea seleccionar." & _ "Data Source=srv. "Country". strCnn. rstPublishers.EOF Debug.Recordset Dim strCnn As String ' Open recordset with data from Publishers table. adCmdText ' Print current data in recordset. Public Sub FilterX2() Dim rstPublishers As ADODB.UserId=sa.CursorType = adOpenStatic rstPublishers.Close End If End Sub Public Function FilterField(rstTemp As ADODB. Set rstPublishersCountry = _ FilterField(rstPublishers.Recordset rstPublishers.Password=. strCnn = "Provider=sqloledb. . suele ser más eficiente abrir un Recordset con una sentencia SQL.RecordCount = 0 Then MsgBox "No publishers from that country.Close End Sub . Este ejemplo muestra cómo puede crear un único Recordset y obtener registros de un país en particular.Print rstPublishers!pub_name & ".Recordset.145-146 ' Open a filtered Recordset object." Else ' Print number of records for the original ' Recordset object and the filtered Recordset ' object. .Initial Catalog= pubs. " & _ rstPublishers!country rstPublishers.MoveNext Loop rstPublishers. _ strField As String.

sino que. propiedad (ADO) Especifica uno o más nombres de campos por los que se ordena el objeto Recordset y si cada campo se ordena de forma ascendente o descendente. . Los índices existentes no se eliminarán. Configuración y valores devueltos Establece o devuelve un valor de tipo String con los nombres de los campos utilizados para ordenar separados por comas. se restablecen las filas a su orden original y se eliminan los índices temporales. Al establecer la propiedad Sort a una cadena vacía. opcionalmente. donde cada nombre es un objeto Field del objeto Recordset Y. simplemente. Los datos no se vuelven a ordenar físicamente. que especifica el orden del campo. Se creará un índice temporal para cada uno de los campos especificados en la propiedad Sort si la propiedad CursorLocation se establece a adUseClient y no existe ya un índice.146-146 Sort. se tiene acceso a los mismos en el orden indicado. está seguido de un espacio en blanco y de la palabra clave ASCENDING o DESCENDING.

Sign up to vote on this title
UsefulNot useful