P. 1
Manual SQL Server 2000

Manual SQL Server 2000

|Views: 2.823|Likes:
Publicado porLuis Castro

More info:

Published by: Luis Castro on Dec 13, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

02/05/2013

pdf

text

original

Sections

  • Que es un sistema de base de datos?
  • El modelo Relacional
  • Terminología relacional
  • Componentes de una base de datos SQL Server
  • Normalizar un diseño de base de datos
  • Lograr una base de datos bien diseñada
  • Una Tabla debe Tener un Identificador
  • Una Tabla debe Evitar Columnas que acepten valores nulos
  • Una Tabla no Debe tener Valores o Columnas Repetidas
  • Relaciones entre entidades
  • Relaciones entre tablas uno-a-uno
  • Relaciones entre tablas uno-a-muchos
  • Ejercicio 1: Explorando los Conceptos Básicos de Diseño de la base de datos
  • Resumen del tema
  • Archivos y Grupos de archivos
  • Reglas para diseñar Archivos y Grupos de archivos
  • Grupos de archivos predefinidos
  • Recomendaciones
  • Registros de transacciones
  • Ambiente
  • Estimar el Tamaño de una base de datos
  • Diseño físico de la base de datos
  • Instalación de SQL Server
  • Seguridad
  • Planificar la Seguridad
  • Niveles de seguridad
  • Modos de autenticación
  • El Proceso de Identificar los Requerimientos de diseño
  • Identificar las Metas del Sistema
  • Identificar la Cantidad y Tipos de Datos
  • Identificar Cómo se usarán los Datos
  • Identificar Entidades y Sus Atributos
  • Identificar Relaciones Entre las Entidades
  • Identificar Restricciones sobre los Datos
  • Para identificar qué tablas agregar a una base de datos
  • Para identificar qué columnas agregar a las tablas
  • Tabla Columnas
  • Para identificar relaciones entre las entidades
  • Para identificar restricciones en los datos
  • 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
  • Borrar una base de datos SQL Server
  • Tipos de datos provistos por el sistema
  • Tipos de datos definidos por el usuario
  • 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
  • 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
  • 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 definida por el usuario
  • Introducción a las restricciones de integridad
  • Restricciones PRIMARY KEY
  • Crear restricciones PRIMARY KEY
  • Restricciones UNIQUE
  • Crear restricciones UNIQUE
  • Restricciones FOREIGN KEY
  • Una tabla puede tener múltiples restricciones FOREIGN KEY
  • Crear restricciones FOREIGN KEY
  • Deshabilitar restricciones FOREIGN KEY
  • Restricciones CHECK
  • Crear restricciones CHECK
  • Deshabilitar restricciones CHECK
  • Introducción
  • Arquitectura de los índices
  • Propósito y estructura
  • Tipos de índices
  • Características de los índices
  • Unicidad
  • Factor de llenado
  • Sentido de ordenamiento
  • Información sobre índices
  • Indexado Full-Text
  • Crear y administrar índices
  • Crear índices
  • Usando interfase gráfica
  • Usar comandos Transact-SQL
  • Administrar índices
  • Eliminar un índice
  • Reconstruir un índice
  • Elegir un índice
  • Recubrimiento de índice
  • Nota:
  • Unión
  • Intersección
  • Diferencia
  • Producto cartesiano ampliado
  • Restricción
  • Proyección
  • Reunión natural
  • Reunión - theta
  • La cláusula SELECT
  • La palabra clave DISTINCT
  • La palabra clave TOP n
  • La palabra clave AS
  • IMPORTANTE
  • Tipos de información en la lista de selección
  • La cláusula INTO
  • La cláusula FROM
  • La cláusula ORDER BY
  • Usar combinaciones para recuperar datos
  • NOTA
  • Combinaciones Inner
  • Combinaciones Outer
  • Usar combinaciones outer izquierdas
  • Usar combinaciones outer derecha
  • Usar combinaciones outer completas
  • Definir subconsultas dentro del comando SELECT
  • Tipos de subconsultas
  • Subconsultas que se usan con IN o con NOT IN
  • Subconsultas que son usadas con operadores de comparación
  • Subconsultas que se usan con EXISTS y NOT EXISTS
  • Insertar datos en un base de datos SQL Server
  • Usar el comando INSERT para agregar datos
  • Usar el comando INSERT...VALUES para agregar datos
  • Usar una subconsulta SELECT para agregar datos
  • Usar el comando SELECT...INTO para agregar datos
  • Usar el comando UPDATE para modificar datos
  • Usar la cláusula SET para modificar datos
  • Usar la cláusula WHERE para modificar datos
  • Usar una cláusula FROM para modificar los datos
  • Usar APIs y cursores para modificar datos
  • Usar el comando DELETE para eliminar datos
  • Usar APIs y Cursores para eliminar datos
  • Propósito y ventajas de los procedimientos almacenados
  • Rendimiento
  • Marco de programación
  • Procedimientos almacenados del sistema
  • Procedimientos almacenados locales
  • Procedimientos almacenados temporarios
  • Procedimientos almacenados extendidos
  • Como se guarda un procedimiento
  • Métodos para crear procedimientos almacenados
  • El comando CREATE PROCEDURE
  • Crear procedimientos almacenados temporarios
  • Crear y agregar procedimientos almacenados extendidos
  • Resolución diferida de nombres
  • Ejecutar un procedimiento almacenado
  • Llamar un procedimiento almacenado para ejecución
  • Especificar parámetros y sus valores
  • Arquitectura tecnológica
  • El modelo de objetos ADO
  • Objetos y Colecciones del modelo de objetos ADO
  • Descripción de los objetos y colecciones
  • Colección Properties
  • Objetos de datos ActiveX
  • Modelo de objetos de ADO
  • Command, objeto (ADO) Descripción
  • Connection, objeto (ADO) Descripción
  • Error, objeto (ADO) Descripción
  • Field, objeto (ADO)
  • Parameter, objeto (ADO)
  • Recordset, objeto (ADO)
  • AbsolutePage, propiedad (ADO)
  • AbsolutePosition, propiedad (ADO)
  • CommandTimeout, propiedad (ADO) Descripción
  • ConnectionString, propiedad (ADO)
  • Count, propiedad (ADO)
  • CursorLocation, propiedad (ADO) Descripción
  • Constante Descripción
  • Direction, propiedad (ADO)
  • PageCount, propiedad (ADO)
  • PageSize, propiedad (ADO)
  • RecordCount, propiedad (ADO)
  • Sort, propiedad (ADO)

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

4-146 . 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.. GROUP BY . Usar el comando INSERT para agregar datos Usar el comando INSERT. Usar el comando DELETE para borrar datos . Procedimientos almacenados remotos . Combinaciones INNER . 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 . y HAVING . Procedimientos almacenados temporarios . GROUP BY.. 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 . Diferencia ..INTO para agregar datos . Producto . Procedimientos almacenados locales . Procesar las cláusulas WHERE.VALUES para agregar datos Usar una subconsulta SELECT para agregar datos . Listas objetivo . Procedimientos almacenados extendidos . Usar un comando SELECT. Agregar texto o imágenes a filas ya insertadas Modificar datos en una base de datos SQL Server . 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 . Intersección . Definir subconsutas dentro del comando SELECT . Rendimiento Marco de programación Seguridad Categorías de procedimientos almacenados . La cláusula GROUP BY . 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 . Usar el operador CUBE para resumir datos . Reunión . 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 .. Unión . Procedimientos almacenados del sistema . Expresiones Tema 2: Consultar a los datos en una base de datos SQL Server Los fundamentos del comando SELECT El comando SELECT . Combinaciones OUTER Usar LEFT OUTER JOIN Usar RIGHT OUTER JOIN Usar FULL OUTER JOIN .

modificar y borrar procedimientos almacenados Cómo se almacena un procedimiento Métodos para crear procedimientos almacenados . 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 . 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 . El comando CREATE PROCEDURE Proveer a un procedimiento almacenado de un contexto Crear procedimientos almacenado temporarios Agrupar. ejecutar. Especificar parámeros y sus valores .ActiveX Data Objects Tema 2: Modelo de objetos de ADO Tema 3: Objetos ADO Tema 4: Propiedades ADO .5-146 Tema 2: Crear. Llamar un procedimiento almacenado para ejecutarlo .

a los fines del presente Kit. A medida que Ud. no puede haber una factura que no tenga asignada un cliente. Pero es fundamental para el éxito de su proyecto limitar el sistema de base de datos. etc). dichas características se las denomina atributos (por ejemplo el "nombre" del cliente es un atributo de un cliente). 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. . 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.1). relaciones. que Ud. que son clases de objetos que comparten determinadas características (por ejemplo un "cliente" es una entidad). el SGBDR creará los objetos necesarios para gestionarlos (tablas. Por último. a un específico y bien definido conjunto de objetos e interacciones. esto incluye la definición de sus entidades. Lo que dará origen a la estructura la base de datos. índices. 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. llamaremos base de datos a la combinación de los datos y su estructura. lo que le permitirá definir el alcance del sistema. La capa física o esquema físico del diseño. el MS-SQL Server 2000. o sea. 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. le vaya explicando al SGBDR como quiere que almacene los datos. procedimientos almacenados.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. consultas. ni incluye la piezas de código usadas para unir las partes de la aplicación. y a las reglas que el motor de base datos utilizará para asegurar el resguardo de los datos. interactuando con el usuario final (ver figura 1. En un modelo de tres capas. entonces. 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. es un sistema computarizado cuyo propósito general es mantener información y hacer que esté disponible cuando se solicite. está constituida por las tablas y vistas que serán implementadas. 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. a los datos mas las tablas. es decir . La base de datos incluye. dicho de otro modo. El término modelo de datos se utilizará se utilizará para significar una descripción conceptual del espacio del problema. vistas. cualquier cosa necesaria para apoyar el proceso general de atender los asuntos de esa organización. quiere diseñar. 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. vistas. Esa parte del mundo que nos interesa la llamaremos el espacio del problema.

Esto principios fueron aplicados al campo de los modelos de datos a finales de los años ´60 por el Dr. Codd. F.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. E. . y publicados por primera vez en 1970. investigador de IBM.

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

usted definiría índices. Por cada empleado. en este caso el MS-SQLServer 2000. — Describir el proceso de normalización y normalizar tablas en un diseño de bases de datos. 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. dos conceptos que deben integrarse para entender el diseño de bases de datos relacionales. montos. Antes de que usted pueda desarrollar un modelo lógico de datos. y tipos de datos de usuario) que aseguran la validez de los datos. Apellido. — Identificar las relaciones que existen entre las entidades. 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. o números). suponga que se crea una base de datos llamada MiCoBD para manejar los datos en su compañía. Además. nombres. Las tablas pueden tener índices (similar a los de los libros) que permiten encontrar las filas rápidamente. Dichas equivalencias se generan porque al instanciar en la implementación física el modelo conceptual. Dept. Se podría necesitar un resumen departamental de empleados. fechas. reglas. 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. Si usted quisiera realizar búsquedas rápidas para encontrar los datos de un empleado basado en el ID del empleado. usted debe agregar restricciones a la tabla. En la base de datos MiCoBD. Las tablas tienen varios tipos de controles (restricciones. Se discute la normalización y el concepto de relaciones entre entidades. se utilizan términos que corresponden precisamente al modelo físico de implementación en el SGBDR. usted debe comprender los conceptos fundamentales del diseño de bases de datos. Este tema presenta los componentes básicos de una base de datos y la terminología que describe esos componentes. se agrega una fila de datos a la tabla Empleados. crea una tabla llamada Empleados para guardar información sobre cada empleado. desencadenadores. por lo que usted define una vista llamada . como guardar vistas que proporcionan acceso personalizado a los datos de la tabla. y Cargo. 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. Una tabla (entidad) contiene una colección de filas (tuplas) y columnas (atributos). que utiliza la terminología Microsoft. Por ejemplo. 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. en formatos específicos. y subsecuentemente crear una base de datos y los objetos que esta contiene. valores por defecto. Cada columna en la tabla se diseña para guardar un cierto tipo de información (por ejemplo. 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. Nombre. y la tabla contiene las columnas EmpID.9-146 Un atributo puede ser una columna (column) o un campo (field). desde la base de datos. Usted puede agregar restricciones de integridad referencial a las tablas para asegurar la consistencia entre los datos interrelacionados en tablas diferentes.

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

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. No obstante. Estas reglas pueden ponerse bastante complicadas y pueden ir más allá del alcance del presente. como se muestra en la Figura 2. La columna (o columnas) que sirve como identificador único de la fila para una tabla constituye la clave primaria de la tabla. Fíjese que cada instancia de David Mendlen tiene un único valor de EmpID. De todos modos.2 Una tabla que no tiene ningún identificador único. y no debe tener valores o columnas repetidas. podría ser posible normalizar una tabla grande selectivamente en varias tablas más pequeñas. la tabla Empleados no incluye una columna que identifica unívocamente cada fila dentro de la tabla.2. podría ser posible crear una vista que esconde de las aplicaciones el cambio del esquema. si ambos empleados trabajaron en la misma sección y tienen el mismo tipo de trabajo. más aún. Figura 2. Si la base de datos es accedida a través de los procedimientos almacenados.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. Cada tabla debe tener una columna de ID. este cambio del esquema podría tener lugar sin afectar las aplicaciones. Fíjese que el nombre de David Mendlen aparece dos veces. Si no. que es una columna o un conjunto de columnas que toman valores únicos para cada registro de la tabla. debería evitar columnas que acepten valores nulos. A veces el diseño de la base de datos lógico ya está definido. 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. y ningún registro puede compartir el mismo valor de ID con otro. Lograr una base de datos bien diseñada En la teoría de diseño de base de datos relacionales. debe guardar datos para sólo un solo tipo de entidad. En la Figura 2. hay algunas reglas que pueden ayudarlo a lograr un diseño de la base de datos correcto. Esta situación podría ser un problema.3. Usted puede normalizar la tabla agregando una columna que singularmente identifique cada fila. Al no haber ningún identificador único en esta tabla. las reglas de normalización identifican ciertos atributos que deben estar presentes o ausentes en una base de datos bien diseñada. no hay ninguna manera de distinguir fácilmente una fila de otra. y el rediseño total no es factible. 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. tal el caso de una base de datos existente. Pero aún entonces. Una tabla debe tener un identificador. .

Además. 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.12-146 Figura 2.3 Una tabla normalizada con un identificador único. la tabla Libros incluye información sobre cada editor de libros. En una base de datos normalizada.4. Si la dirección del editor cambia. el cambio debe realizarse en todos los registros de libros de ese editor. Por ejemplo. Figura 2. en la Figura 2. Aunque es posible tener columnas que contienen información para el libro y su editor en la misma tabla. 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.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.5). 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. si el último libro de un editor es eliminado de la tabla Libros.4 Una tabla de libros que incluye título e información del editor. este diseño lleva a varios problemas. Figure 2. la información de ese editor se pierde.

pero esta solución guarda sólo dos autores. es mejor usarlos muy poco porque ellos requieren un manejo especial con el consiguiente aumento de la complejidad de las operaciones de datos. pero mostrar una lista de autores individuales sería entonces difícil. Si hay sólo una columna en la tabla Libros para el nombre del autor. debe considerar poner los datos duplicados en otra tabla con un vínculo a la tabla primaria. 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. como se muestra en la Figura 2.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. En el caso de la tabla Libros. esta situación presenta un problema.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 la información del editor estará allí aún cuando el editor no tenga ningún libro en la base de datos. y así sucesivamente). 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. 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. Debería agregarse otra columna si algún libro tiene tres autores. Autor2. Una Tabla debe Evitar Columnas que acepten valores nulos Las tablas pueden tener columnas definidas para permitir valores nulos. Aunque la mayoría de los libros podrían tener sólo un autor. suponga que usted quiere consultar los títulos de libros y sus autores. Por ejemplo. debe cambiarse en sólo un lugar. Si tiene una tabla que tiene varias columnas que permiten valores nulos y varias de las filas tienen valores nulos en dichas columnas. Aunque puede ser útil permitir valores nulos en casos aislados. debería considerar poner estas columnas en otra tabla vinculada a la tabla primaria. 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. Figure 2. . Otra solución es cambiar la estructura de la tabla para agregar otra columna para el nombre del segundo autor. Si la información del editor cambia. Un valor nulo indica que el registro no tiene valor por ese atributo.7. muchos de ellos podrían tener dos o más.

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

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

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

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

y el espacio del disco duro y su configuración. permitiendo denormalizar en cierto grado la base de datos para mejorar el rendimiento de las consultas. El tamaño de una tabla depende si la tabla tiene o no índices y. mayores son los requisitos de hardware.18-146 — Una transacción es rehecha cuando se aplica un registro de transacciones. en este caso. 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. 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. Por ejemplo. el registro de transacciones. El diseño de la base de datos siempre debe tomar en cuenta la velocidad del procesador. no hay ninguna necesidad de rehacer algo que se hizo antes del punto de salvaguarda. Si encuentra archivos de registro de transacciones que indican que un CREATE INDEX fue ejecutado. estime el tamaño de cada tabla individualmente y sume dichos valores. Aparte de los requisitos de almacenamiento de disco. cuanto más grande es la base de datos. que ocurre cuando el SQL Server se reinicia. 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. Recíprocamente. productos. para una gran corporación. Debido a que en un punto de salvaguarda se obliga a que todas las páginas modificadas sean efectivamente grabadas en el disco. — Una transacción se deshace cuando una transacción queda incompleta por alguna causa. 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. la base de datos está en el mismo estado que estaba en el momento en que el registro de transacciones fue copiado. El SQL Server copia la imagen previa de todas las modificaciones a la base de datos desde el BEGIN TRANSACTION. Para estimar el tamaño de una base de datos. Al final de este proceso. 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. usted podría necesitar estimar cuán grande será la base de datos cuando este llena de información. A un punto de salvaguarda. Hay otros factores determinantes. 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. y los tipos de operaciones a realizar sobre la base de datos. 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. sin embargo: el número de usuarios o sesiones coexistentes. el tamaño de la memoria. Por ejemplo. Durante cada proceso de recuperación de base de datos. Estimar el Tamaño de una base de datos Al diseñar una base de datos. realiza operaciones que lógicamente invierten la sentencia. Ambiente Generalmente. 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. 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. previo a entrar en datos no deseados) o a un punto de falla. qué tipo de índices. 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. .

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). sin tener en cuenta cómo los usuarios obtienen el acceso a la base de datos. — Identifique los individuos y grupos en la compañía. usted debe asignar los permisos apropiados a la cuenta de usuario de dominio. Esté seguro de cerrar todos los servicios dependientes sobre SQL Server (incluso cualquier servicio que usa ODBC. o IIS). 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. 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. 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. 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. — Haga copias de respaldo de su instalación actual de Microsoft SQL Server si usted está instalando SQL Server 2000 en la misma computadora.exe o Regedt32. como el Internet Information Server. — Si usted está instalando un failover cluster. — Repase todas las opciones de instalación de SQL Server y este preparado para hacer las selecciones apropiadas cuando ejecute el instalador. Instalación de SQL Server Aunque la instalación de SQL Server está más allá del alcance de este Kit de Entrenamiento. por otra parte. La fase de la autenticación identifica al usuario que está usando una cuenta . Además. — Combine las dos listas para identificar qué usuarios pueden ver qué conjuntos de datos y qué actividades pueden realizar sobre la base de datos. Usted debe iniciar el sistema operativo bajo una cuenta de usuario que tiene permisos locales de administrador.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. o si usted está personalizando el juego de caracteres o la configuración del ordenamiento de los caracteres. Una aplicación de base de datos exitosa normalmente requiere una planificación cuidadosa en las fases tempranas de su proyecto. Antes de ejecutar el instalador de SQL Server 2000. Un sistema de seguridad sólido asegura la protección de datos. desactive el NetBIOS en todas las tarjetas de la red privada antes de ejecutar el instalador de SQL Server. — Si usted está usando un sistema operativo que tiene configuraciones regionales diferentes a inglés (Estados Unidos). 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.exe). — Cómo se van a configurar apropiadamente todos los parámetros de configuración para que la base de datos funcione correctamente. 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.

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

La mayoría de los proyectos de desarrollo de bases de datos tienen muchas metas (tangibles e intangibles). 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. La Figura 4. 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. Figure 4. cómo estos pasos se definen. usted podría determinar cómo se usarán los datos y qué restricciones deben asociarse a dichos datos. Sin esta comprensión.1 ilustra el proceso de identificar los requerimientos de diseño. Por ejemplo. Determinar las metas del sistema no siempre es un proceso directo.1 Identificar los requerimientos del sistema. usted no puede tomar decisiones informadas sobre cómo la base de datos debe ser diseñada. usted debe considerar el propósito de la base de datos y cómo este afecta el diseño. Por ejemplo.21-146 El Proceso de Identificar los Requerimientos de diseño El proceso de identificar los requerimientos del sistema incluye una variedad de pasos. Uno de las metas declaradas de la compañía para el proyecto es "para hacer mas fácil manejar el inventario." . En otras palabras. y intentar descubrirlos puede tomar a menudo una cantidad importante de trabajo de investigación. Una base de datos bien diseñada obtiene el mayor rendimiento. usted debe determinar las metas del nuevo sistema. Para crear un diseño de base de datos eficaz. mientras identifica la cantidad y los tipos de datos. su diseño de la base de datos debe modelar el negocio con precisión. Al diseñar una base de datos. ¿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. Identificar las Metas del Sistema Diseñar una base de datos requiere de un entendiendo de las funciones comerciales que usted quiere soportar. El número de pasos incluidos en este proceso. usted debe tener conocimiento completo y profundo del trabajo que se espera que la base de datos haga. Según el propósito de este kit de entrenamiento. 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). una compañía industrial podría decidir automatizar su proceso de administración de inventario.

Usted también podría descubrir. Después de que usted ha definido las metas iniciales para la nueva base de datos. Sin embargo. Esta situación es particularmente cierta para metas que adoptan la jerga del mercadeo popular. cuando usted excava más profundamente en el proyecto. Aunque estas metas son más tangibles. como facturas de venta. y cualquier otro documento que está usándose actualmente. Al determinar que hasta que punto una medida base debe ser estudiada. usted debe intentar determinar el grado en que esas metas deben lograrse. podría consumir muchos recursos estudiar cuánta inexactitud existe en el proceso actual. o uno que radicalmente altera el trabajo. que algunas metas son inalcanzables o impropias. 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. Usted podría necesitar entrevistar a los participantes importantes y coleccionar copias de documentos pertinentes y formas. Siempre que sea posible. deberá estar preparado para reevaluar estas metas. usted debe tener presente la balanza del proyecto y su aplicación práctica manteniendo siempre un sentido de proporció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. usted debe prepararse a actuar de acuerdo con esto. como "aumento de productividad" o "mejora del rendimiento" Cuando usted pasa por el proceso de identificar metas." En estos casos. 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. si una meta de la base de datos de inventario es mejorar la exactitud. 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. Como resultado. A veces. 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á. Si la meta es aumentar productividad. los requerimientos comerciales cambian. los informes de dirección. En casos como éstos.22-146 Su trabajo es tomar esta meta intangible y intentar determinar la meta tangible subyacente. las metas evolucionan. ellas todavía son vagas. afecta el tamaño de su base de datos. sin embargo. La cantidad de datos. las metas intangibles pueden ser difíciles de traducir en metas más tangibles. Por ejemplo. lo cual significa que el diseño de la base de datos podría necesitar ser modificado. los listados de inventario. usted debe poder establecer una medida inicial. En estas situaciones. Por ejemplo. cuando usted avance con el proceso de diseño de la base de datos. En los casos en los que usted está llevando a cabo un nuevo sistema. y se revisan las expectativas de la compañía. Dado que surgen nuevas comprensiones y nueva información a ser administrada. 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. 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. usted puede continuar determinando el tipo y la cantidad de datos que el sistema soportará. para así mejorar el posicionamiento del producto. usted puede examinar el cuerpo de datos que ya existen. la dirección cambia. En muchos casos. ¿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 determinar el grado al que estas metas deben lograrse. usted debe trabajar estrechamente con la organización para definir eso claramente que significan las metas declaradas. Usted debe ser consciente. de los peligros que se presentan al medir ciertas metas. Las metas vagas tienden a ser declaradas términos generales. por supuesto. . sus metas deben ser directamente mensurables. A menudo para determinar una meta mensurable.

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

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

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

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

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

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

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

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

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

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.

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

modificar sus características o eliminar la base de datos. MSdb. Si la base Master necesita ser recuperada. Ud. podrá ver información acerca de dicha base de datos. porque el borrar una base de datos actualiza las tablas del sistema en la base de datos Master. esto se produce de manera permanente y no puede ser recuperada sin usar un resguardo (backup) previo. 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. La base de datos Master debería ser resguardada después que se elimina una base de datos. mediante el uso del SQL Server Enterprise Manager. . 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. la sentencia DATABASEPROPERTYEX. Master y Tempdb) no pueden ser eliminadas.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. cualquier base de datos que ha sido eliminada desde el último resguardo que se hizo. Cuando una base de datos es eliminada. Las bases de datos de sistema (Model. estaría aún siendo referenciada y podría generar mensajes de error. 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.

Las longitudes de los tipos image (imágenes). Tipos de datos provistos por el sistema En SQL Server cada columna tiene un tipo de dato definido. se pueden crear tipos de datos definidos por el usuario. SQL Server provee un conjunto de tipos de datos predefinidos por el sistema. dado que un dato para ser grabado o modificado deberá ajustarse al tipo de dato especificado para la columna a la que pertenece. Los tipos de datos se pueden utilizar para asegurar la integridad de los datos. El asignar un tipo de dato a un objeto define cuatro atributos del objeto: • • El tipo de dato contenido por el objeto. Un tipo de dato es un atributo que especifica como serán los datos que pueden ser almacenados en una columna. caracteres. Por ejemplo. o variable. 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. además de las columnas.). parámetro. dado que esta columna solo aceptará datos de fechas y horas. sin embargo. se deben definir previamente los tipos de datos que serán definidos para cada columna. Además. no se puede grabar el apellido de alguien en una columna definida como tipo de dato fecha y hora (datetime). el dato podría ser carácter. fechas. este punto intentará explicar como identificar que tipos de datos se deben emplear cuando se define una columna. entero o binario. La longitud de . binary (binarios) y varbinary ( binarios de longitud variable) son definidos en bytes. tienen también asociados tipos de datos. La longitud o el tamaño del valor almacenado. valores monetarios. se crearán las tablas que guardarán los datos dentro de la base de datos. el cual es un atributo que especifica como serán los datos que pueden guardarse en esa columna (números enteros.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. 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. Para crear estas tablas. etc. SQL Server provee de un conjunto de tipos de datos predefinidos. según fue establecido en comando original CREATE TABLE. 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. Otras objetos. Por ejemplo.

Las longitudes para los tipos de datos string (cadena de caracteres) y Unicode son definidos en caracteres. En SQL Server. La escala de un número (solamente tipos de datos numéricos). 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). Character Por ejemplo. Por ejemplo. • La precisión de los números (solamente tipos de datos numéricos). Por ejemplo un objeto smallint (entero pequeño) puede tener un máximo de cinco dígitos. El dato consiste de números hexadecimales. y caracteres numéricos. por lo que tiene una precisión de cinco. símbolos. Por ejemplo. Los datos pueden tener un máximo de 30 dígitos. el tipo de datos numeric es equivalente al tipo de datos decimal. 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 binary número decimal 245 vale en hexadecimal F5. El tipo de dato almacena un representación exacta del número. un objeto int (entero) no puede aceptar dígitos decimales. 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. Los datos Character consisten de cualquier combinación de letras. datetime smalldatetime Decimal Los datos Decimal consisten de datos numéricos que son almacenados al menor dígito significativo decimal numeric . que pueden estar todos a la derecha de la coma decimal. • 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.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. Un valor monetario puede tener un máximo de cuatro dígitos decimales y su escala es de cuatro. La escala de un número es la cantidad de dígitos que puede tener a la derecha de la coma decimal. 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. por lo que su escala es de cero. 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. La precisión es la cantidad de dígitos que el número puede tener.

Consisten en un 1 o un 0.648 a 2.685. Se usan para representar valores lógicos VERDADERO o FALSO. una nchar . bit cursor timestamp Consiste de números hexadecimales de 16 byte.509.483. Desde –922.203.748.477. Desde –1.203.79E + 308.79E + 308 a 1.147. Los datos deben tener la misma longitud table Unicode Al usar tipo de datos Unicode. 5. y sql_variant.768 a 32. 0. Tamaño 8 bytes.40E + 38. 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. y 2.147.767 (requiere de 2 bytes por valor).3648 a 214. image. 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.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. Desde –3.647 (requiere de 4 bytes por valor). Desde cero a 255 (requiere de 1 bytes por valor). Desde –214.5808 a +922.337. Desde –2. Desde –2^63 (–9223372036854775808) a 2^63–1 (9223372036854775807).337. timestamp. 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. Es utilizado para almacenar un conjunto de resultados para su posterior procesamiento. ntext. 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.3647 Tamaño 4 bytes.40E + 38 a 3. indicando un identificador único uniqueidentifier global (GUID).748. Los GUID son usados cuando una columna deba ser única frente a cualquier otra columna.483.685.477. SQL_variant Este tipo de datos soporta a cualquier otro tipo de datos soportado por SQL Server excepto text. Desde –32.5807 Tamaño 8 bytes.

Varios tipos de datos base tienen sinónimos (por ejemplo. Por ejemplo. Se pueden crear tipos de datos definidos por el usuario utilizando el procedimiento almacenado sp_addtype o utilizando el Enterprise Manager. 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. 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). Lo cual incluye a todos los caracteres definidos en los distintos conjuntos de caracteres. se toma por defecto la configuración de nulos ANSI para la base de datos o conexión. 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. rowversion es sinónimo de timestamp. Se puede usar este tipo de dato solamente para variables y para parámetros de procedimientos almacenados.40-146 Tipo de Dato Base Categoría Descripción Descripción columna puede almacenar cualquier cualquier caracter definido por el estándar Unicode. . Cuando la anulabilidad no es explícitamente definida. 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. Todos los datos almacenados en el SQL Server deben ser compatibles con uno de estos tipos de datos base. 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. un tipo de datos definido por el usuario llamado codigo_postal podría ser creado en base al tipo char. Cuando se crea un tipo de dato definido por el usuario. 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. longitud y capacidad de aceptar nulos. y varying es sinónimo de nvarchar). El tipo de dato cursor es el único tipo dedatos base que no puede ser asignado a una columna de una tabla. Los tipos de datos Unicode toman el doble de espacio de almacenamiento que los tipos no-Unicode.

Cuando se crea una tabla. Mas adelante se verá como definir valores por defecto para las columnas.41-146 MODULO II: Implementar una base de datos y sus tablas Tema 3: Crear y administrar tablas. la columna Telefono en la tabla Autores de la base de datos Pubs no permite valores nulos. Cada instancia de la entidad en la tabla es representada por un solo registro o fila (llamada también tupla). . la definición de la tabla deberá incluir. retornan un valor desconocido (unknow) porque el valor de cada NULL es desconocido por definición. un valor nulo en la columna Precio de la tabla Libros de la base Pubs no significa que no tenga precio. 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. Una tabla contiene un conjunto de columnas. Se pueden configurar otras propiedades posteriormente. el nombre de la tabla. Además. Un valor nulo no es lo mismo que un cero. La columna incluye un valor por defecto DESCONOCIDO para cuando no se tiene el dato. 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. 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. o entre un valor nulo y cualquier otro valor. el SQL automáticamente grabará DESCON en dicha columna. se está listo para crear los objetos tabla que almacenaran los datos dentro de la base de datos. modificar las características de las tablas. incluyendo como especificar la anulabilidad. sino que este es desconocido o no ha sido ingresado. En general. Crear tablas en una base de datos SQL-Server Una tabla es una colección de datos acerca de una entidad específica. un blanco o una cadena de caracteres de longitud cero. en caso de ser necesarios) y si las columnas aceptarán valores NULL. como un cliente. Cada columna representa un atributo de la entidad. 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. una orden de compra. generar valores para las columnas y definir valores por defecto en las columnas. como mínimo. Si el valor para la columna Telefono no es agregado en el comando de grabación del registro. la fecha de una orden podría ser un atributo de la entidad orden. Por ejemplo. Valores nulos no pueden ser usados para información requerida para distinguir una fila de otra fila en una tabla. 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. Por ejemplo. sus tipos de datos (y longitudes. La presencia de un valor nulo generalmente implica que el valor o es desconocido o no esta definido. los nombres de las columnas. Idealmente. Por ejemplo. y eliminar tablas. En este punto trataremos como crear tablas. Además. o un inventario. Nulo significa que ninguna entrada ha sido cargada para ese dato. como la restricción PRIMARY KEY. se debería contar con toda la información acerca de las tablas. incluyendo tanto las restricciones de clave primaria PRIMARY KEY como todas las otras restricciones. Una vez que se ha creado la base de datos e identificado el tipo de datos. 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.

mientras que la columna Nombre sí. Para definir columnas que permiten o no valores se utilizan las cláusulas NULL o NOT NULL respectivamente. El siguiente ejemplo usa el comando CREATE TABLE para crear la tabla Empleados. 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. sin importar cual sea el tipo de dato de la columna o si tiene un valor por defecto definido. Nombre varchar(30) NULL. La cláusula DEFAULT en el comando CREATE TABLE se considera una restricción aún cuando en realidad no fuerza a nada. El valor NULL no debe ser expresado entre comillas porque será interpretado como una cadena de caracteres en vez de un valor NULL. Dado que como vimos los valores nulos no son aconsejables. una mejor solución puede ser definir una valor por defecto para esa columna. Si la columna permite valores nulos. Si una columna no permite valores nulos y no tiene una definición por defecto. ya sea cuando se crea o modifica una tabla. 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. Una columna definida con la cláusula NULL también acepta una entrada explícita de NULL por parte del usuario. CREATE TABLE Empleados ( Emp_ID char(4) NOT NULL.42-146 Si una fila es insertada pero sin valores para una columna que permite valores nulos. el usuario que ingresa los datos se verá obligado a ingresar datos en la columna o toda la fila será rechazada por el sistema. ) Definir valores por defecto Cada columna en un registro debe contener un valor (aún si ese valor es un valor nulo). 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) .. se puede cargar un valor nulo para esa fila. 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. Apel varchar(30) NOT NULL. 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). SQL Server provee un valor nulo (sino existe un definición por defecto). 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. Columnas definidas con las cláusulas PRIMARY KEY o IDENTITY no pueden permitir valores nulos. La columna Emp_ID y la columna Apel no permiten valores nulos. Cuando se carga una fila en una tabla con una definición de un valor por defecto para una columna. La anulabilidad de una columna se define cuando se define la columna. Si los valores nulos no son permitidos. Por ejemplo.

) Se puede modificar o eliminar una definición por defecto existente. Ninguna de las tres columnas permite valores nulos. . Las filas que tomaron el valor por defecto anterior no son afectadas. sin embargo. Por ejemplo se puede modificar el valor insertado en una columna cuando no ha sido entrado ningún valor. Apel varchar(30) NOT NULL. Por ejemplo. En otras palabras.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. 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. Nombre varchar(30) NOT NULL DEFAULT ‘desconocido’. 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. y las columnas de identificación no se relacionan a otra columna de identificación de otra tabla. porque los valores de identificación son típicamente usados solamente dentro del contexto de una sola tabla. Sin embargo. Las columnas de identificación contienen valores únicos dentro de la tabla en la cual ellas son definidas. El comando CREATE TABLE usa la cláusula DEFAULT para definir el valor por defecto: CREATE TABLE Empleados ( Emp_ID char(4) NOT NULL. Cuando se agrega una nueva columna a una tabla existente. El valor por defecto debe ser compatible con el tipo de dato definido para la columna. SQL Server (por defecto) aplica el valor por defecto solo a las filas nuevas que sean ingresadas de ahí en adelante. 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. 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. sin embargo. se debe primero borrar la cláusula DEFAULT existente y luego recrearla con la nueva definición. esta situación generalmente no es un problema. 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. otras tablas que contienen columnas de identificación pueden contener los mismos valores de identificación que los usados por otras tablas. Auto numeración y columnas de identificación Para cada tabla. la columna Nombre provee la posibilidad de un nombre desconocido al agregar una definición por defecto a la definición de la columna. 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.

y la función COLUMNPROPERTY puede ser usada para determinar el nombre de la columna IDENTITY. asegurando que las filas son identificadas de forma unívoca a través de las múltiples copias de la tabla. se puede generar huecos en la secuencia de valores de la columna. SQL Server utiliza internamente columnas de identificación únicas globalmente en procesos de replicación. se debe considerar lo siguiente: • Una tabla puede tener solamente una columna con la propiedad IDENTITY property. Los valores . ) Si existe una columna de identificación en una tabla sobre la que se realizan frecuentes operaciones de borrado de filas. se utiliza una columna que garantice contener valores globalmente únicos cuando datos similares pueden ser generados desde múltiples sistemas de base de datos. La función OBJECTPROPERTY puede ser usada para determinar si una tabla tiene una columna IDENTITY.1) NOT NUL. 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. Además. siendo ambos por defecto iguales a uno. smallint. 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. Cuando se usa la propiedad IDENTITY para definir una columna de identificación. 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. Se pueden especificar el número inicial y el incremento de la secuencia. 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. Ninguna columna acepta valores nulos. numeric. y la columna debe ser definida utilizando los tipos de datos int. (por ejemplo en un sistema de facturación a clientes con datos ubicados en varias subsidiarias distribuidas por el mundo). Cuando el dato es tomado en el sitio central para consolidación y para la generación de reportes. El valor inicial es 101. Cuando se insertan valores en una tabla con una columna de identificación. y el incremento 1. CREATE TABLE Empleados ( Emp_ID SMALLINT IDENTITY(101. o tynint. bigint. SQL Server automáticamente genera el próximo número de identificación adicionando el incremento al último generado. la columna Emp_ID es una columna de identificación. A menudo.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. EmpNombre varchar(50) NOT NULL. • • • • 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.

La columna puede ser referenciada en una lista de selección con la palabra clave ROWGUIDCOL después que la propiedad ROWGUIDCOL fue configurada. pueden generar los mismos valores para sus columnas de identificación. El siguiente ejemplo muestra como crear una tabla SQL: . Dado que la propiedad ROWGUIDCOL no asegura unicidad. el tipo de dato uniqueidentifier y la función NEWID. y esta columna debe ser definida con el tipo de dato uniqueidentifier. las columnas y el tipo de datos (y si corresponde sus valores). como mínimo. cada una con su propia columna de identificación. La columna Emp_ID automáticamente generará un valor globalmente único cuando se inserte una nueva fila. se debe definir. el árbol de la consola del SQL Server Enterprise Manager. Cuando se utiliza este comando. La propiedad IDENTITY garantiza valores no repetidos solo para la tabla que la contiene. se deberá utilizar la propiedad ROWGUIDCOL. se deberá crear una definición DEFAULT sobre la columna que utilice la función NEWID. Identificadores globalmente únicos Aunque la propiedad IDENTITY automatiza la numeración de las filas dentro de una tabla. 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. 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. Este funcionamiento es similar al modo en que se puede referenciar una columna IDENTITY utilizando la palabra IDENTITYCOL.45-146 eliminados de las columnas de identificación no será reutilizados. Si se quieren evitar tales huecos no se debería utilizar la propiedad IDENTITY. el comando UNIQUE debería ser usado para determinar que serán insertados valores únicos en la columna con la propiedad ROWGUIDCOL. 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. sin embargo. en cambio. 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. • • • El siguiente ejemplo utiliza el comando CREATE TABLE para crear la tabla Empleados. tablas separadas. y el Database Designer (al cual se puede acceder a través 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. Para insertar un valor globalmente único. el nombre de la tabla. SQL Server no genera valores automáticamente para esta columna.

Para crear una tabla en una base de datos existente. Enterprise Manager Se pueden crear tablas directamente en el SQL Server Enterprise Manager. . 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. clic derecho sobre el nodo Tables. el comando CREATE TABLE también permite definir otra propiedades. se puede especificar el grupo de archivos sobre el que se almacenará la tabla. ClienteNombre varchar(40). 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. 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. complete la información necesaria para definir la tabla como se muestra en la Figura. se puede consultar información sobre la tabla. Cuando la ventana New Table se abra. o se pueden definir restricciones que se aplique a columnas individuales o a toda la tabla. editar su estructura. desde el Table Designer se pueden modificar tablas existentes. o eliminar la tabla de la dbase de datos. Además. columnas y tipos de datos). ) Además de los elementos básicos de la tabla (nombre. y clic sobre New Table (Nueva Tabla). expanda el árbol de la consola hasta que la base de datos aparezca. Administrar tablas de una base de datos SQL Server Una vez que se ha creado una tabla en una base de datos SQL Server. Por ejemplo.46-146 CREATE TABLE Clientes ( Cliente_ID char(4). modificar sus características. o relacionarla a otras tablas en el diagrama.

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

los índices a texto completo. Además. . definiciones NOT NULL. la columna Cliente_Eval no deberá aceptar un valor de 9 o cualquier otro valor que no esté entre 1 y 8. En ambos casos. si un cliente tiene un Cliente_ID de 438. En este caso. A continuación se presenta una introducción de todos estos tipos de integridad de datos soportados por SQL Server. la definición de su estructura. 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. Luego. Si se necesita eliminar tablas que se encuentran relacionadas a través de FOREIGN KEY y de las restricciones UNIQUE o PRIMARY KEY. Por ejemplo. primero se deberá eliminar la restricción FOREIGN KEY. desencadenadores e índices. integridad de dominio. las restricciones y los índices son borrados de manera permanente. definiciones DEFAULT. 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. Si se necesita eliminar una tabla que tiene la restricción FOREIGN KEY pero no se quiere eliminar la tabla con la clave ajena. integridad referencial e integridad definida por el usuario. 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. reglas. 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. ningún otro cliente debería tener el valor Cliente_ID en 438. Los valores en la columna Cliente_ID deberían identificar unívocamente a cada cliente que es ingresado a la tabla. Estas propiedades incluyen: tipos de dato. restricciones. se necesita borrar una tabla (por ejemplo. cuando se quiere implementar un nuevo diseño o liberar espacio en una base de datos). incluyendo integridad de entidad. y el espacio que ocupaban es liberado para otros objetos. se deben usar métodos soportados por SQL Server para asegurar la integridad de los datos.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. Cuando se elimina una tabla. Como resultado. se deben eliminar primero las tablas con la restricción FOREIGN KEY primero. suponga que Ud. propiedades IDENTITY. crea la tabla Clientes en su base de datos. Asegurar la integridad de los datos Asegurar la integridad de los datos garantiza la calidad de los datos.

El query optimizer (optimizador de consultas) de SQL Server utiliza definiciones de restricciones para construir planes de ejecución de consultas de alto rendimiento. 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. binario. Usar restricciones es preferible a usar desencadenadores. Ya se han visto algunos de estos métodos. como ser clientes. Esta situación no es generalmente un problema. etc. propiedades IDENTITY. Por ejemplo. Algunas de esta propiedades de la tablas. 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. definiciones DEFAULT. Las columnas de identificación contienen valores únicos dentro de la tabla para la cual son definidas. Tipos de Dato Un tipo de dato es un atributo que especifica el tipo de dato (carácter. 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. Definiciones NOT NULL La anulabilidad de una columna determina si las filas en la tabla pueden contener valores nulos para esa columna. restricciones. Si se usan columnas que permiten o no valores nulos. reglas o valores por defecto. 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.) que puede ser almacenado en una columna. Un valor nulo no es lo mismo que un cero. ya que esta columna solo aceptará valores válidos de fecha y hora. Restricciones (constraints) Las restricciones permiten definir el modo en que SQL Server automáticamente fuerza la integridad de la base de datos. no así con relación a otras tablas que pueden contener esos valores en sus propias columnas de identificación. entero. 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. no se puede almacenar el nombre de alguien en una columna con un tipo de dato datetime. la que contendrá una secuencia de valores generados por el sistema que unívocamente identifican a cada fila de la tabla. un blanco o una cadena de caracteres de longitud cero. definiciones NOT NULL. Un valor nulo significa que no se ha ingresado ningún valor para esa columna o que el valor es desconocido o indefinido.49-146 SQL Server soporta varios métodos para asegurar la integridad de los datos. Las restricciones definen reglas indicando los valores permitidos en las columnas y son el mecanismo estándar para asegurar integridad. que incluyen: tipos de dato. Propiedades IDENTITY Cada tabla puede tener sólo una columna de identificación. reglas. . son tratadas de forma separada. Cada columna en una tabla puede contener una sola definición DEFAULT. pero en los casos que así lo sea (por ejemplo cuando diferentes tablas referidas a una misma entidad conceptual. tales como las definiciones NOT NULL y DEFAULT. parámetro o variable. 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. SQL Server provee de un conjunto de tipos de dato. Para los propósitos de este Kit. La anulabilidad de una columna se define cuando se crea o se modifica una tabla. La cláusula NULL se usa si se permiten valores nulos en la columna y la cláusula NOT NULL si no. sin embargo. desencadenadores e índices. Los tipos de dato provistos por el sistema definen todos los tipos de dato que se pueden usar en SQL Server. 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. son a veces consideradas tipos de restricciones.

valores por defecto. Indices Un índice es una estructura que ordena los datos de una o más columnas en una tabla de base de datos. Se puede asegurar la integridad de dominio restringiendo el tipo (a través de tipos de datos). el formato (a través de las restricciones CHECK y de las reglas). que realizan algunas de las mismas funcionalidades que las restricciones CHECK. Tipos de integridad de datos SQL Server soporta cuatro tipos de integridad de datos: integridad de entidad. estricciones UNIQUE. restricciones PRIMARY KEY. integridad de dominio. Las restricciones CHECK son especificadas como parte del comando CREATE TABLE. mientras que las reglas son creadas como objetos separados y luego vinculadas a la columna. Las restricciones CHECK. 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). Los desencadenadores pueden comprender el control lógico que realizan loas restricciones. INSERT o DELETE sobre una tabla o una vista. o el rango de valores posibles ( a través de restricciones FOREIGN KEY. Se utiliza el comando CREATE RULE para crear una regla. 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. son mas concisas que las reglas. Integridad de dominio La integridad de dominio es la validación de las entradas en una determinada columna. Las restricciones CHECK son el modo preferido y estándar de restringir valores para una columna. Desencadenadores Los desencadenadores son una clase especial de procedimientos almacenados que son definidos para ser ejecutados automáticamente cuando es ejecutado un comando UPDATE. o propiedades IDENTITY). se puede aplicar solo una regla por columna mientras que se pueden aplicar múltiples restricciones CHECK. por otro lado. 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. y reglas) Integridad referencial .50-146 Reglas (rules) Las reglas son capacidades mantenidas por compatibilidad con versiones anteriores de SQL Server. integridad referencial e integridad definida por el usuario. 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. definiciones DEFAULT. Integridad de entidad La integridad de entidad define una fila como una única instancia de una entidad para una tabla en particular. restricciones CHECK. 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. Un índice con clave única asegura la unicidad en la columna. definiciones NOT NULL. 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.

modifican o borran registros. La integridad referencial asegura que los valores de las claves son consistentes a través de distintas tablas. 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. 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. 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. una restricción UNIQUE o PRIMARY KEY . cuando se entran. • • 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. como se muestra en la Figura. todas las referencias cambien consistentemente a lo largo de la base de datos. si un valor clave cambia. En SQL Server. 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). Cuando se fuerza la integridad referencial.51-146 La integridad referencial preserva las relaciones definidas entre tablas. 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. con las tablas Ventas y Títulos en la base de datos Pubs. Cambiar valores en la tabla primaria que resulten en registros huérfanos en las tablas relacionadas. Por ejemplo. Tal consistencia requiere que no existan referencia a valores inexistentes y que. Borrar registros desde una tabla primaria si existen registros relacionados en la tabla ajena.

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

Se puede modificar o eliminar una restricción PRIMARY KEY después que ha sido creada. 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) . Col2 varchar(30) ) Se puede definir la misma restricción utilizando la definición a nivel de tabla: CREATE TABLE Tabla1 (Col1 int. nombre de índice. Col2 varchar(30).53-146 TituloAutor forman una restricción PRIMARY KEY. El siguiente comando CREATE TABLE crea la tabla Tabla1 y define la columna Col1 como clave primaria: CREATE TABLE Tabla1 ( Col1 int PRIMARY KEY. agrupamiento o factor de llenado definido con un restricción PRIMARY KEY. o querer cambiar el orden de las columnas. Por ejemplo se podría querer que la restricción PRIMARY KEY de la tabla referencie a otras columnas. siempre que no exista otra restricción PRIMARY KEY para esa tabla. 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.

Si la columna permite valores nulos. • Una restricción UNIQUE pueden ser referenciadas por una restricción FOREIGN KEY. SQL Server emite un mensaje de error y no agrega la restricción. Simplemente reemplace las palabras PRIMARY KEY por UNIQUE. previendo que la o las columnas comprendidas en la restricción UNIQUE contengan solo valores no duplicados o valores nulos. SQL Server automáticamente crea un índice único para asegurar la unicidad de los valores de la restricción PRIMARY KEY. Se pueden definir muchas restricciones UNIQUE para una tabla. Al igual que con las restricciones PRIMARY KEY las restricciones UNIQUE pueden ser modificadas o eliminadas una vez creadas. 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. Aunque tanto la restricción PRIMARY KEY como la restricción UNIQUE aseguran unicidad. 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). Cuando se agrega una restricción UNIQUE a una columna (o columnas) existente en la tabla. Una tabla puede aceptar múltiples restricciones UNIQUE. SQL Server genera un mensaje de error y no agrega la restricción. excepto los nulos. Se pueden usar los mismos comandos Transact-SQL para crear restricciones UNIQUE que los utilizados para crear restricciones PRIMARY 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. muientras que solo una restricción PRIMARY KEY. 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 . 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. mientra que las restricciones PRIMARY KEY no lo permiten. son únicos. Si se agrega una restricción UNIQUE a una columna que tienen valores no nulos duplicados.54-146 Cuando una restricción PRIMARY KEY se agrega a una columna (o columnas) existente en un tabla. 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. SQL Server automáticamente crea un índice UNIQUE para asegurar la unicidad requerida por la restricción UNIQUE. Por lo que. Las restricciones UNIQUE permiten que se las defina para aceptar valores nulos. SQL Server (por defecto) controla los datos existentes en las columnas para asegurar que todos los valores.

sin una conexión a los datos de la tabla Editores. la verificación de la restricción FOREIGN KEY será omitida. Los libros del editor eliminado quedarían huérfanos. Las columnas tendrán únicamente valores que se encuentren en las columnas de la clave primaria de la segunda tabla. Por ejemplo. como muestra la Figura. una clave ajena puede referenciar a una restricción UNIQUE en otra tabla. Si no se especifica un índice agrupado. Se puede crear una clave ajena definiendo una restricción FOREIGN KEY cuando se crea o modifica una tabla. La columna Pub_ID en la tabla Titulos concuerda con la columna de clave principal en la tabla Editores. 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. Una tabla puede tener múltiples restricciones FOREIGN KEY. 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 . Por ejemplo. 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. sin embargo. 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. 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). Una restricción FOREIGN KEY previene esta situación.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 creará un índice no-agrupado por defecto cuando se crea una restricción UNIQUE. La columna Pub_ID en la tabla Titulos es la clave ajena asociada la tabla Editores. la integridad entre las dos tablas se destruiría. 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. Figura 3: AUna restricción FOREIGN KEY definida en la tabla Titulos de la base datos Pubs. Además de a una PRIMARY KEY. 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. Una restricción FOREIGN KEY puede contener valores nulos.

indicando que la restricción FOREING KEY esta conectada a una restricción PRIMARY KEY existente o a una restricción UNIQUE. CREATE TABLE Tabla1 (Col1 int PRIMARY KEY. Se puede modificar o eliminar una restricción FOREIGN KEY una vez que esta ha sido creada. se debe primero eliminar la restricción FOREIGN KEY anterior y luego recrearla con su nueva definición. 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. 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. No se puede cambiar la longitud de una columna definida con un restricción FOREIGN KEY. Para cambiar o eliminar una fila en una restricción FOREIGN KEY.56-146 los datos de la tabla de la clave ajena. excepto los nulos. existen en las columnas referenciadas por las restricciones PRIMARY KEY o UNIQUE. Agregando la restricción a una tabla existente. además la misma restricción usando la restricción FOREIGN KEY a nivel de tabla: CREATE TABLE Tabla1 ( Col1 int PRIMARY KEY. 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). 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. a través de conectar la clave ajena a distinto valor de la clave principal. . esto puede ser útil cuando se quiere que la restricción funcione solo de aquí en adelante. 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. Col2 int REFERENCES Empleados(Empleado_ID) ) Se puede definir. Por ejemplo. 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. Col2 int. Si se trata de eliminar una fila en la tabla de clave primaria o de cambiar un valor de clave primaria. SQL Server 2000 (por defecto) controla los datos existentes en las columnas para asegurar que todos los valores. Para modificar una restricción FOREIGN KEY utilizando Transact-SQL. se podría querer que la tabla de clave ajena referencie a otras columnas.

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. • Restricciones CHECK Las restricciones CHECK aseguran la integridad de dominio al limitar los valores que son aceptados para una columna. Por ejemplo.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. estas podrían innecesariamente prevenir que nuevos datos sean ingresados en la base de datos destino. Por ejemplo. Deshabilitar restricciones permite que los datos sean modificados sin que sean validados por las restricciones. Se puede modificar o eliminar una restricción CHECK una vez que ha sido creada. 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. se puede modificar la expresión usada por la restricción CHECK sobre una columna en la tabla. Las restricciones son evaluadas en el orden en que han sido creadas. Por ejemplo. Esta posibilidad permite que múltiples condiciones sean controladas en un lugar. La diferencia está en cómo se determina cuales son valores válidos.000. se deberá ser cuidadoso cuando se agregan restricciones sin controlar la consistencia de los datos previos dado que se pueden provocar inconsistencias no deseadas.000. 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. 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 crear una restricción CHECK con una expresión lógica (Booleana) que retorne TRUE (verdadero) o FALSE (falso) basada en operadores lógicos. Además. los datos y la definición de la tabla son copiados desde una base de datos fuente a una base de datos destino. 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.57-146 De todos modos. Para permitir solamente datos que se encuentren dentro del rango de $15. 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. se puede aplicar una misma restricción CHECK a múltiples columnas creando la restricción a nivel de tabla. Este capacidad evita el ingreso de salarios fuera del rango normal de salarios de la compañía. Cuando se replica una tabla. Las restricciones FOREIGN KEY toman los valores válidos de otra tabla. Si las restricciones FOREIGN KEY específicas de la base de datos fuente no están deshabilitadas.000 a $100. 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.

se debe ser cuidadoso cuando se agregan restricciones sin controlar los datos existentes. Col3 varchar(30). 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. . porque esta acción saltea los controles de SQL Server 2000 que aseguran la integridad para los datos de la tabla. Sin embargo. CREATE TABLE Tabla1 ( Col1 int PRIMARY KEY. Deshabilitar restricciones permite que los datos sean modificados sin que sean validados por las restricciones. 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. 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. Por defecto la restricción CHECK se aplica a los datos existentes tanto como a los nuevos datos.58-146 Para modificar una restricción CHECK primero se debe eliminar la antigua restricción y luego recrearla con su nueva definición. 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. Por lo que solo los datos nuevos deberían ser controlados para verificar que cumplen con la restricción. Col2 int CONSTRAIT monto_limite CHECK (Col2 BETWEN 0 AND 100). 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. la restricción CHECK puede aplicarse solo a los datos nuevos o también a los datos existentes. Col2 int . 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. Por ejemplo.

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. Tablas indexadas son soportadas por todas las ediciones de SQL Server 2000. 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. Las características de un índice afecta el uso de los recursos del sistema y performance general. La administración comprende las tareas de reconstrucción. El número de registros de la tabla y el tamaño de la clave del índice afectan el ancho y profundidad del árbol. con niveles medios entre ambos. 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. tal como un índice en un libro ayuda a ubicar información rápidamente. Ordenar el índice sobre la clave del mismo también mejora la performance. El Query Optimizer usará un índice si este mejorará la performance de la consulta. En este punto veremos la estructura y el propósito de los índices y sus tipos y características. y eliminación de índices. renombrado. Los dos tipos de índices que SQL Server soporta son agrupados y no agrupados.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. Cuando se ejecuta una consulta usando la clave del índice. Un índice es estructurado por el SQL Server Index manager como un árbol balanceado (B-tree). el Query Optimizer utilizará el índice para ubicar los registros que cumplen con la consulta. Los índices son aplicados a una o más columnas en tablas o vistas. una consulta deberá buscar en todos los registros de la tabla en orden a encontrar coincidencias. que tipo de índice usar y como crearlos. y vistas indexadas son soportadas por las ediciones SQL Server Entreprise y SQL Server Developer. Cada objeto en la estructura de árbol es un grupo de claves del índice ordenadas llamadas páginas del índice. los datos y la definición de la tabla son copiados desde una base de datos fuente a una base de datos destino. 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. Una tabla con muchos registros y un gran ancho de la clave crea un profundo y amplio B-tree. . Arquitectura de los índices Los índices están estructurados para facilitar una respuesta rápida de conjuntos de resultados. para ello existen varias herramientas que asisten en la tarea de administración y mantenimiento de los índices. 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. Se verá como determinar cuando un índice es necesario y apropiado. Si las restricciones CHECK específicas de la base de datos fuente no están deshabilitadas. Una vez que se crean los índices se deben mantener para maximizar la performance de las consultas. Estas bases de datos están generalmente (pero no necesariamente) sobre servidores separados. Un B-tree es análogo a un árbol invertido con la raíz del árbol arriba. Sin índices. Cuanto menor sea el B-tree mas rápido retornará un valor buscado. y los niveles hoja abajo. Propósito y estructura Un índice en SQL Server asiste al motor de base de datos en la ubicación de los registros. Cuando se replica una tabla.

los índices son estructuras que ocupan espacio en la base de datos. 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. dado que los registros de datos completos (en páginas de datos) son guardados a nivel de hoja del B-tree. los usuarios pueden consultar la tabla de Clientes en base al apellido o al ID del cliente. La columna PersonID se define con la restricción PRIMARY KEY. SQL Server creará uno y utilizará la columna de clave primaria como clave para el índice agrupado. se crean sobre columnas que son comúnmente usadas en las consultas. Í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. Tipos de índices Hay dos tipos de índices: agrupados (clustered) y no agrupados (non clustered). Por lo tanto. Ambos tipos de índices son estructuras tipo B-tree.60-146 Para un rendimiento óptimo. Cuando se crea una restricción PRIMARY KEY en un tabla que no contiene un índice agrupado. un índice no agrupado utilizará al índice agrupado para la búsqueda de los registros. Un índice agrupado contiene los registros de la tabla a nivel hoja del B-tree. Cuando una tabla que contiene un índice es modificada. Para hacer un índice agrupado para la columna NumDocumento y un índice no agrupado para la columna PersonID. Para forzar el tipo de índice a ser creado para una columna o columnas. Nombre. las inserciones. la columna NumDocumento con la restricción UNIQUE. Apellido y NumDocumento. se crea la tabla usando la siguiente sintaxis: . ALTER TABLE o CREATE INDEX. Para ubicar eficientemente a los registros. porque demasiados índices impactarán negativamente en la performance general. Índices agrupados Puede haber solo un índice agrupado por tabla o vista. Una columna definida con una restricción UNIQUE genera automáticamente un índice no agrupado. 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. el índice se volvería inútil. esto es. Este tipo de índices es particularmente eficiente para consultas. regularmente los registros son agregados. 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. Si la actualización del índice no se produjera. Un índice no agrupado es una estructura de índice separada. Si existe un índice agrupado en un tabla. La mayoría de la bases de datos son dinámicas. el Query Optimizer usa un índice que concuerde con la consulta. Al igual que la tablas. Si ya existe un índice agrupado SQL Server creará un índice no agrupado sobre la columna definida con una restricción PRIMARY KEY. independiente del ordenamiento físico de los registros en la tabla. Una columna definida como la clave primaria es un índice muy útil porque los valores de la columna están garantizados que son únicos. Por ejemplo. eliminaciones y modificaciones de registros disparan al Index Manager para que actualice los índices de la tabla. eliminados y modificados. el índice debe ser actualizado para reflejar la modificación. Suponga que se crea una tabla Personas que contiene las siguientes columnas: PersonaID. se puede especificar las cláusulas CLUSTERED o NONCLUSTERED en los comandos CREATE TABLE. En la mayoría de los casos se creará antes un índice agrupado que los índices no agrupados sobre una tabla. 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. Por lo tanto se deberían crear dos índices para la tabla: un índice por apellido y otro por ID del cliente.

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

SQL Server no permite crear un índice UNIQUE sobre una columna que contenga valores de la clave repetidos. 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. esto es que las páginas del índice serán llenadas cuando el índice se crea sobre datos existente. el índice agrupado representa el sentido de ordenamiento de 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. 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.SQL Server debe dispones de cierto espacio para ello. ya que solo se consultan las páginas del índice. 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). Sentido de ordenamiento Cuando se crea un índice. Factor de llenado Cuando se inserta una fila en una tabla. Suponga que se ejecuta la siguiente consulta: SELECT Emp_ID. Por defecto el factor de llenado vale cero. porque una consulta sobre una combinación de columnas contenidas en el índice será ubicada completamente en el índice. NivelTrabajo y Fecha_Ingreso. Considere el siguiente comando SELECT: . luego habrá un recubrimiento de índice por parte del índice no agrupado. Apel. Un factor de llenado de cero es lo mismo que un factor de llenado de 100. Por lo tanto. utilice solo las restricciones para forzar unicidad en vez de aplicar la característica UNIQUE al índice. ya que contiene todas las columnas usadas en la consulta. Si la tabla no contiene un índice agrupado. esto tiene como resultado una extracción mas rápida de los datos. el registro y la página del índice son colocados en cualquier espacio disponible en el montón. Si la página del índice se encuentra llena. SQL Server ubica el la página apropiada del índice dentro del B-tree y luego inserta el registro en el orden correspondiente. Si la fila insertada es muy grande. La divisiones de páginas mas comunes suceden en el nivel de las páginas hoja. Si la tabla contiene un índice agrupado. Tanto los índices agrupados como los no-agrupados se ordenan. Las divisiones de páginas son complejas e insumen recursos de manera intensiva. este es ordenado de manera ascendente. 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. Los índices compuesto pueden mejorar el rendimiento de las consultas al reducir el número de operaciones de entrada/salida. Índices compuestos Un índice compuesto es cualquier índice que use mas de una columna como clave. Este valor es llamado factor de llenado . podrían ser necesarias divisiones adicionales.62-146 SQL Server automáticamente crea un índice UNIQUE para una columna o columnas definidas con las restricciones PRIMARY KEY o UNIQUE. por su propia clave y por tener indicados los registros a través de la clave del índice agrupado. 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.

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

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. pero se debe entender como este difiere del indexado provisto por el sistema SQL Server. El Enterprise Manager ofrece además el asistente Create Index para crear índices paso a paso. Usando interfase gráfica Desde el cuadro de diálogo Manage Indexes. Por último. Se puede crear una aplicación propia que use la interfase SQL-DMO para crear un índice. 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 . 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 se guarda en un catálogo Full-Text. Otro modo es crear un índice para una tabla utilizando el comando Transact-SQL CREATE INDEX. El motor Microsoft Search. no SQL Server. La opción Manage Indexes está también disponible desde el menú contextual de una tabla o vista en el Enterprise Manager.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. UN índice Full-Text permite realizar consultas a texto completo para buscar datos en forma de cadenas de caracteres en la base de datos. mantiene los índices y catálogos Full-Text. Crear y administrar índices Crear índices Hay varios modos de crear un índice en SQL Server.

La columna que está primera en la lista de columnas seleccionadas determinará el primer ordenamiento de la clave del índice. Fíjese que se puede especificar el orden descendiente para cualquier parte del índice. seleccionando la columna y con clic en los botones Up y Down.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 . 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 21.).0000 40. Desde el cuadro de diálogo Create New Index. etc. factor de llenado. y de las propiedades del índice (unicidad. se puede proveer de un nombre al índice. Se puede además cambiar el orden de las columnas que son parte de una clave compuesta. seguido por el PrecioUnitario en orden descendiente.0000 22.65-146 Figura 1: El cuadro de diálogo Create New Index para la tabla Productos de la base de datos Northwind. PrecioUnitario. pero ese orden no aparece en el resultado porque ProveedorID y PrecioUnitario prevalecen al orden de la columna NombreProducto.0500 17. el grupo de archivos donde el índice deberá ser creado. el tipo de índice (agrupado o no agrupado). El índice ordena NombreProducto en orden ascendente. El Query Optimizer seleccionará el índice Productos que aparece en la figura cuando se ejecute el siguiente comando: SELECT proveedorID. NombreProducto FROM Productos El resultado muestra el ProveedorID en orden ascendente.0000 10.0000 18.3500 21.

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. Cuando se utiliza CREATE INDEX. Previene de ser sobrescrito a los índices existentes. 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. CREATE TABLE y ALTER TABLE participan en la creación de los índices. 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. propiedades del índice. El asistente Create Index está disponible en la opción Wizards del menú Tools. expanda Database.n]) [WITH [propiedad_indice [. Haciendo clic en la opción Wizards se muestra el cuadro Select Dialog. cuales son opcionales y que configuraciones por defecto existen para cualquier cláusula no especificada en el comando CREATE INDEX. seleccione el asistente Create Index.- • • • • • 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 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..66-146 ProductoID PrecioUnitario NombreProducto 3 30. Se puede crear un índice usando estos comandos Transact-SQL a través del Query Analizer o con una herramienta tal como osql.. y la olas columnas sobre las que se aplicará el índice.n] ] [ON grupo_archivos ] Ya hemos aprendido el significado de esta cláusulas. pudiendo además configurar las propiedades del índice. . Opcionalmente. y el grupo de archivos que lo contendrá. la tabla o la vista... Se usan las configuraciones globales del SQL Server para fijar el factor de llenado. se puede especificar si el índice deberá contener sólo valores no duplicados. Usar comandos Transact-SQL Los comandos CREATE INDEX. 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. Resumiendo. y clic en Ok para comenzar el asistente. el sentido de ordenamiento para cada columna. las cláusulas UNIQUE y CLUSTERED o NONCLUSTERED son opcionales. el tipo de índice (agrupado o no). En el cuadro Select Dialog.. se debe especificar el nombre del índice.

Se puede especificar NOT NULL pero está implícita en la definición de la restricción PRIMARY KEY. por lo que la tabla será físicamente ordenada por la clave del índice y los valores de la clave serán únicos. Columna03. La cláusula FILLFACTOR establece que las páginas de nivel hoja del índice estén llenas en un 40% al crearse el índice. Las cláusulas CLUSTERED y UNIQUE configuran al índice como agrupado y sin valores duplicados. La clave del índice para la tabla será Columna01. Crear una restricción PRIMARY KEY o UNIQUE automáticamente crea un índice.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. El índice no tiene unicidad y no es agrupado. Todas las propiedades concuerdan con los valores por defecto de las base de datos. SORT_IN_TEMPDB Un índice llamado Indice01 reemplazará al índice existente del mismo nombre creado sobre la tabla Tabla01. DESC) WITH FILLFACTOR = 60 IGNORE_DUP_KEY. Como se vio. La cláusula DESC configura el sentido de ordenación para la Columna03 como descendente (en vez de ascendente). 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. dejando libre un 60% del espacio para contener entradas adicionales. 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. La clave del índice incluye a las columnas Columna01 y Columna03. 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. El uso de cláusulas opcionales personaliza el comando CREATE INDEX siguiente: CREATE UNIQUE CLUSTERED INDEX Indice01 ON Tabla01(Columna01. 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. 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. La cláusula DROP_EXISTING indica que el índice Indice01 debe ser reemplazado. 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. DROP_EXISTING. 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.. estas restricciones se definen cuando se crea o modifica una tabla. haciendo de Indice01 un índice compuesto.

nombre_indice | nombre_vista. eliminación. Los índices se renombran si cambió la convención de nombres adoptada o si existen índices que no respetan la convención de nombres. y renombrado. Un índice se elimina si no se lo va a utilizar más o si esta corrupto. s debe especificar si se está modificando. Use la siguiente sintaxis para eliminar un índice: DROP INDEX nombre_tabla. En caso contrario. Se pueden eliminar varios índices con un solo comando DROP INDEX.Indice02 Se puede eliminar un índice usando el Object Browser en el Query Analizer o utilizando el Entreprise Manager. Reconstruir un índice Si existe un índice agrupado sobre una tabla o una vista. cualquier índice no agrupado sobre la misma tabla o vista usará el índice agrupado y su clave. Vista01. la cláusula PRIMARY KEY define a Columna01 con una restricción de clave principal llamada pk_columna01. Si se elimina el índice agrupado utilizando el comando . 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. agregando o eliminando una restricción. Por ejemplo. 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. Administrar índices Las tareas de mantenimiento de índices incluyen reconstrucción. 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. 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.68-146 Una tabla llamada Tabla01 es creada con una sola columna llamada Columna01.Indice01. que es un índice agrupado con valores únicos de clave por defecto. El siguiente comando borra un índice de una tabla y uno de una vista: DROP INDEX Tabla01. En el comando ALTER TABLE. SQL Server desperdiciaría recursos en mantener índices en desuso. Eliminar un índice Los índices en desuso de tablas que son frecuentemente actualizadas con nueva información deberían ser removidos.nombre_indice El nombre de la tabla o de la vista debe ser incluido en el comando DROP INDEX.

Si se cambia la clave del índice agrupado los índices no agrupados son reconstruidos y la tabla reordenada. Para tablas o vista grandes con varios índices. .indice01’ . Afortunadamente existen otros recursos para reconstruir un índice que eliminarlo y volverlo a crear. la cláusula DROP_EXISTING provee de mayor eficiencia al proceso de reconstrucción del índice. Renombrar un índice Se puede renombrar un índice eliminándolo y recreándolo. Por ejemplo.pk_columna01. el siguiente comando fallará al borrar un índice sobre una restricción de clave primaria llamada pk_Columna01: DROP INDEX Tabla01. el siguiente comando DBCC DBREINDEX reconstruirá el índice para la restricción de clave primaria: DBCC DBREINDEX (Tabla01. El comando DBCC DBREINDEX es especialmente útil para índices creados por las restricciones de clave primaria y de unicidad. Como resultado. @newname = ‘indice02’.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). @objtype = ‘INDEX’ El nombre de la tabla fue incluido en el parámetro de entrada @objname. 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. el índice es reconstruido.pk_columna01 Sin embargo. Para reconstruir todos los índices. se procederá a la reconstrucción de todos los índices en la tabla o vista. es usar el procedimiento almacenado del sistema sp_rename. a través de un solo comando. mas que DBCC DBREINDEX. no es necesario borrar la restricción antes de reconstruir el índice. este proceso de reconstrucción puede consumir bastantes recursos. 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. Si no se indica el nombre de la tabla en dicho parámetro. utilice el comando DBCC DBREINDEX para reconstruir el índice agrupado y por lo tanto. El nombre de la tabla es innecesario en el parámetro @newname porque lo toma de parámetro @objname. sp_rename @objname = ‘Tabla01.. 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 de un comando CREATE INDEX reemplaza un índice con el mismo nombre de una tabla o vista.indice02 en vez de indice02. porque a diferencia de DROP INDEX. El comando DBCC DBREINDEX reconstruye. El siguiente ejemplo muestra como renombrar un índice llamado indice01 por indice02. sin embargo.indice02’ el índice se llamaría Tabla01. Si se usa el comando DBCC DBREINDEX sin indicar ningún índice se reconstruirán todos los índices de la tabla o vista. si se especifica @newname = ‘Tabla01. Por ejemplo. Utilizando el comando DBCC DBREINDEX o especificando la cláusula DROP_EXISTING en el comando CREATE TABLE. Si se utiliza el comando CREATE INDEX con la cláusula DROP_EXISTING para reemplazar un índice agrupado con idéntica clave de índice. 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. uno o más índices sobre una tabla o vista. los índices no agrupados no son reconstruidos y la tabla no es reordenada. ya que si se lo incluyera el nuevo nombre del índice incluiría el nombre de la tabla. Una forma mas simple de renombrar un índice. el nombre de la tabla fue intencionalmente excluido del parámetro @newname. el procedimiento almacenado no podría encontrar al índice para renombrarlo. Sin embargo. Esta capacidad evita tener que utilizar múltiples comandos DROP INDEX y CREATE INDEX para reconstruir múltiples índices.

el orden de los valores de clave en el árbol binario será el mismo que las columnas especificadas en la cláusula ORDER BY. Columnas en las que se suelan realizar búsquedas de rangos de valores. SQL Server puede usar este índice para localizar las páginas inicial y final del rango especificado. Puesto que las páginas hojas de un índice no agrupado contienen punteros al identificador de la fila de la página de datos. Puesto que la página hoja de un índice agrupado es. SQL Server no tiene que volverlos a ordenar. realizar búsquedas mediante un índice agrupado es casi siempre más rápidos que realizarlas mediante un índice no agrupado. Los siguientes tipos de consultas. Por lo que un diseño cuidadoso del índice no agrupado será mas importante que el diseño de los índices no agrupados. Se crean índices de acuerdo a los tipos de consultas que los usuarios comúnmente ejecutan contra la base de datos. los punteros de un índice agrupado hacen referencia a las páginas en las que los datos residen. En tales casos. Puesto que los datos están físicamente ordenados. • • • • Índices no agrupados Recuerde siempre que. todos los valores duplicados se mantienen agrupados. selecciones dicho índice de manera juiciosa. a medida que añada mas índices al sistema.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. SQL Server puede prescindir de crear una tabla de trabajo temporal interna para realizar la ordenación de los datos. 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. las instrucciones de modificación de datos se harán mas lentas. Tenga en cuenta que solamente un índice agrupado es permitido por tabla o vista. Consultas que empleen columnas indexadas en las cláusulas WHERE y ORDER BY Si el Query Optimizer selecciona un índice no agrupado. Consultas que puedan devolver grandes conjuntos de resultados con valores de clave adyacentes. 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. Columnas que suelan ser especificadas en la cláusula ORDER BY. El Query Optimizer luego selecciona uno o mas índices para realizar la consulta. Puesto que los datos ya están ordenados. Las siguientes reglas le ayudarán a determinar cuándo elegir un índice agrupado: • Columnas en las que el índice tenga pocos valores distintos. Columnas que sean usadas más frecuentemente en la cláusula JOIN. SQL Server puede utilizar un índice no agrupado para acceder de forma bastante eficiente a los registro individuales. 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. 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: • . Puesto que sólo se permite crear un índice agrupado por tabla. lo que permite una más rápida exploración del rango. en realidad una página de datos.

El siguiente ejemplo tiene n índice no agrupado sobre las columnas Autor_Apellido y Autor_Nombre de la tabla Autores SELECT Autor_Apellido. en lugar de unos pocos anchos. como consecuencia. considere partir el índice en múltiples índices. al disponer de más índices. tiene sentido disponer claves más anchas en una tabla. cuanto más ancha sea la clave. 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. por tanto. AVG. Para obtener un mejor rendimiento de las consultas. Cada uno de estos operadores toma una o dos relaciones como entrada y produce una nueva relación como salida. Desde luego. 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%). experimente creando múltiples índices y compruebe la distribución de cada columna. MAX. el optimizador puede elegir entre varias alternativas. cree múltiples índices estrechos. pero eso no es cierto de manera general.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). Asimismo. Si está tratando de determinar si usar una clave ancha. para llegar a una fila específica. la selectividad de la misma se hace también mejor. pero es buena para las columnas combinadas. 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. etc) o que comprueben la existencia de un criterio también se benefician del recubrimiento de índice. el optimizador puede explorar rápidamente múltiples índices para crear el plan de acceso más eficiente. llene la tabla con datos tomados del mundo real. La ventaja es que con claves más pequeñas. 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. menos filas puede almacenar SQL Server en la páginas de índice. sería posible en principio definir cualquier cantidad de operadores que se . que crear índices anchos da como resultado un mejor rendimiento. La razón es que. Si la selectividad de las columnas individuales es mala. SQL Server debe realizar más operaciones de E/S. Autor_Nombre FROM Autores WHERE Autor_Apellido LIKE ‘M%’ Mucha otras consultas que utilicen una cláusula de agregación (como MIN. Pudiera parecer. 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. haciendo que haya un mayor número de niveles de árbol binario. Para obtener la combinación correcta.

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

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

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

— Intersección La intersección de dos relaciones compatibles respecto a la unión A y 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. — Diferencia La diferencia entre dos relaciones compatibles respecto a la unión A y B. — Unión La unión de dos relaciones A y B compatibles respecto a la unión. A UNION B. los proveedores de Londres y B contiene los proveedores que suministran la parte P1). también a la intersección y a la diferencia). véase la parte (a) de la figura. A INTERSECT B. no tiene este requerimiento (aunque si tiene otro requerimiento distinto). 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 . 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. consistirá en los proveedores situados en Londres. A MINUS B. Figura 2: Ejemplos de unión. 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. intersección y diferencia. Adviértase que el resultado tiene tres tuplas. véase la parte B de la figura. y que suministran la parte P1. o que suministran la parte P1 (o las dos cosas).75-146 La unión. 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. en cambio. 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. Entonces A UNION B. El producto cartesiano. Ejemplo: Una vez más. sean A y B las relaciones presentadas en la figura Entonces A INTERSECT B. no cuatro (se eliminan las tuplas repetidas). consistirá en los proveedores que o bien están situados en Londres.

Aquí. si necesitamos formar el producto cartesiano de dos relaciones cuyas cabeceras tienen nombres de atributo en común.. véase la parte inferior de la figura. ¨5 . la combinación de las dos es la tupla única (A1:a1. A TIMES B. En matemáticas. am. ¨combinacion¨ significa en esencia unión (en el sentido de la teoría de conjuntos. Así.. Entonces diremos que dos relaciones son compatibles respecto al producto si y solo si sus cabeceras son disjuntas (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. dadas las dos tuplas (A1:a1. Am. B2: b2. Así pues... Bn: bn) (se muestran los nombres de atributos para hacerlas más explicitas).. Por tanto...76-146 pero no a B. Es decir. 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 particular.. la versión del producto cartesiano en álgebra relacional es una forma ampliada de la operación. El producto cartesiano se incluye en el álgebra relacional sobre todo por razones conceptuales. deseamos un resultado compuesto de tuplas.. Por tanto. Am. A2: A2... am) y (B1: b1. el producto cartesiano de dos relaciones sería un conjunto de pares ordenados de tuplas.. . A2: A2. B1: b1. consiste en todos los números de proveedores vigentes y B en todos los números de parte vigentes) Entonces A TIMES B. deberemos modificar de manera apropiada los nombres de los atributos.. no tienen nombres de atributo en común). 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 ). Ejemplo: Sean A y B las relaciones presentadas en la figura (A. es decir. definimos el producto cartesiano de dos relaciones (compatibles respecto al producto) A y B. B2: b2. no de pares ordenados de tuplas (aquí también empleamos términos un poco informales). 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. 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). Ahora bien. en otras palabras. — Producto cartesiano ampliado... en términos intuitivos. 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. Ejemplo: Sean A y B las relaciones presentadas en la figura... 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. estará formada por todas las combinaciones de números de proveedor/número de parte vigentes. Relaciones base A S# S1 B P# P1 . y B MINUS A incluirá los proveedores que suministran la parte P1 y no están situados en Londres. Pero (una vez más) deseamos conservar la propiedad de cerradura. no del álgebra relacional)... se presentará un problema si esas dos cabeceras tienen algún nombre de atributo en común.. Entonces A MINUS B contendrá los proveedores situados en Londres que no suministran la parte P1.. Adviértase que MINUS tiene cierta direccionalidad... No debemos terminar este análisis del producto cartesiano sin señalar que esta operación no tiene mucha importancia práctica.... como la tiene la resta en aritmética ordinaria (por ejemplo. Por tanto.2¨ y ¨2-5¨ son diferentes en aritmética)..

nos permitiremos escribir una secuencia de uniones sin insertar paréntesis.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. Algo análogo puede decirse de la intersección y el producto (pero no de la diferencia). si A.B y C son ¨proyecciones¨ arbitrarias (en el sentido de la figura 13. por ejemplo.2). Asociatividad Es fácil comprobar que la unión es asociativa. la intersección y el producto (pero no la diferencia) son conmutativas. cualquiera de las dos expresiones anteriores puede simplificarse a: A UNION B UNION C Sin provocar ambigüedad. Señalamos también que la unión. es decir. es decir. por comodidad. las expresiones A UNION B . entonces las expresiones ( A UNION B) UNION C y A UNION (B UNION C) son equivalentes Así.

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

Desde luego. sólo hay tres ciudades en el resultado.Y. Así. Obsérvese en el primer ejemplo (la proyección de proveedores según el atributo CIUDAD) que.. la sintaxis de la figura 13. en este caso la relación A tampoco necesita ser una relación nombrada.. como en R (). Z) como cabecera y cuyo cuerpo está formado por el conjunto de todas las tuplas (X:x. S (CIUDAD) CIUDAD .. representaría la proyección nula. ZA (X. las tuplas repetidas se elimina (como siempre). el subconjunto obtenido mediante la selección de los atributos especificados y la eliminación de las tuplas repetidas dentro de los atributos seleccionados.Y..Y. P# P1 CANTIDAD 300 — Proyección La proyección de la relación A según los atributos X. por ejemplo. Omitir por completo esta lista equivale a especificar una lista con todos los atributos de la relación original.2 si permite omitir del todo la lista de atributos... En la figura 13.Z) Es una relación con (X. Una expresión condicional como ésta (es decir.. como ya se explicó...... 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. representa la proyección identidad. Y:y.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.Z:z) tales que una tupla t aparece en A con el valor X en X. (En cambio. el valor y en Y. la especificación de una lista vacía. En la figura 4 se presentan algunos ejemplos de restricción.6 se presentan algunos ejemplos de proyección. 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. es decir. aunque la relación S tiene cinco tuplas y por tanto cinco ciudades.. o sea. lo mismo puede decirse también de los otros ejemplos... Sin embargo. y puede representarse mediante una expresión arbitraria... el operador de proyección produce un subconjunto ¨vertical¨ de una relación dada. Desde luego. 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?). .... y el valor z en Z..

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

las dos expresiones A JOIN B Y B JOIN A son equivalentes. sin provocar ambigüedad. tal como la hemos definido. La reunión theta es adecuada para aquellas ocasiones (poco frecuentes en comparación. las dos expresiones. es tanto asociativa como conmutativa (Ejercicio: Comprobar estas aseveraciones). Sean las relaciones A y B compatibles . si A y B no tienen nombres de atributos en común. En consecuencia. la reunión natural degenera en el producto cartesiano. 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 . Cabe señalar que.81-146 La reunión natural.theta Ahora pasamos a la operación de reunión theta. ( A JOIN B ) JOIN C y A JOIN (B JOIN C) Se puede simplificar. en este caso). pero de ninguna manera desconocidas) en las cuales necesitamos juntar dos relaciones con base en alguna condición diferente a la igualdad. A JOIN B es equivalente a A TIMES B (es decir. a A JOIN B JOIN C Además.

es una relación con la misma cabecera que el producto cartesiano de A y B.3).82-146 respecto al producto (o sea. 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. si es necesario). 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. Si se elimina uno de esos dos atributos (lo cual puede hacerse mediante una proyección). véase el análisis del producto cartesiano en la sección 13. ( A TIMES B) WHERE X theta Y En otras palabras. SNOMBRE. y después realizar una restricción apropiada sobre el resultado. 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. CIUDAD. con las operaciones apropiadas para renombrar atributos) Por ejemplo. es una proyección de una restricción de un producto (una vez más. S JOIN P Es equivalente a la siguiente expresión. COLOR. Adviértase que la reunión theta no es una operación primitiva. Si theta es ¨igual a¨. Nota: seria suficiente renombrar sólo uno de los dos atributos CIUDAD. no tienen nombres de atributos en común. P#. siempre es equivalente a obtener el producto cartesiano ampliado de las dos relaciones (con modificaciones apropiadas de los nombres de los atributos. 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 . más compleja: ( ( S TIMES ( P RENAME CIUDAD AS PCIUDAD ) ) WHERE CIUDAD = PCIUDAD) (S#. por ejemplo. El resultado se muestra en la figura. 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. SITUACIÓN. y sea theta un operador según la definición dada en el análisis de la restricción. la única razón para cambiar el nombre de los dos es la simetría. PNOMBRE. el resultado será la ¡la reunión natural! Por tanto. y la operación theta debe ser aplicable a ese dominio) Vamos a suponer. la reunión theta se llama equirreunion. la reunión natural tampoco es una operación primitiva. la expresión que representa la reunión natural de proveedores y partes (según ciudades). (Los atributos X y Y deberán estar definidos sobre el mismo dominio. Por la definición.

..Yn son comunes a las dos relaciones. 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..X2. Además.. los atributos Y1.. — División: Sean las cabeceras de las relaciones A y B (X1. el siguiente comando SELECT recupera el ID. El ordenamiento de las filas en el conjunto de resultados.Y2... 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. 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. 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. Los Fundamentos del comando SELECT Un comando SELECT en Transact-SQL permite recuperar datos desde una base de datos SQL Server.. el conjunto de resultados posee filas y columnas.que de S y P según ciudades. Y:y) en A para todas las tuplas (Y:y) presentes en B. Yn) y (Y1. Consideremos ahora a (X1. Un conjunto de resultados es un arreglo tabular de los datos que se recupera al ejecutarse el comando SELECT..Y2..Xm) y (Y1.. nombre y precio unitario de cualquier producto cuyo precio unitario supere los $40: . En otras palabras. Y2.. 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. A tiene los atributos X1. 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. Por ejemplo. Al igual que una tabla... las relaciones A y B pueden ser expresiones. Y2.. es decir. Y1.Yn) respectivamente. respectivamente) Vamos a suponer que los atributos correspondientes ( es decir.Xm... los atributos con el mismo nombre) están definidos sobre el mismo dominio..X2... en términos informales)..Xm y B no tiene otros atributos.. X2. y de cómo estos componentes pueden ser usados para recuperar datos específicos desde una base de datos SQLServer.83-146 Figura 7: La reunión mayor ..Yn) como dos atributos compuestos X y Y.. Como siempre. La división de A entre B.

Por ejemplo. La lista de selección puede también contener palabras claves que controlen el formato final del conjunto de resultados. 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. Si se especifica ORDER BY. La sintaxis completa del comando SELECT es compleja. ProductoNombre. Para obtener una lista con los valores duplicados de la columna CiudadVenta removidos. La cláusula SELECT La cláusula SELECT incluye la palabra clave SELECT y la lista de selección. La palabra clave DISTINCT La palabra clave DISTINCT elimina filas duplicadas del conjunto de resultados. PrecioUnit FROM Productos WHERE PrecioUnit > 40 ORDER BY PrecioUnit ASC En este ejemplo. Por ejemplo el siguiente comando SELECT retorna las primeras 10 ciudades en orden alfabético de la tabla Ordenes: . La lista de selección es una serie de expresiones separadas por comas. Por último. Las columnas en el conjunto de resultados estarán en el mismo orden que la secuencia de expresiones en la lista de selección. junto a ejemplos sobre como definir estas cláusulas para recuperar datos específicos desde una base de datos SQL Server. ingrese el siguiente código: SELECT DISTINCT CiudadVenta. El valor n indica el número de filas a ser retornadas (siempre que la palabra clave PERCENT no sea indicada).84-146 SELECT ProductoID. PERCENT especifica que n es el porcentaje de filas en el conjunto de resultados que se retornará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. la tabla Ordenes en la base de datos Northwind contiene valores duplicados en la columna CiudadVenta. 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. las filas son seleccionadas después que el conjunto de resultados se ordena. 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. Usar palabras claves en la lista de selección. Cada expresión define una columna del conjunto de resultado.

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

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

Por último. luego por tipo (en orden ascendente dentro de cada editor). y finalmente por precio (en orden ascendente. El siguiente comando ordena las filas en la tabla Titulos. Tipo. Cada fila del conjunto de resultados contendrá datos resumidos relacionados con el valor específico de la columna de agrupamiento. 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). conocidas como columnas de agrupamiento. se asume ASC. no el nombre de la columna del conjunto de resultados asignada con una cláusula AS. Si no se especifica una ordenamiento. y HAVING se aplican. Un ordenamiento puede ser ascendente (ASC) o descendente (DESC). esto es. Habrá una sola fila para cada valor distinto de la o las columnas de agrupamiento. 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. Precio FROM Titulos ORDER BY Pub_id DESC. las funciones de agregación retornan un solo valor para un comando SELECT. dado que no se indica DESC): USE Pubs SELECT Pub_id. GROUP BY. GROUP BY. se debe especificar el nombre de la columna de la tabla o vista. Se puede listar más de una columna en la cláusula GROUP BY para anidar grupos. La cláusula GROUP BY restringe las filas del conjunto de resultados. 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. Tipo. Precio MODULO III: Consultar y modificar datos Tema 3: Usar Técnicas Avanzadas de Consulta para Acceder a los Datos . primero por Editor (en orden descendente). Si se indican más de una columna en la cláusula ORDER BY el ordenamiento es anidado. En una cláusula GROUP BY. La palabra clave GROUP BY se sigue de una lista de columnas. aunque no necesariamente. La cláusula GROUP BY se aplica para agrupar el resultado de la cláusula WHERE. Para cualquier condición de búsqueda que se podría aplicar indistintamente antes o después de la operación de agrupamiento. y HAVING Entender la secuencia correcta en la que las cláusulas WHERE. 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 cláusula HAVING se utiliza para filtrar las filas del resultado agrupado. Cuando no se usa la cláusula GROUP BY. Cómo se procesan las cláusulas WHERE. Esto reduce el número de filas a ser agrupadas. 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. es más eficiente indicarla en la cláusula WHERE. Titulo.87-146 La cláusula GROUP BY se utiliza para producir valores agregados para cada fila en el conjunto de resultados. 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. se puede agrupar una tabla por una combinación de columnas.

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

Au_nombre. Las combinaciones inner son el único tipo de combinación que el SQL-92 soporta en la cláusula WHERE.Ed_id y la t. p.Au_apellido ASC. En el siguiente comando SELECT. Todas las filas recuperadas desde la tabla izquierda son referenciadas con una combinación outer izquierda. En el siguiente comando SELECT. 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. si estos autores se encuentran en la misma ciudad de los editores: . se usa una combinación outer derecha para obtener la lista de editores y los nombres y apellidos de los autores. Dado que este comando utiliza una combinación inner. esta retornará sólo aquellas columnas que tengan un valor igual en las columnas de la combinación (la columna p.Ed_id = t.Ed_Nombre FROM Editores AS p INNER JOIN Titulos AS t ON p. p.Au_apellido. 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.Ciudad ORDER BY p. 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. derecha (right). Combinaciones inner establecidas en la cláusula WHERE son conocidas como combinaciones al viejo estilo. un valor nulo es retornado para la columna Ed_nombre del conjunto de resultados.Ciudad = p.Ed_nombre FROM Autores a LEFT OUTER JOIN Editores p ON a. En el SQL-92 estándar. Todas las filas de ambas tablas son retornadas en una combinación outer completa. SELECT t. Si un editor no se encuentra en la ciudad del autor. Combinaciones Outer SQL Server soporta tres tipos de combinaciones outer: izquierda (left). las combinaciones inner pueden ser especificadas tanto en las cláusulas FROM o WHERE. a. 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. a. Las únicas columnas que serán recuperadas de la tabla izquierda serán aquellas que cumplan con la condición de la combinación. y todas las filas de la tabla derecha son referenciadas en una combinación outer derecha. 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. El conjunto de resultados incluirá sólo aquellos editores que se encuentren en las mismas ciudades de los autores.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). y completa (full). a.Ed Publishers).Titulo.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.Au_nombre ASC El conjunto de resultados para esta consulta listará el nombre de todos los autores de la tabla Autores.Ed_nombre ASC.

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.Au_apellido ASC. Si un autor no se encuentra ubicado en la misma ciudad del editor.Ed_nombre ASC.Ciudad = p. a. las columnas de esta tabla no pueden ser incluidas en el resultado de la consulta exterior. un valor nulo se retorna para las columnas Au_apellido y Au_ nombre del conjunto de resultados. 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. 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. Cuando se cumple la condición todas las columnas del conjunto de resultados tendrán un valor. el cual es de $10.Au_nombre ASC El conjunto de resultados de esta consulta listará los nombre de todos los editores de la tabla Editores. UPDATE. a.Ciudad ORDER BY p. a. sin tener en cuenta si los valores cumplen con la condición de la combinación. un valor nulo se retorna en la columnas Au_apellido y Au_nombre del conjunto de resultados. . Si un editor no se encuentra en la misma ciudad del autor. la subconsulta puede ser evaluada como una consulta independiente.Ciudad = p. p. Si un autor no se encuentra en la ciudad del editor.Au_apellido. INSERT.90-146 USE Pubs SELECT a.Au_apellido. Si una tabla figura solo en la subconsulta y no en la consulta exterior. 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.Au_apellido ASC. Este valor ($10) se usa luego en el comando SELECT exterior para obtener los nombres de los productos que tienen el mismo precio unitario.Ed_nombre FROM Autores a FULL OUTER JOIN Editores p ON a. En algunos comandos Transact-SQL.Ed_nombre ASC.Au_nombre. Una subconsulta puede usarse en cualquier lugar en que una expresión lo permita. En el ejemplo siguiente. a. p.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 ORDER BY p.Au_nombre. El conjunto de resultados incluirá solo aquellos autores que se encuentren en la misma ciudad del editores. a. o DELETE o dentro de otra subconsulta. a. se retorna un valor nulo en la columna Ed_nombre del conjunto de resultados. En el siguiente comando SELECT.

Una subconsulta se anida dentro de la cláusula WHERE.91-146 Conceptualmente. En el siguiente ejemplo. 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 cual encuentra los nombres que igualan estos números de identificación. Segundo. 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. 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. estos valores se sustituyen en la consulta exterior. 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. La consulta trabaja exactamente igual que una con IN. la subconsulta retorna los números de ID de los editores que han publicado libros de negocios. En el ejemplo siguiente. Primero. la subconsulta retorna los números de identificación de los editores que tienen libros de negocios publicados. Luego estos valores son sustituidos en la consulta exterior. 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. mientras que ANY indica que al menos a un valor. La palabra clave ALL indica que se debe aplicar a todos los valores. Primero. Después que la subconsulta devuelve el resultado. Las palabras clave ALL y ANY comparan un valor escalar con un conjunto de valores simples. 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. Las subconsultas introducidas con la palabra clave NOT IN también retornan una lista de cero o más valores. La palabra clave SOME del SQL-92 estándar es equivalente a ANY. Sin embargo. Estas consultas pueden tener la cláusula EXISTS. el operador de comparación mayor que (>) es usado con ANY: USE Pubs SELECT Titulo FROM Titulos WHERE Adelanto > ANY ( SELECT Adelanto . la consulta exterior lo utiliza. 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.

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

Au_id INNER JOIN Titulos t ON t. Para las filas agrupadas. Usar el operador ROLLUP para resumir datos El operador ROLLUP es útil para generar reportes que contienen subtotales y totales. El operador ROLLUP genera un conjunto de resultados que es similar al conjunto de resultados del operador CUBE. 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. Titulo WITH ROLLUP Al usar el operador ROLLUP.Titulo_id GROUP BY Ed_nombre.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.Ed_id = t.Au_id = ta. se pueden crear agrupamientos en el conjunto de resultados. Al usar el operador CUBE.Titulo_id = ta. usar el operador CUBE o el operador ROLLUP retorna el mismo resultado. el comando generará los siguientes datos cuando se listen las columnas Ed_nombre. Titulo. SUM(cant) AS 'Sum' FROM Autores a INNER JOIN TituloAutor ta ON a. 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 = t. Au_apellido. El conjunto de resultado devuelve los valores para la cantidad vendida de todos los títulos. En este caso. 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. ROLLUP genera un conjunto de resultados mostrando agregaciones para jerarquías en las columnas seleccionadas. Au_nombre.Titulo_id INNER JOIN Editores p ON p. se usa un valor nulo para representar todos los valores para la columna (excepto la columna Sum). El siguiente comando SELECT contiene un operador ROLLUP en la cláusula GROUP BY: USE Pubs SELECT Ed_nombre. y Titulo (en ese orden) en la cláusula GROUP_BY: • • • Cantidad de cada título que cada editor vendió para cada autor. Si se usa un comando SELECT sin el operador ROLLUP. SQL Server soporta métodos para agregar filas de datos a las tablas de una base de datos SQL Server. Au_apellido. 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. y eliminar filas.Ed_id INNER JOIN Ventas s ON s. el comando devuelve una columna extra. . cambiar los datos en las filas existentes.

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

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

Si no se especifica la cláusula WHERE. y OPENQUERY (siempre y cuando el proveedor OLE DB usada para acceder al servidor remoto soporte actualizaciones). todas las columnas serán actualizadas. text. Por último. 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. no se usa la cláusula WHERE. Un comando UPDATE que referencia a una tabla o una vista puede cambiar los datos en sólo un tabla base por vez. las aplicaciones DB-Library usan la función Dbwritetext. ya sea usando el nombre de un servidor conectado o las funciones OPENROWSET. Este comando se puede usar también para actualizar filas en un servidor remoto. por lo que todas las filas serán modificadas (salvo aquellas que tengan un valor nulo para la columna Precio). 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. Por ejemplo. Modificar datos en una base de datos SQL Server Una vez que se crean las tablas y que se ingresan datos. Las cláusulas más importantes del comando UPDATE son: • • • SET WHERE FROM Usar la cláusula SET para modificar datos. 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. o en todas las columnas de una tabla o vista. .1 En este comando. o image.96-146 • • Las aplicaciones ODBC (Open Database Connectivity) usan el SQLPutData para ingresar nuevos valores del tipo ntext. en grupos de columnas. 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. OPENDATASOURCE. SET indica que columna será actualizada y los nuevos valores que se guardarán.

Usar APIs y cursores para modificar datos Las APIs ADO. 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. Si no se indica la cláusula WHERE. . 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. text. Los cambios realizados con esta cláusula sólo afectarán a la fila donde se encuentre posicionado el cursor. Si no se hubiese puesto la cláusula WHERE todos los valores de LibroTipo tomarían el valor popular. Además. se puede actualizar la fila actual utilizando el comando UPDATE con la cláusula WHERE CURRENT OF. o image SQL Server provee varios métodos para modificar valores del tipo ntext. o image. Utilizar los comandos WRITETEXT o UPDATETEXT. En el siguiente comando UPDATE. Las aplicaciones OLE DB. nchar. 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. text. cuando se usa un cursor del servidor Transact-SQL. 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. Las aplicaciones ADO (Active Data Object) pueden usar el método AppendChunk para especificar grandes cantidades de datos tipo ntext.LibroTitulo = Titulos. o binary. en el siguiente comando UPDATE. para modificar datos ntext.Precio FROM NuevosLibros JOIN Titulos ON NuevosLibros. 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. todas las filas serán actualizadas. por su parte. Este punto se verá más en detalle en otro módulo del Kit. Por ejemplo. text. los valores de Precio en la tabla LibrosNuevos se actualizan al mismo valor que la columna Precio de la tabla Titulos. o image. Modificar datos ntext. y ODBC soportan actualizar los datos de la fila actual sobre la que la aplicación se encuentra posicionada en un conjunto de resultados.Titulo En este comando. utilizan la interfase ISequentialStream. text.

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

La mejora en el rendimiento se logra a través de un almacenamiento local (en la base de datos). . 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). SQL Server construye un plan de ejecución para procesar el pedido. 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. Posteriormente se los puede invocar de diversas maneras.99-146 El comando TRUNCATE TABLE es una forma rápida y no registrada de eliminar todas las filas en una tabla. Para eliminar la definición de la tabla se debe usar el comando DROP TABLE. porque DELETE graba un registro de transacciones por cada fila eliminada. algunos de los cuales ya hemos utilizado en este Kit. El comando TRUNCATE TABLE inmediatamente libera el espacio ocupado por los datos de la tabla e índices. Rendimiento Cada vez que un comando Transact-SQL. Propósito y ventajas de los procedimientos almacenados Los procedimientos almacenados proporcionan ventajas de performance. y mayores capacidades de seguridad. o conjunto de comandos. para que realicen el procesamiento de los comandos Transact SQL incorporados. es enviado el servidor para su procesamiento. El SQL Server provee una serie de procedimientos almacenados del sistema. Cuando se ejecuta un script. 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. Este método es casi siempre más rápido que un comando DELETE sin condiciones. Una vez que los permisos y la sintaxis de los comandos se han verificado. configurar un comportamiento y administrar al servidor o para manipular datos contenidos en una base de datos. También se liberan las páginas de distribución de todos los índices. mientras que TRUNCATE TABLE solo graba registro de liberación de las páginas de datos completas. 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. código precompilado. Estos procedimientos son guardados en la base de datos Master y contienen comando Transact SQL que facilitan muchas tareas. tal como desde el Query Analizer. A estos scripts se les puede dar un nombre y guardar como procedimientos almacenados en el SQL Server. 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. y manejo de cachés (almacenamientos temporarios). mientras se los habilita a ejecutar procedimientos almacenados que actúan sobre la base de datos. A los grupos de comandos los llamaremos scripts (guiones). los comandos son ejecutados por SQL Server para mostrar un conjunto de resultados. el servidor debe determinar si el remitente tiene suficientes privilegios para ejecutar esos comandos y si los comandos son válidos. un marco de trabajo.

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]

[dbo]. que también será creado en la TempDB. se agrega adelante del nombre del procedimiento un doble símbolo numeral ##. El ejemplo siguiente crea un procedimiento almacenado temporario local. un procedimiento almacenado sólo puede existir en la TempDb. Para crear un procedimiento almacenado temporario global. Crear procedimientos almacenados temporarios Para crear un procedimiento almacenado temporal local. 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. ListAuthorNames. Por definición.[dbo].[dbo].[authors] GO • crear un procedimiento almacenado temporario que sea local en tempdb USE TEMPDB GO CREATE PROCEDURE directtemp AS SELECT * from [pubs]. 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. 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]. Un nombre de procedimiento almacenado totalmente incluye el nombre de su propietario (en este caso dbo) y el nombre del procedimiento. agregue adelante del nombre del procedimiento el símbolo #. .[authors] GO • crear un procedimiento temporario global CREATE PROCEDURE #globaltemp AS SELECT * from [pubs].[authors] GO .105-146 Fíjese que el nombre del procedimiento está totalmente calificado en el ejemplo.

‘IsEncrypted’) . se debe hacer a la base de datos TempDB la base actual antes de crearlo. el código siguiente crea un procedimiento encriptado llamado Protected: USE Pubs GO CREATE PROC [dbo].[protected] WITH ENCRYPTION AS SELECT [au_fname]. almacenar temporariamente en memoria y encriptar procedimientos almacenados Los procedimientos almacenados puedes ser agrupados lógicamente al momento de su creación. cachear un plan de ejecución es contraproducente. [au_lname] FROM [pubs].[dbo].106-146 Nombres de bases de datos totalmente calificadas son especificadas en los comandos SELECT. Por ejemplo.2 al momento de su creación. cuando los parámetros de un procedimiento almacenado varían considerablemente de una ejecución a la siguiente. Por ejemplo. 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. 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 razones de performance se podría no querer cachear un plan de ejecución de un procedimiento almacenado. 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’).[dbo]. que se guardan en la base Masters. use la palabra clave WITH ENCRYPTION cuando crea el procedimiento. agregue las palabras claves WITH RECOMPILE cuando crea el procedimiento almacenado. cuando se crea un procedimiento almacenado temporario directamente en la base de datos TempDB. Si el procedimiento no se ejecuta en el contexto de una base de datos específica.2. Tal como los procedimientos almacenados del sistema. o se debe calificar totalmente el nombre ([TempDb]. Agrupar.1 y ProcAgrupado. 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. 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.1 y ProcAgrupado.[directtemp]). Para agrupar procedimientos almacenados. se debe asignar a cada procedimiento del grupo el mismo nombre y agregarle un número único separado por un punto y coma. Encriptar un procedimiento almacenado protege su contenido de ser visto.[authors] Las palabras claves WITH ENCRYPTION encriptan la columna de texto del procedimiento almacenado en la tabla SysComments. Por defecto. los agrupa lógicamente. Por ejemplo: el denominar a dos procedimientos almacenados con ProcAgrupado. Para encriptar un procedimiento almacenado. 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. se ve el código para ambos ProcAgrupado. luego nombre de bases de datos totalmente calificadas aseguran que se está referenciando a la base de datos apropiada. Para provocar que un procedimiento almacenado sea recomplilado cada vez que se ejecuta. En el tercer parte del ejemplo.

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

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

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

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

.111-146 @optionvlue = true Sólo los procedimientos de dbo y ubicados en la base master pueden ser configurados para ejecutarse automáticamente. 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. Se puede configurar a un procedimiento para que arranque automáticamente desde el Enterprise Manager. tales como su ID. Se accede a la base Master. Para determinar si un procedimiento almacenado arranca automáticamente. y su bandera de arranque.para modificar el contenido de un procedimiento almacenado de usuario. @configvalue = 0 RECONFIGURE GO Modificar procedimientos almacenados Se puede usar el comando ALTER PROCEDURE (ALTER PROC en su versión abreviada). se puede correr el procedimiento almacenado sp_configure. y luego clic derecho. 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 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. La sintaxis del comando ALTER PROCEDURE es casi idéntica a la del CREATE PROCEDURE. se puede ejecutar la función OBJECTPROPERTY y controlar la propiedad ExecIsStartup. El conjunto de permisos. se hace clic en el nodo Stored Procedures. 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). 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’. Llamar a un procedimiento desde otro se denomina llamadas anidadas. ‘ExecIsStartup’) Para deshabilitar procedimientos para que no continúen ejecutándose automáticamente. Se selecciona al procedimiento almacenado. utilizando el Query Analyzer o una herramienta de comandos como osql. Para mantener la encriptación o la configuración de recompilación.

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

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

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

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

Sino. El comando RETURN se usa primariamente para el manejo de errores porque cuando se corre el comando RETURN. ejecutar el procedimiento retorna el siguiente conjunto de resultados: Title Onions.116-146 función @@ERROR para manejar errores que se producen cuando se ejecuta el procedimiento. el procedimiento almacenado termina inmediatamente. Leeks. @titletext varchar (80) OUTPUT AS -. Si el valor especificado para el valor de entrada (@Title) no existe en la base ded atos. El comando RETURN se usa para generar códigos y salidas de un batch. 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. y puede proveer d cualquier valor entero al programa que llamador. @TitleText = title FROM titles WHERE title LIKE @Title GO .SalesForTitle @Title varchar(80). 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. Considere el procedimiento almacenado SalesForTitle del punto anterior. @YtdSales int OUTPUT. Los códigos de retorno pueden usarse para otros propósitos además de manejar errores. 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. sale y devuelve 1 IF (SELECT COUNT(*) FROM titles WHERE title LIKE @Title) = 0 RETURN(1) ELSE SELECT @YtdSales = ytd_sales.Controla para ver si el titulo esta la base.

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

118-146 Este modelo de objetos se ha introducido como modelo de acceso de datos para IIS. 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. En cierto sentido. Esta tecnología autoriza el acceso a todo tipo de datos. ADO es el modelo de objetos que permite simplificar el acceso a esta tecnología. Esta tecnología tiene como objetivo reemplazar a la tecnología ODBC. 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. 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. Un proveedor OLEDB implementa las interfaces OLEDB. un proveedor OLEDB es similar a un driver ODBC que proporciona un mecanismo uniforme de . y tiene en cuenta las restricciones de la web. permitiendo administrar el aspecto de tener distribuidas las fuentes de datos.

una vez que éste contiene los datos. Clásicamente. Recordset y Field. Además. Los proveedores OLEDB no sólo proporcionan un mecanismo uniforme de acceso a los datos relacionales. permite obtener información precisa sobre la causa del error. Colección Errors La colección Errors y el objeto Error se acceden a través del objeto Connection. si no que también a datos no relacionales. El objeto Error es diferente del objeto Err de VB. en la medida en que no contiene los errores generados y definidos por el proveedor. Objetos y Colecciones del modelo de objetos ADO Los objetos Connection. Command. 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. como las consultas SQL o las actualizaciones de una base de datos. por lo tanto. Recordset y Command son los objetos más significativos de este modelo. El modelo de objetos ADO El esquema siguiente muestra los objetos y las relaciones existentes entre los objetos y el modelo. . Colección Fields La colección Fields y el objeto Field se utilizan a través del objeto Recordset.119-146 acceso a los datos relacionales. 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. 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. Cada objeto de Property es accesible a través de la colección Properties de cada uno de estos objetos. Descripción de los objetos y colecciones La colección Properties proporciona la información sobre las características de los diferentes objetos Connection. a no ser que se produzca un error de proveedor .

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

Open "Data Source=MySQLServerName. rs.Provider = "SQLOLEDB" cn. especificando la sentencia SQL ' y la cadena de conexión.UID=sa" ' Establecer el comando texto." End If ' Cerrar la conexión.Execute() . rs.Open "Select * fromtitles".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. Do While Not rs. cmd.CommandText = "Select * from titles" cmd. y especificar que es ' una sentencia SQL. Set rs = cmd.Recordset ' Abrir el recordset. "sa". cn.".Recordset ' Establecer el comando conexión usando una cadena de conexión.CommandType = adCmdText ' Crear un recordset.EOF Debug.Connection cn.Initial Catalog=pubs.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. lo muestra. "" ' Si la conexión está abierta. cmd.State = adStateOpen Then Debug."DSN=pubs. If cn.Print rs(0) rs.MoveNext Loop ' Cerrar el recordset.Print "Conexión abierta.ActiveConnection = "DSN=pubs.UID=sa" ' Bucle a través del recordset e impresión del primer campo.Command Dim rs As New ADODB.Close Set cn = Nothing End Sub Abrir y cerrar un Recordset Sub RecordsetExample() Dim rs As New ADODB.

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

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

cn. Debug.Print cmd.Execute() ' Muestra la propiedad ConnectionTimeout de la conexión. ' id del usuario. "sa" ' Establecer el comando conexión usando una cadena de conexión.Properties("Connect Timeout") ' Muestra la propiedad CommandTimeout del comando. Debug. especificando que es una sentencia SQL. 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. Set cmd. 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. Set rs = cmd. .CommandType = adCmdText ' Crear el recordset.ActiveConnection = cn ' Establecer el comando texto.Command Dim rs As New ADODB.Close End Sub Las cadenas de conexión Si necesita escribir una cadena de conexión.Properties("Command Time out") ' Muestra la propiedad Updatability del recordset. DSN. hacer clic en el botón derecho sobre Connection1 para ver las características de la conexión (el proveedor. existe una manera de generarla con el asistente de creación de una conexión de datos.Print rs.CommandText = "Select * from titles" cmd.Print cn.124-146 Sub PropertyExample() Dim cn As New ADODB. Debug. rs. u contraseña.Properties("Updatability") ' Cierra el recordset. En la ventana Entorno de datos. especificando el nombre del origen de datos.Recordset ' Abrir la conexión. las propiedades específicas).Connection Dim cmd As New ADODB.Open "pubs". cmd.

125-146 .

. para el modelo más reciente y potente de acceso a datos de Microsoft. estratégica y de alto nivel. fácil de usar. Modelo de objetos de ADO Cada uno de los objetos Connections.Recordset y Field También tiene una colección Properties. puesto que los ADO han sido diseñados para combinar las mejores funciones de RDO y DAO. incluso. ADO) constituyen una interfaz de Microsoft. como las bases de datos relacionales y no relacionales. ADO es fácil de usar porque se activa mediante un método conocido: la interfaz OLE. 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. para toda clase de datos.Command. OLE DB. utiliza convenciones similares con semántica simplificada que facilitan el aprendizaje a los programadores. disponible prácticamente en todas las herramientas y lenguajes existentes actualmente en el mercado. con un explorador de Internet. texto y gráficos. herramienta. lenguaje o. los sistemas de correo electrónico y archivo. ADO constituye un método de acceso a datos coherente y de alto rendimiento.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. OLE DB proporciona acceso de alto rendimiento a cualquier origen de datos. como si se crea un objeto de trabajo de capas intermedias con una aplicación. ADO es la única interfaz de datos necesaria para programar soluciones cliente/servidor de 1 a n capas y soluciones basadas en datos Web. etc. y eventualmente para sustituirlos. ADO está diseñada como una interfaz de nivel de aplicación. los objetos de trabajo personalizados. Y. tanto cuando se crea una base de datos cliente de usuario.

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

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

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

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

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

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

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

Utilice la propiedad PageSize para dividir lógicamente el objeto Recordset en varias páginas. El puntero del registro actual está al comienzo del archivo (C5 decir.134-146 MODULO IV: Conectarse a un SQL Server TEMA 4: Propiedades ADO AbsolutePage. El puntero del registro actual está al final del archivo (es decir. la posición actual se desconoce o el proveedor no admite la propiedad AbsoltitePage. 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. propiedad (ADO) Especifica en qué página reside el registro actual. propiedad (ADO) Especifica la posición ordinal del registro actual de un objeto Recordset. El puntero del registro actual está al comienzo del archivo (C5 decir. la propiedad EOF tiene el valor True). 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). 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. Se aplica a Objeto Recordset (ADO). AbsolutePosition. la propiedad EOF tiene el valor True). la propiedad BOF tiene el valor True). 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. Obtenga el número total de páginas a partir de la propiedad PageCount. Al igual que la propiedad AbsolutePosition. Se aplica a Objeto Recordset (ADO). El proveedor debe ser compatible con la funcionalidad apropiada para que esta propiedad esté disponible. El puntero del registro actual está al final del archivo (es decir. la propiedad BOF tiene el valor True).

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

Se establece a True.Recordset strCnn As String strMessage As String intCommand As Integer varBookmark As Variant . Si una de las dos propiedades BOF o EOF es true. MoveLast Move O MoveNext. 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.EOF=False Permitido BOF=False. Move > O Ningún cambio Ningún cambio EOF Ningún cambio Se establece a True. MovePrevious. un registro. 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. pero no puede localizar correctamente un registro: BOF MoveFirst.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. y devuelve False (O) si la posición del retristro actual esta en o después del primer registro.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. Move O MoveLast Move<O Move>O BOF=True. Move <O Se establece a True. Esta tabla muestra qué métodos Move se permiten con diferentes combinaciones de las propiedades BOF y EOF: MoveFirst. 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. Se aplica a Objeto Recordset ADO. 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. MovePrevious. Cuando se abre un objeto Recordset que contiene. Valor devuelto Las propiedades BOF y EOF devuelven valores Boolean. Se establece a True. Si se elimina el último registro que queda en el objeto Recordset. MoveNext. no hay ningún registro actual. La propiedad BOF devuelve True (-1) si la posición del registro actual está antes del primer registro. 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. La propiedad EOF devuelve True si la posición del registro actual está después del último registro. el primer registro es el registro actual y las propiedades BOF y BOF tienen el valor False. al menos. y devuelve False si la posición del registro actual está en o después del último registro. las propiedades BOF y EOF pueden conservar el valor False hasta que se intente volver a colocar el registro actual.

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

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

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. es posible que el proveedor modifique el contenido de la propiedad: por ejemplo. ConnectionString. En un objeto Connection. Argumento Descripción Provider Especifica el nombre del proveedor que se usa con la conexion. un objeto de origen de datos persistente) que contiene información sobre la conexión preestablecida.. ADO esperará indefinidamente hasta que termine la ejecución. Especifica el nombre de un proveedor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service). Indica el nombre de un archivo especifico del proveedor (por Qíempío. Se aplica a Objeto Connection (ADO). la propiedad CommandTimeout permanece en modo lectura/escritura después de que se abra Connection. 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). no se pueden pasar . 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. un objeto de origen de datos persistente) que contiene información sobre la conexión preestablecida. Especifica la ruta de acceso del servidor que se usa al abrir una conexión del lado del cliente (solamente con Remote Data Service). 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. ADO admite cuatro argumentos con la propiedad ConnectionString.139-146 propiedad a cero. Debido a que el argumento File Name hace que ADO cargue el proveedor asociado. asignando los nombres de argumento definidos con ADO a sus equivalentes en el proveedor. Configuración y valores devueltos Establece o devuelve un valor String. Compruebe que el proveedor y el origen de datos para los que está escribiendo código admiten la funcionalidad CommandTimeout. Después de que se establezca la propiedad ConnectionString y se abra el objeto Connection. 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). cualquier otro argumento pasa directamente al proveedor sin que ADO lo procese. El valor de CommandTimieout en un objeto Connection no afecta al valor de CommandTimeout en un objeto Command de la misma Connection. la propiedad CommandTimeout del objeto Command no hereda el valor de CommandTimeout del objeto Connection. es decir. propiedad (ADO) Contiene la información que se utiliza para establecer una conexión a un origen de datos.

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

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

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

Close End Sub PageSize. adCmdTable ' Display names and hire dates. strCnn = "Provider=sqloledb. strCnn.Recordset ' Use client cursor to enable AbsolutePosition property. Ejemplo Este ejemplo utiliza las propiedades AbsolutePage. Vea las propiedades PageSize y AbsolutePage para obtener más información acerca de la funcionalidad de las páginas.EOF Then Exit For Next intRecord MsgBox strMessage Next intPage rstEmployees. .CursorLocation = adUseClient rstEmployees. .Open "employee".MoveNext If rstEmployees.AbsolutePage = intPage strMessage = "" For intRecord = 1 To rstEmployees.Initial Catalog= pubs.PageSize = 5 intPageCount = rstEmployees. " Set rstEmployees = New ADODB. rstEmployees.Password=. rstEmployees.PageSize strMessage = strMessage & _ rstEmployees!fname & " " & _ rstEmployees!lname & " " & _ rstEmployees!hire_date & vbCr rstEmployees. 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.PageCount For intPage = 1 To intPageCount rstEmployees.143-146 el valor de PageCount." & _ "Data Source=srv.UserId=sa. propiedad (ADO) Indica cuántos registros constituyen una página en el objeto Recordset. 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.

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

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

simplemente. Los índices existentes no se eliminarán. se restablecen las filas a su orden original y se eliminan los índices temporales. Los datos no se vuelven a ordenar físicamente. 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. sino que. que especifica el orden del campo.146-146 Sort. . está seguido de un espacio en blanco y de la palabra clave ASCENDING o DESCENDING. Al establecer la propiedad Sort a una cadena vacía. 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. opcionalmente. se tiene acceso a los mismos en el orden indicado. 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. donde cada nombre es un objeto Field del objeto Recordset Y.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->