You are on page 1of 164

Usted es libre de: Copiar, distribuir y comunicar pblicamente la obra bajo las siguientes

CONDICIONES
Reconocimiento. Debe reconocer y citar al autor original. No comercial. No puede utilizar esta obra para fines comerciales. Sin obras derivadas. No se puede alterar, transformar o generar una obra derivada a partir de esta obra. Al reutilizar o distribuir la obra, tiene que dejar bien claro los trminos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legtimos u otras limitaciones no se ven afectados por lo anterior.

Traduccin y adaptacin: ISC. Rodrigo Jimnez Ruiz Departamento: de Ingeniera de Software. Direccin de desarrollo Tecnolgico, Secretara de Administracin. Enero 2004.

Programacin de base de datos con SQL SERVER 2000

Manual del participante

BIENVENIDA

La Direccin de Desarrollo Tecnolgico con el afn de contribuir en el desarrollo de los servidores pblicos, implementa cursos de capacitacin informtica. Es por eso que te invitamos a participar entusiasta y activamente en el curso taller de: Programacin de Bases de Datos con SQL Server 2000 El cual tiene como propsito que el participante sea capaz de programar bases de datos en SQL Server 2000.

El xito y la superacin esta en tus manos, nosotros contribuimos a que tu crecimiento individual e institucional sea el reflejo en tu trabajo.

Propsito
El participante ser capaz de programar bases de datos utilizando Microsoft SQL Server 2000.

Resultados de Aprendizaje

Identificar la visin general de la programacin de bases de datos en SQL Server 2000. Crear y Manejar Bases de Datos utilizando el Administrador Corporativo y el Analizador de Consultas. Crear tipos de datos y tablas en SQL Server 2000. Implementar Integridad de datos en SQL Server 2000. Planear ndices en SQL Server 2000. Crear y mantener ndices para el buen desempeo de las bases de datos en SQL Server 2000. Crear Vistas de datos utilizando Transact-SQL. Crear y manejar procedimientos almacenados en SQL Server 2000. Crear y manejar funciones definidas por el usuario en SQL Server 2000. Aplicar y administrar desencadenantes en SQL Server 2000.

Introduccin
Informacin general Microsoft SQL Server 2000 proporciona una potente administracin de bases de datos a travs de herramientas como el administrador corporativo y el analizador de consultas. La versin que trata este manual es Microsoft SQL Server 2000 Enterprise Manager. Este manual aborda cada tema con una visin general, mas no superficial, de cmo programar bases de datos en SQL Server 2000. No es un manual de referencia, en el que el participante encontrar todas las respuestas a sus preguntas; por el contrario, pretende ser una herramienta que mediante conceptos y ejemplos genere el inters al participante por investigar y aprender ms a fondo cada tema. Nota: ste no es un manual exhaustivo en el que se detallan todas las funciones de Microsoft SQL Server 2000. Para obtener informacin ms detallada sobre su utilizacin consulte la Ayuda de los libros en pantalla. Lecciones En este manual se incluyen varias lecciones detalladas diseadas para ensearle los aspectos bsicos de la programacin de bases de datos en SQL Server 2000. Es muy importante leer cada tema y seguir paso a paso las instrucciones que se especifican en cada ejemplo. Los ejemplos pretenden mostrar al participante la manera de cmo realizar una accin, por lo que puede encontrar variaciones de nombres de objetos en diferentes ejemplos referenciados. Cuando el participante complete una prctica, ser capaz de realizar otras acciones con objetos propios. Las lecciones estn pensadas en usuarios sin experiencia en SQL Server, pero con ciertos conocimientos en bases de datos. Si el participante desea ampliar algn subtema en especial se le recomienda remitirse a los libros en pantalla de Microsoft SQL Server 2000.

Contenidos
Bienvenida Introduccin Resultados de aprendizaje 1. Visin general de SQL SERVER 2000 1.1 Diseo de la arquitectura de aplicaciones empresariales 1.2 Herramientas de programacin de SQL Server 1.3 Elementos de Transact-SQL 1.4 Elementos adicionales de lenguaje 1.5 Prctica 2. Crear y manejar Bases de datos 2.1 Creacin de Bases de datos 2.2 Creacin de grupos de archivos 2.3 Manejo de Bases de datos 2.4 Introduccin a las estructuras de datos 2.5 Prctica 3. Crear tipos de datos y tablas 3.1 Creacin de tipos de datos 3.2 Creacin de tablas 3.3 Generar valores de columnas 3.4 Generar scripts 3.5 Prctica 4. Implementar integridad de datos 4.1 Tipos de integridad de datos 4.2 Exigir integridad de datos 4.3 Definir restricciones 4.4 Tipos de restricciones 4.5 Deshabilitar restricciones 4.6 Usar Defaults y Reglas 4.7 Decidir qu mtodo usar para exigir integridad de datos 4.8 Prctica 5. Planear ndices 5.1 Introduccin a los ndices 5.2 Arquitectura de ndice 5.3 Qu columnas indizar 5.4 Prctica 6. Crear y mantener ndices 6.1 Creacin de ndices 6.2 Creacin de opciones de ndice 6.3 Mantenimiento de ndices 6.4 Prctica 7. Vistas 7.1 Introduccin a las vistas

6 10 12 15 24

26 31 33 38 42

44 47 49 51 52

54 55 56 59 64 66 68 69

71 74 80 85

87 92 94 99

101 6

7.2 Ventajas de vistas 7.3 Definir vistas 7.4 Modificar datos a travs de vistas 7.5 Optimizar el rendimiento utilizando vistas 7.6 Prctica 8. Procedimientos almacenados 8.1 Introduccin a los procedimientos almacenados 8.2 Crear, ejecutar, modificar y borrar procedimientos almacenados 8.3 Prctica 1 8.4 Usar parmetros en procedimientos almacenados 8.5 Ejecutar procedimientos almacenados extendidos 8.6 Manejar mensajes de error 8.6 Consideraciones de rendimiento 8.7 Prctica 2 9. Funciones definidas por usuario 9.1 Qu es una Funcin definida por el usuario? 9.2 Definiendo funciones definidas por el usuario 9.3 Ejemplos de Funciones definidas por el usuario 9.4 Prctica 10. Implementacin de desencadenantes 10.1 Introduccin 10.2 Definir desencadenantes 10.3 Cmo trabajan los desencadenantes? 10.4 Prctica Conclusin Bibliografa

102 103 109 110 113

115 120 125 126 129 130 133 134

136 137 140 143

145 148 152 159 160 161

Visin General

1. Visin General de la Programacin en SQL Server 2000

Contenido

Diseo de la arquitectura de aplicaciones empresariales Herramientas de programacin de SQL Server Elementos de Transact-SQL Elementos adicionales de lenguaje Prctica

1.1 1.2 1.3 1.4 1.5

Este captulo es de introduccin a la arquitectura de aplicaciones empresariales y herramientas de programacin que tiene SQL Server. Al concluir este mdulo el participante ser capaz de: Describir los conceptos de arquitectura de aplicacin a nivel corporativo. Describir las principales herramientas de programacin de SQL Server 2000. Explicar la diferencia entre las dos principales herramientas de programacin en SQL Server 2000. Describir los elementos bsicos de Transact-SQL. Describir el uso de las variables locales, operadores, funciones, controles de flujo, sentencias y comentarios. Describir las diferentes formas de ejecucin de una sentencia Transact-SQL.

Visin General

Diseo de la arquitectura de aplicaciones empresariales

1.1

SQL Server es a menudo parte de una aplicacin distribuida. El diseo de una implementacin SQL Server para una solucin empresarial depende de la seleccin de arquitectura y como pretende distribuir la lgica a travs de las aplicaciones.

Capa de Presentacin de Datos

Capa de Lgica de Aplicacin Componentes Construidos para Clientes

Capa de Servicios de Datos

Aplicaciones de Cliente Windows Navegadores Web

Lgica de Acceso a Datos Almacenamiento de Datos

Aplicaciones y Servicios Integrados Reglas de Negocio Reglas de Datos

Fig. 1.1 Capas lgicas. La arquitectura de una aplicacin empresarial contiene capas lgicas. Las capas representan la presentacin de datos, lgica de aplicacin y servicio de datos. Capa de Presentacin de Datos La capa de presentacin de datos tambin es referida como servicios de usuario y permite a los usuarios navegar y manipular datos. Los dos principales tipos de aplicacin cliente son aplicaciones cliente Microsoft Windows y navegadores Web. La capa de presentacin de datos usa los servicios que le proporciona la capa lgica de aplicacin. Capa Lgica de Aplicacin Esta capa contiene la lgica de aplicacin que define reglas y procesos. Esta permite escalabilidad; en lugar de que muchos clientes accedan directamente a la base de datos (con cada cliente requiriendo una conexin separada), los clientes pueden conectarse a los servicios de negocios que, a su vez, se conectan a los servidores de datos. Los servicios de negocios pueden ser componentes construidos para clientes o aplicaciones y servicios integrados, tales como los servicios Web. La capa lgica de aplicacin puede contener tambin componentes que hacen uso de servicios de transacciones, servicios de mensajera o servicios de administracin de objetos y conexin.

Capa de Servicios de Datos Los servicios de datos incluyen la lgica de acceso a datos y almacenamiento de datos. Estos servicios pueden incluir procedimientos almacenados de SQL Server para manejar el trfico de datos y la integridad en el servidor de la base de datos.

Visin General

Definicin de las capas fsicas Fsicamente se pueden ubicar las capas lgicas en un ambiente distribuido en una variedad de formas. Aunque todas las capas lgicas pueden existir en una computadora, esto es tpicamente distribuir las capas lgicas en un modelo de dos niveles o multi-nivel. Esto permite implementar la lgica, reglas del negocio, y procesamiento donde estos son ms efectivos.

Modelo de Dos Capas

Presentacin de Datos Modelo Multi-Capa

Servicios de Datos

IIS Presentacin de Datos

Componentes Lgica de Aplicacin

Servicio de Datos

Fig. 1.2 Capas fsicas. Usando un modelo de Dos Capas Al usar este modelo se puede situar la lgica de presentacin y aplicacin en el cliente y los servicios de datos sobre el servidor. Alternativamente, se puede situar la lgica de aplicacin en procedimientos almacenados sobre el servidor. Tambin se puede tener una solucin mixta en la cual la lgica de aplicacin esta dividida entre el cliente y el servidor. Los diseos en dos niveles son menos comunes que los diseos multi-capas, debido a la creciente popularidad de las aplicaciones para Internet. No son escalables y no pueden ser fciles de mantener como un diseo multi-capas. Usando un Modelo Multi-Capas El modelo multi-capas, tambin conocido como tres capas o n-capas, permite distribuir la lgica a travs de las aplicaciones. Las reglas del negocio pueden ser separadas del cliente o la base de datos. Cuando este modelo es aplicado a Internet, puede dividir los servicios de presentacin entre un cliente explorador (browser) y un servicio Web de Internet Information Services (IIS); el servidor Web formatea las pginas Web que despliegan los exploradores. El modelo multi-capa es escalable para grandes bases de clientes y muchas aplicaciones, y puede propagar la carga de trabajo a travs de muchas computadoras. Un modelo multi-capa es fcil de manejar debido a que puede aislar un cambio a una regla de negocio sin afectar a otras. Tambin, una actualizacin a un Active Server Page (ASP) en un servidor Web, automticamente actualiza todos los clientes.

Visin General

Acceso a datos Las tecnologas Microsoft permiten acceder datos corporativos usando un amplio rango de clientes preconstruidos o clientes hechos a la medida que usan una interfaz programada de acceso a datos (API). Aplicaciones y componentes Access
Consumidores de Datos

Browser

Excel

Cliente usuario

IIS

ActiveX Data Objects (ADO)

Proveedores de Datos

Proveedores de Datos OLE DB (Servicios) Cursores


Procesadores Servicios de de Consultas Negocios

Proveedores de Datos OLE DB (Datos)


ODBC SQL Server Jet Active Directory Exchange Excel Otros Proveedores

Fig. 1.3 Modelo de acceso a datos Clientes preconstruidos Pueden usarse aplicaciones de cliente preconstruido para acceder datos a SQL Server. La lgica de recuperacin de datos es parte de la aplicacin cliente. Microsoft Office 2000 incluye Microsoft Access y Microsoft Excel. Cuando parte de una solucin multicapa, se usan estas aplicaciones principalmente para servicios de presentacin. No obstante, tambin se pueden usar estos para la lgica de aplicacin y servicios de datos. Estas aplicaciones permiten a los usuarios navegar datos del lado cliente y ejecutar consultas especficas. Pueden usarse para recuperar datos SQL Server o como un cliente en un diseo multi-capa. Tambin se puede usar Office 2000 como un ambiente de desarrollo para construir aplicaciones de acceso a datos. Access y Excel son ejemplos de clientes preconstruidos que ofrecen un rango de funcionalidad. Tambin se puede usar clientes preconstruidos que solo ofrezcan servicios de presentacin, tales como un navegador que se comunica con IIS.

Visin General

Clientes hechos a la medida Se pueden construir clientes hechos a la medida usando interfaces programadas de acceso a datos y un ambiente de desarrollo, tales como Microsoft Visual Studio versin 6.0 Edicin Empresarial. Proporcionar Acceso de Datos Universal Los clientes personales necesitan acceder muchas diferentes fuentes de datos en la empresa. Microsoft Data Access Components (MDAC, por sus siglas en ingls) es una interfaz que permite la comunicacin con diversas fuentes de datos. Pueden usarse los siguientes componentes MDAC para facilitar la comunicacin: OLE DB. Un conjunto de interfaces de Servicios de Componentes que proporcionan acceso uniforme a datos almacenados en diversas fuentes de informacin. OLE DB habilita el acceso a fuentes de datos relacional y no relacional. Microsoft ActiveX Data Objects (ADO). Una interfaz de programacin de aplicacin (API) fcil de usar para cualquier proveedor de datos OLE DB. ADO puede usarse en un amplio rango de escenarios de aplicaciones de acceso a datos. OLE DB y ADO permiten crear componentes de datos que usan los servicios integrados proporcionados por los Servicios de Componentes. ADO permite: Abrir y mantener conexiones. Crear consultas especficas. Ejecutar procedimientos almacenados en SQL Server. Recuperar resultados y usar cursores. Cachear los resultados de consultas en el cliente. Actualizar filas en la base de datos. Cerrar conexiones.

Visin General

Herramientas de programacin de SQL Server

1.2

SQL Server 2000 ofrece una infinidad de herramientas de programacin, incluyendo el Analizador de Consultas de SQL y la utilidad osql. El Analizador de Consultas SQL es una aplicacin basada en Windows y osql es una utilidad que puede ejecutar en el indicador de comando. Analizador de consultas SQL El Analizador de consultas SQL es una interfaz grfica de usuario para disear y probar interactivamente instrucciones Transact-SQL, archivos por lotes y secuencias de comandos. Es posible llamar al Analizador de consultas SQL desde el Administrador corporativo de SQL Server. El Analizador de consultas SQL ofrece: Editor de texto en formato libre para escribir instrucciones Transact-SQL. Cdigo de colores en la sintaxis Transact-SQL para hacer ms legibles las instrucciones complejas. Examinador de objetos y herramientas de bsqueda de objetos para buscar fcilmente objetos y su estructura en una base de datos. Las plantillas se pueden utilizar para acelerar el desarrollo de instrucciones Transact-SQL para crear objetos de SQL Server. Plantillas, que son archivos que incluyen la estructura bsica de instrucciones Transact-SQL necesarias para crear objetos en una base de datos. Un depurador interactivo para analizar procedimientos almacenados. Resultados presentados en una cuadrcula o en una ventana de texto en formato libre. Diagrama grfico de la informacin del plan de presentacin que muestra los pasos lgicos que forman el plan de ejecucin de una instruccin Transact-SQL. Esto permite que los programadores determinen qu parte concreta de una consulta de bajo rendimiento utiliza gran cantidad de recursos. As pueden explorar el diseo de la consulta y minimizar el uso de recursos para obtener los datos correctos. Asistente para optimizacin de ndices, que analiza una instruccin Transact-SQL y las tablas a las que hace referencia para ver si los ndices adicionales pueden mejorar el rendimiento de la consulta. Herramienta osql La herramienta osql permite especificar procedimientos de sistema, archivos de comandos e instrucciones Transact-SQL. Esta herramienta utiliza ODBC para comunicarse con el servidor. Iniciar la utilidad directamente desde el sistema operativo con los argumentos case-sensitive listados abajo. Una vez iniciado, osql acepta sentencias Transact-SQL y los enva a SQL Server interactivamente. Osql formatea y despliega los resultados en la pantalla. Usar los comandos QUIT o EXIT para salir de osql. Sintaxis osql [-?]| [-L]| [ { {-U login_id [-P password]}| E } [-S server_name] [-H wksta_name] [-d db_name] [-l time_out] [-t time_out] [-h headers] [-s col_separator] [-w column_width] [-a packet_size] [-e] [-I] [-D data_source_name] [-c cmd_end] [-q "query"] [-Q "query"] [-n] [-m error_level] [-r {0 | 1}] [-i input_file] [-o output_file] [-p] [-b] [-u] [-R] [-O] ]

10

Visin General

Nota: Los parmetros en las sentencias osql son case-sensitive.

Observaciones Si no especifica un nombre de usuario cuando se inicia osql, SQL Server 2000 busca variables de entorno y las utiliza; por ejemplo, osqluser=(user) u osqlserver=(server). Si no se establecen variables de entorno, se utilizar el nombre de usuario de la estacin de trabajo. Si no especifica un servidor, se utilizar el nombre de la estacin de trabajo. Comandos OSQL Adems de las instrucciones Transact-SQL en osql, tambin estn disponibles estos comandos: Comando GO RESET ED !! command QUIT o EXIT( ) CTRL+C Descripcin Ejecuta todas las instrucciones escritas despus del ltimo GO. Borra cualquier instruccin que haya escrito. Llama al editor. Ejecuta un comando del sistema operativo. Sale de osql. Finaliza una consulta sin salir de osql.

El Lenguaje de programacin Transact-SQL

Transact-SQL es la implementacin de SQL Server del estndar a nivel de entrada del ANSI-SQL Internacional Standards Organization (ISO). Los elementos de lenguaje sujetos al ANSI-SQL de Transact-SQL pueden ser ejecutados desde cualquier producto compatible a nivel de entrada con el ANSI-SQL. Transact-SQL tambin contiene elementos de lenguaje adicional que son nicos en l. Importante Es recomendable escribir los scripts que incluyan solo las sentencias estndares de ANSI-SQL para incrementar la compatibilidad y portabilidad de bases de datos.

11

Visin General

Elementos de Transact-SQL

1.3

Sentencias de lenguaje de control de datos (DCL) Sentencias de Lenguaje de Definicin de Datos (DDL) Sentencias de Lenguaje de Manipulacin de Datos (DML) Nombres de Objetos de SQL Server Reglas para nombrar

Para escribir y ejecutar sentencias Transact-SQL, se usan diferentes sentencias de lenguajes, los cuales son usados para determinar quien podr ver o modificar los datos, crear objetos en la base de datos y consultar y modificar datos. Sentencias de Lenguaje de Control de Datos (DCL) Las sentencias de Lenguaje de Control de Datos (DCL, por sus siglas en ingls) cambian los permisos asociados con un usuario de base de datos o rol. En seguida se describen las sentencias DCL. Sentencia GRANT Descripcin Crea una entrada en el sistema de seguridad que permite a un usuario trabajar con datos o ejecutar ciertas sentencias TransactSQL. Crea una entrada en el sistema de seguridad que deniega un permiso desde una cuenta de seguridad, y previene al usuario, grupo o rol de heredar los permisos a travs de estos miembros de roles y grupos. Remueve un permiso previamente otorgado o denegado.

DENY

REVOKE

Por default, solo los roles sysadmin, dbcreator, db_owner y db_securityadmin pueden ejecutarlo. Ejemplo Este ejemplo otorga al rol public permisos para consultar la tabla Products. USE Northwind GRANT SELECT ON Products TO public Sentencias de lenguaje de definicin de datos Define los Objetos de la Base de Datos CREATE tipo_objeto nombre_objeto ALTER tipo_objeto nombre_objeto DROP tipo_objeto nombre_objeto 12

Visin General

Por default, solo los roles sysadmin, dbcreator, db_owner y db_ddladmin pueden ejecutarlo. Sentencias de Lenguaje de Manipulacin de Datos (DML) Se Usa Cuando se Trabaja con Datos en la Base de Datos SELECT, INSERT, UPDATE, DELETE Por default, solo los roles sysadmin, dbcreator, db_owner, db_datawriter y db_datareader pueden ejecutarlo Nombres de Objetos de SQL Server Identificadores estndar El primer carcter debe ser alfabtico Los otros caracteres pueden incluir letras, nmeros o smbolos Los identificadores que inician con smbolos tienen un uso especial Identificadores delimitados Usar cuando los nombres contengan espacios Use cuando las palabras reservadas son porciones de nombres Encierre en corchetes ([ ]) o marcas de comillas ( ) El nombre de un objeto de base de datos se conoce como su identificador. Todo en Microsoft SQL Server puede tener un identificador. Servidores, bases de datos y objetos de bases de datos tales como tablas, vistas, columnas, ndices, desencadenadores, procedimientos, restricciones, reglas, etc. pueden tener identificadores. Se requiere que la mayor parte de los objetos tengan identificadores; pero para ciertos objetos, como las restricciones, son opcionales. El identificador de un objeto se crea cuando se define el objeto. A continuacin, el identificador se utiliza para hacer referencia al objeto. Identificadores estndares Siguen las reglas de formato de los identificadores. Los identificadores normales no estn delimitados cuando se usan en instrucciones de Transact-SQL. SELECT * FROM TableX WHERE KeyCol = 124 Las reglas de formato de los identificadores normales dependen del nivel de compatibilidad de la base de datos, que se puede establecer con sp_dbcmptlevel. Cuando el nivel de compatibilidad es 80, las reglas son: El primer carcter debe ser alguno de los siguientes: Una letra, como aparece definida por el estndar Unicode 2.0. La definicin Unicode de letras incluye los caracteres latinos de la "a" a la "z" y de la "A" a la "Z", adems de los caracteres de letras de otros idiomas.

13

Visin General

El signo de subrayado (_), arroba (@) o nmero (#). Ciertos smbolos al principio de un identificador tienen un significado especial en SQL Server. Un identificador que empieza con el signo arroba indica un parmetro o una variable local. Un identificador que empieza con un signo nmero indica una tabla o procedimiento temporal. Un identificador que empieza con un signo de nmero doble (##) indica un objeto temporal global. Algunas funciones de SQL Server tienen nombres que empiezan con un doble signo de arroba (@@). Para evitar confusiones con estas funciones, se recomienda que no utilice nombres que empiecen con @@. Los caracteres subsiguientes pueden ser: Letras, tal como se definen en el estndar Unicode 2.0. Nmeros decimales de tipo latino bsico o dems secuencias de comandos nacionales. El signo de arroba, dlar ($), nmero o subrayado. El identificador no debe ser una palabra reservada de Transact-SQL. SQL Server reserva las versiones en maysculas y minsculas de las palabras reservadas. No se permiten los caracteres especiales o los espacios incrustados. Identificadores delimitados Se incluyen entre comillas dobles (") o corchetes ([ ]). Los identificadores que siguen las reglas de formato de los identificadores pueden estar delimitados o no. SELECT * FROM [TableX] WHERE [KeyCol] = 124

--El delimitador es opcional. --El delimitador es opcional.

Los identificadores que no cumplen alguna de las reglas de los identificadores deben estar delimitados en las instrucciones Transact-SQL. SELECT * FROM [My Table] WHERE [order] = 10

--El identificador contiene un espacio y usa una palabra reservada. --El identificador es una palabra reservada.

Nota: Ambos identificadores, normales y delimitados, deben contener entre 1 y 128 caracteres. En el caso de las tablas temporales locales, el identificador puede tener un mximo de 116 caracteres.

Reglas para nombrar Usar nombres significativos hasta donde sea posible Mantener nombres cortos Usar una convencin de nombres clara y simple Elegir un identificador que distinga el tipo de objetos Vistas Procedimientos almacenados Mantener nombres de objetos y nombres de usuarios nicos

14

Visin General

Elementos adicionales de lenguaje

1.4

Variables Locales Operadores Funciones Ejemplo de Funciones Elementos de Lenguaje de Control de Flujo Comentarios

Variables Locales Las variables son elementos de lenguaje con valores asignados. Puede usar variables locales en Transact-SQL. Cuando una variable se declara por primera vez, su valor se establece a NULL. Para asignar un valor a una variable, use la instruccin SET. ste es el mtodo preferido para asignar un valor a una variable. Tambin se puede asignar un valor a una variable si se hace referencia a ella en la lista de seleccin de una instruccin SELECT. La instruccin DECLARE inicializa una variable de Transact-SQL al: Asignar un nombre. El nombre debe tener un nico @ como primer carcter. Asignar un tipo de datos suministrado por el sistema o definido por el usuario y una longitud. Para las variables numricas, se asignan tambin una precisin y una escala. Establecer el valor a NULL. Sintaxis: DECLARE {@variable_local tipo_de_dato} [,...n] SET @nombre_de_variable_local=expresion

Nota: Use los tipos de datos suministrados por el sistema para las variables locales con el fin de reducir al mnimo las implicaciones futuras relacionadas con el mantenimiento.

Para declarar ms de una variable local, use una coma despus de la primera variable local definida y, a continuacin, especifique el nombre y tipo de datos de la siguiente variable local. Ejemplo La siguiente instruccin DECLARE crea tres variables locales llamadas @last_name, @fname y @state e inicializa cada una de ellas a NULL. DECLARE @LastName NVARCHAR(30), @FirstName NVARCHAR(20), @State NCHAR(2)

15

Visin General

Ejemplo El siguiente ejemplo declara dos variables. Este usa la sentencia SET para establecer el valor de la variable @vLastName y la sentencia SELECT para ver el valor de la variable @vFirstName. Luego imprime ambas variables. DECLARE @vLastName char(20), @vFirstName varchar(11), SET @vLastName = Dodsworth SELECT @vFirstName = FirstName FROM Northwind.Employees WHERE LastName = @vLastName PRINT @vFirstName + + @vLastName GO El alcance de una variable es el conjunto de instrucciones Transact-SQL desde las que se puede hacer referencia a la variable. El alcance de una variable se extiende desde el punto en el que se declara hasta el final del lote o procedimiento almacenado en el que se ha declarado.

16

Visin General

Operadores Un operador es un smbolo que especifica una accin que es realizada por una o ms expresiones. Microsoft SQL Server 2000 utiliza estas categoras de operadores: Operadores aritmticos Operadores de comparacin Operadores lgicos Operador de concatenacin de cadenas Operadores aritmticos Los operadores aritmticos realizan operaciones matemticas con dos expresiones de cualquiera de los tipos de datos de la categora del tipo de datos numrico. Operador + (suma) - (resta) * (multiplicacin) / (divisin) % (mdulo) Significado Suma. Resta. Multiplicacin. Divisin. Devuelve el resto entero de una divisin. Por ejemplo, 12 % 5 = 2 porque el resto de 12 dividido entre 5 es 2.

Tambin se pueden utilizar los operadores de suma (+) y resta (-) para realizar operaciones aritmticas sobre valores datetime y smalldatetime. Operadores de comparacin Los operadores de comparacin comprueban si dos expresiones son iguales o no. Se pueden utilizar en todas las expresiones excepto en las de los tipos de datos text, ntext o image. Operador = (igual al) > (mayor que) < (menor que) >= (mayor que o igual que) <= (menor que o igual que) <> (no es igual a) != (no es igual a) !< (no es menor que) !> (no es mayor que) Significado Igual a Mayor que Menor que Mayor que o igual a Menor que o igual a No es igual a No es igual a (no es del estndar SQL-92) No es menor que (no es del estndar SQL-92) No es mayor que (no es del estndar SQL-92)

El resultado del operador de comparacin es de tipo de datos Boolean, que tiene tres valores: TRUE, FALSE y UNKNOWN. Las expresiones que devuelven tipos de datos Boolean se conocen como expresiones booleanas. A diferencia de los otros tipos de datos de SQL Server, el tipo de datos Boolean no se puede especificar como tipo de datos de la variable o columna de una tabla, y no se puede devolver en un conjunto de resultados.

17

Visin General

Cuando SET ANSI_NULLS es ON, un operador con una o dos expresiones NULL devuelve UNKNOWN. Cuando SET ANSI_NULLS es OFF, se cumple la misma regla, excepto que el operador de igualdad devuelve TRUE si ambas expresiones son NULL. Por ejemplo, NULL = NULL devuelve TRUE si SET ANSI_NULLS es OFF. Las expresiones con tipos de datos Boolean se utilizan en la clusula WHERE para filtrar las filas que cumplen las condiciones de bsqueda y en las instrucciones de lenguajes de control de flujo tales como IF y WHILE, por ejemplo: USE Northwind GO DECLARE @MyProduct int SET @MyProduct = 10 IF (@MyProduct <> 0) SELECT * FROM Products WHERE ProductID = @MyProduct GO Operadores lgicos Los operadores lgicos comprueban la veracidad de alguna condicin. stos, como los operadores de comparacin, devuelven el tipo de datos Boolean con valor TRUE o FALSE. Operador ALL AND ANY BETWEEN EXISTS IN LIKE NOT OR SOME Significado TRUE si el conjunto completo de comparaciones es TRUE. TRUE si ambas expresiones booleanas son TRUE. TRUE si una cualquier miembro del conjunto de comparaciones es TRUE. TRUE si el operando est dentro de un intervalo. TRUE si una subconsulta contiene a cualquiera de las filas. TRUE si el operando es igual a uno de la lista de expresiones. TRUE si el operando coincide con un patrn. Invierte el valor de cualquier otro operador booleano. TRUE si cualquiera de las dos expresiones booleanas es TRUE. TRUE si alguna de las comparaciones de un conjunto es TRUE.

Operador de concatenacin de cadenas El operador de concatenacin de cadenas permite concatenar cadenas con el signo de suma (+), tambin conocido como operador de concatenacin de cadenas. Cualquier otro tratamiento de cadenas se controla a travs de funciones de cadenas como SUBSTRING. De manera predeterminada, una cadena vaca se interpreta como tal cadena vaca en INSERT o en instrucciones de asignacin con datos de tipo varchar. En la concatenacin de datos de tipo varchar, char o text la cadena vaca se interpreta como tal cadena vaca. Por ejemplo, 'abc' + '' + 'def' se almacena como 'abcdef'. Sin embargo, si el nivel de compatibilidad sp_dbcmptlevel es 65, las constantes vacas se tratan como caracteres en blanco y 'abc' + '' + 'def' se almacena como 'abc def'. Cuando se concatenan dos cadenas de caracteres, la intercalacin de la expresin del resultado se configura segn las reglas de la precedencia de intercalacin. 18

Visin General

Niveles de Precedencia de Operador Si se multiplican operadores (lgicos o aritmticos) para combinar expresiones, SQL Server procesa los operadores en el orden de su precedencia, el cual afectar el valor resultante. La siguiente tabla muestra el nivel de precedencia de los operadores (los niveles van desde el ms alto al ms bajo). Tipo Agrupacin Aritmtico Aritmtico Otro Lgico Lgico Lgico Operador Agrupado principal Multiplicativo Aditivo Concatenacin de cadena NOT AND OR Smbolo () */% -+ + NOT AND OR

SQL Server manipula primero la expresin anidada ms profunda. En suma, si todos los operadores aritmticos en una expresin comparten el mismo nivel de precedencia, el orden es de izquierda a derecha.

Funciones Transact-SQL proporciona muchas funciones que retornan informacin. Las funciones toman parmetros de entrada y retornan valores que pueden ser usadas en expresiones. El lenguaje de programacin Transact-SQL proporciona tres tipos de funciones: Funciones de agregacin, funciones escalares y funciones de conjunto de registros. Funciones de Agregacin Las funciones de agregacin operan sobre una coleccin de valores pero retornan un nico valor sumarizado. Ejemplo 1 Este ejemplo determina el promedio de la columna UnitPrice para todos lo productos en la tabla Products. SELECT AVG (UnitPrice) FROM Products Funciones Escalares Las funciones escalares operan sobre un solo valor y retornan un solo valor. Puede usar estas funciones donde quiera que una expresin sea vlida. Ejemplo 2 Este ejemplo de funcin de metadato retorna el nombre de la base de datasen uso actual. SELECT DB_NAME() AS database Funciones de conjunto de registros Las funciones de conjunto de registros pueden ser usadas con referencias de tablas en una sentencia Transact-SQL. 19

Visin General

Ejemplo 3 Este ejemplo ejecuta una consulta distribuida para recuperar informacin desde la tabla EMP. SELECT * FROM OPENQUERY (OracleSvr, SELECT ENAME, EMPNO FROM SCOTT.EMP) Ejemplo de funciones SELECT ANSI: AS Region, CONVERT(varchar(30), GETDATE(), 102) AS Style UNION SELECT European:, CONVERT(varchar(30), GETDATE(), 113) UNION SELECT Japanese:, CONVERT(varchar(30), GETDATE(), 111) Resultado Region ANSI: European: Japanese: Style 2000.03.22 22 Mar 2000 14:20:00:010 2000/03/22

Elementos de Lenguaje de Control de Flujo Transact-SQL contiene muchos elementos de lenguaje que controlan el flujo de la lgica en una sentencia. Este tambin contiene la expresin CASE que le permite usar lgica condicional sobre una fila a la vez en una sentencia SELECT o UPDATE. Nivel de Sentencia Los siguientes elementos de lenguaje lo habilitan para controlar el flujo de la lgica en un script: Bloques BEGINEND Estos elementos encierran una serie de sentencias Transact-SQL que SQL Server trata como una unidad. Bloques IFELSE Estos elementos especifican que SQL Server puede ejecutar la primera alternativa si una cierta condicin es verdadera. En otro caso, SQL Server ejecutar la segunda alternativa. Construcciones WHILE Estos elementos ejecutan una sentencia repetidamente mientras que la condicin especificada sea verdadera. Los elementos BREAK y CONTINUE controlan la operacin de las sentencias dentro de un ciclo WHILE. Ejemplo: Este ejemplo determina si el usuario es el propietario de la base de datos para ejecutar la instruccin DBCC CHECKDB a la base de datos Northwind. IF USER_NAME() <> dbo BEGIN RAISERROR(Must be sysadmin to Perform Operation, 10, 1) RETURN END 20

Visin General

ELSE DBCC CHECKDB(Northwind) Nivel de Registro Una expresin CASE lista predicados, asigna un valor para cada una, luego prueba cada una. Si la expresin retorna un valor verdadero, la expresin CASE retorna el valor en la clusula WHEN. Si la expresin es falsa, y se ha especificado una clusula ELSE, SQL Server retorna el valor en la clusula ELSE. Puede usarse una expresin dondequiera que se use una expresin. Sintaxis CASE expresin {WHEN expresin THEN resultado} [,n] [ELSE resultado] END

Comentarios Los comentarios son cadenas no ejecutables de texto ubicado en sentencias para describir la accin que la sentencia est ejecutando o para deshabilitar una o ms lneas de la sentencia. Pueden usarse comentarios en una de dos formasen lnea con una sentencia, o como un bloque. Comentarios en Lnea Los comentarios en lnea se crean usando dos guiones (--) para establecer un comentario aparte desde una sentencia. Transact-SQL ignora el texto a la derecha de los caracteres comentados. Tambin se pueden usar estos caracteres de comentarios para deshabilitar lneas de una sentencia. Ejemplo 1 SELECT ProductName, (UnitsInStock + UnitsOnOrder) AS Max - - Calcula el inventario , SupplierID FROM Products Comentarios de bloque Se pueden crear mltiples lneas de comentario ubicando un carcter de comentario (/*) al inicio del texto a comentar, teclear los comentarios y concluir el comentario con un carcter de cierre de comentario (*/). Ejemplo 2 /* ** Este cdigo recupera todos los registros de la tabla productos ** y despliega el precio de la unidad, el precio de la unidad incrementado ** en 10 por ciento, y el nombre del producto. */ SELECT UnitPrice, (UnitPrice *1.1), ProductName FROM Products

21

Visin General

Formas de ejecutar sentencias Transact-SQL Se pueden ejecutar sentencias Transact-SQL construyendo sentencias dinmicamente y usando batches, scripts y transacciones. Tambin se puede usar Extensible Markup Lenguaje (XML) para presentar datos en pginas Web. Para construir sentencias dinmicamente Use EXECUTE con literales de cadena y variables. Use cuando deba asignar valor de variable en tiempo de ejecucin. Algunas variables y tablas temporales solo que duren durante la ejecucin. Sintaxis: EXECUTE ({@str_var|tsql_string}+[{@str_var|tsql_string}...])} Ejemplo DECLARE @dbname varchar(30), @tblname varchar(30) SET @dbname = Northwind SET @tblname = Products EXECUTE (USE + @dbname + SELECT * FROM + @tblname) Resultado ProductName Chai Chang Aniseed Syrup Usar Batch Una o ms Sentencias Transact-SQL confirmadas conjuntamente. Definir un Batch usando la sentencia GO. Cmo procesa los batches SQL Server SQL Server optimiza, compila y ejecuta las sentencias en un lote juntas. Sin embargo, las sentencias no necesariamente se ejecutan como una unidad de trabajo (contrario a una transaccin). No puede combinar algunas sentencias en un batch. Las definiciones de objetos son delimitados por GO; SQL Server reconoce el fin de la definicin de un objeto cuando se encuentra con la sentencia GO: CREATE PROCEDURE CREATE VIEW CREATE TRIGGER CREATE RULE CREATE DEFAULT Ejemplo: CREATE DATABASE CREATE TABLE GO CREATE TRIGGER GO CREATE TRIGGER GO 22

Visin General

Usar Scripts Los scripts son una de las formas ms comunes de ejecutar sentencias Transact-SQL. Una script es una o ms sentencias de Transact-SQL guardadas en un archivo que pueden ser escritas en SQL Quero Analyzer (Analizador de Consultas) o en cualquier editor de texto. Contienen sentencias guardadas. Pueden ser escritos en cualquier editor de texto Guardar usando el nombre de extensin de archivo .sql Ejecutar en el SQL Query Analyzer o la utilidad osql. Usar para recrear objetos de base de datos o ejecutar sentencias repetidamente. Usar Transacciones Procesado como un Batch. La Integridad de los datos est garantizada. Los cambios a la base de datos o son aplicados juntos o se quitan (Rolled Back). Ejemplo: BEGIN TRANSACTION UPDATE savings SET amount = (amount 100) WHERE custid = 78910 ... <Rollback transaction if error> UPDATE checking SET amount = (amount + 100) WHERE custid = 78910 ... <Rollback transaction if error> COMMIT TRANSACTION Usar XML XML es un lenguaje de programacin que desarrolladores de web pueden utilizar para presentar datos desde bases de datos de SQL Server a pginas web. Permitiendo al Cliente Browser Formatear Datos Especificando la opcin FOR XML AUTO Especificando la opcin FOR XML RAW Identificando limitaciones de uso de la clusula FOR XML

Enhorabuena! Hasta ahora el participante ya ha aprendido acerca del Diseo de la arquitectura de aplicaciones empresariales. Tambin ha conocido las Herramientas de programacin de SQL Server y el Lenguaje de programacin Transact-SQL y sus elementos.

23

Visin General

Prctica

1.5

Propsito El participante sea capaz de: Aprender la arquitectura de las aplicaciones empresariales. Utilizar las herramientas que proporciona SQL Server 2000. Utilizar los elementos del lenguaje Transact-SQL.

Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 25 min. De manera personal y sin utilizar el manual del participante realizar los siguientes ejercicios: 1. Usando el SQL Server Books Online. 2. Crear un diagrama de base de datos. 3. Construir una consulta usando Quero Designer.

24

Crear y manejar Bases de datos

2. Crear y manejar Bases de datos

Contenido
Creacin de Bases de datos Creacin de grupos de archivos Manejo de Bases de datos Introduccin a las estructuras de datos Prctica 2.1 2.2 2.3 2.4 2.5

En este captulo se describe como crear una base de datos, establecer opciones de bases de datos, crear grupo de archivos y manejar bases de datos y el registro de transacciones. Tambin de cmo SQL Server 2000 almacena los datos. Al concluir este captulo el participante ser capaz de: Crear bases de datos. Crear grupos de archivo. Manejar bases de datos. Describir estructuras de datos.

25

Crear y manejar Bases de datos

Creacin de bases de datos

2.1

sta seccin se ver cmo crear una base de datos, especificar opciones de bases de datos y recuperar informacin de bases de datos. Tambin de cmo trabaja el registro de transacciones. Definir una Base de datos Creacin de una base de datos Nombre de la base de datos. Tamao de la base de datos. Los archivos donde la base de datos residir.

Se puede realizar desde el Administrador corporativo o desde el Analizador de consultas de SQL-Server 2000. La informacin de cada base de datos es almacenada en la tabla sysdatabases en la base de datos master. Por lo tanto, se debe usar la base de datos master para definir una base de datos cuando se utilice Transact-SQL. La creacin de una base de datos no es ms que especificar el nombre de la base de datos y designar el tamao y la ruta los archivos de la base de datos. Cuando una base de datos es creada, se realiza una duplicacin de la base de datos model. Cualquier opcin o arreglo o ajuste a model ser reflejado en la nueva base de datos.

Nota: Se debe respaldar la base de datos master cada vez que se cree, modifique o elimine una base de datos. Sintaxis: CREATE DATABASE NombreBasedeDatos [ON {PRIMARY](NAME=NombreArchivoLogico, FILENAME='os_file_name' [,SIZE = tamao] [,MAXSIZE={tamaoMax|UNLIMITED}] [,FILEGROWTH=Incrementodecrecimiento] }[,...n] ] [LOG ON {(NAME=NombreArchivoLog, FILENAME= 'NombArchivo_os', [,SIZE=tamao [,MAXSIZE={TamMax|UNLIMITED}] [,FILEGROWTH=Incrementodecrecimiento]) } [,...n] ] [COLLATE nombredeintercalacion] 26

Crear y manejar Bases de datos

Cuando se crea una base de datos, se pueden utilizar los siguientes parmetros: PRIMARY: Especifica los archivos en el grupo de archivos primario. El grupo de archivos primario contiene todos las tablas de sistema de la base de datos. Si no se especifica PRIMARY, el primer archivo listado en la declaracin llega a ser el archivo primario. FILENAME: Especifica el nombre de la archivo del sistema de operacin y la ruta para el archivo. La ruta debe especificar una carpeta del servidor sobre el que SQL Server est instalado. SIZE: Especifica el tamao de datos o del archivo log. Se puede especificar en Mb, el mnimo es 512KB. El tamao para el archivo de datos primario debe ser por lo menos como el tamao del archivo primario de la base de datos model. MAXSIZE: Especifica el tamao mximo que el archivo podr crecer. Si no se especifica ningn valor entonces crecer hasta que el disco duro est lleno. FILEGROWTH: Especifica el valor de crecimiento que tendr el archivo y no puede exceder a MAXSIZE. Un valor de 0 indica sin crecimiento. El valor pude establecerse en MB o en porcentaje (%). Sin no se especifica por el valor por omisin es de 10% y el valor mnimo es de 64kb (una extensin). COLLATION: Especifica la intercalacin para la base de datos. Incluye reglas que gobiernan el uso de caracteres para cualquier lenguaje o alfabeto. Ejemplo: CREATE DATABASE Sample ON PRIMARY (NAME=SampleData, FILENAME='C:\MisBases\Data\Sample.mdf', SIZE= 10MB, MAXSIZE=15MB, FILEGROWTH=20% LOG ON (NAME=Sample.log, FILENAME='C:\MisBases\Data\Sample.ldf', SIZE=3MB, MAXSIZE=5MB, FILEGROWTH=1MB COLLATE SQL_Latin1_General_Cp1_CI_AS

27

Crear y manejar Bases de datos

Cmo trabaja el registro de transacciones

1. Los datos modificados son enviados por la aplicacin


Cach de buffer

Disco

2. Las pginas de datos se localizan en, o leyendo en, cach de bfer y modificados

Disco

4. Checkpoint escribe transaccin comprometida a la base de datos Fig. 2.1 Esquema de trabajo del registro de transacciones SQL Server registra cada transaccin en un registro de transacciones para mantener la consistencia de la base de datos y para ayudar en la recuperacin. El registro es un rea de almacenamiento que rastrea automticamente los cambios a una base de datos. SQL Server registra las modificaciones en el registro en el disco como las modificaciones ejecutadas, antes de ser escritos en la base de datos. El proceso del registro es como sigue: 1. Un modificacin es enviada por la aplicacin. 2. Cuando una modificacin es ejecutada, las pginas de los datos afectados son cargadas desde disco dentro del cach de buffer, con tal de que las pginas no estn ya en la reserva del bfer de una consulta previa. 3. Cada sentencia de modificacin de datos es grabada en el registro como se hace. El cambio es siempre grabado en el registro y escrito a disco antes que el cambio es hecho en la base de datos. Este tipo de registro es llamado un registro escribe-adelante (Write-ahead). 4. En una base peridica, el proceso de checkpoint escribe todas las transacciones completadas a la base de datos en el disco. Si el sistema falla, el proceso automtico de recuperacin utiliza el registro de transacciones para mover hacia adelante todas transacciones cometidas y enrollar o deshacer cualquier transaccin incompleta. Los marcadores de transacciones en el registro son usados durante la recuperacin automtica para determinar el inicio y fin de una transaccin. Una transaccin es considerada completa cuando un marcador BEGIN TRANSACTION tiene un marcador COMMIT TRANSACTION.

28

Crear y manejar Bases de datos

Establecer opciones de bases de datos

Despus de que se haya creado una base de datos, se pueden establecer opciones de bases de datos usando el Administrador Corporativo o la sentencia ALTER DATABASE. Se puede configurar varias opciones de la base de datos, pero slo se puede poner para una sola base de datos a la vez. Para afectar las opciones en toda base de datos nueva, cambiar la base de datos model. La siguiente tabla lista algunos de las ms usadas opciones: Categora Opciones Descripcin
Crea automticamente alguna estadstica perdida necesitada por una consulta para la optimizacin. El valor por omisin es ON Actualiza automticamente fuera de estadstica de fecha requerida por una consulta para la optimizacin. El valor por omisin es ON

Auto opciones AUTO_CREATE_STATISTICS

AUTO_UPDATE_STATISTiCS

Opciones de cursor

CURSOR_CLOSE_ON_COMMI Cierra automticamente cursores abiertos cuando T una transaccin est comprometida. CURSOR_DEFAULT_LOCAL | GLOBAL LOCAL limita el alcance de los cursores. Es local al lote, al procedimiento almacenado, o al tirgger en el que el cursor se cre. GLOBAL es el valor por omisin; el alcance del cursor es global a la coneccin. FULL proporciona recuperacin completa del fracaso de medios; es por defecto. BULK_LOGGED utiliza menos espacio del registro porque los registros son mnimos, pero tienen el riesgo ms grande de exposicin. SIMPLE recupera la base de datos slo al ltimo respaldo completo de la base de datos o el ltimo respaldo diferencial. Permite a SQL Server detectar las operaciones incompletas de E/S causadas por fracasos de poder o fallas de sistema de otros. Por defecto es ON. Permite al usuario controlar la base de datos predefinido. SQL Server 2000 por omisin es TO NULL. Cundo esta en ON, todas las comparaciones a un valor nulo evalan a NULO (unknow). En OFF, las comparaciones de valores de no-unicode a un valor nulo evalan a VERDADERO si ambos valores son NULO. Valor por omisin de ANSI_NULLS es OFF. Define una bases de datos como de slo lectura o devuelve las operaciones de lectura/escritura de base de datos.

Opciones de recuperacin

RECOVERY FULL |BULK_LOGGED|SIMPLE

TORN_PAGE_DETECTION

Opciones de SQL

ANSI_NULL_DEFAULT ANSI_NULL

Opciones de estado

READ_ONLY | READ_WRITE

29

Crear y manejar Bases de datos

Categora

Opciones
SINGLE_USER | RESTRICTED_USER | MULTI_USER

Descripcin
SINGLE_USER Permite a un usuario conectar a la vez a la base de datos. Todas las otras conexiones del usuario se rompen. RESTRICTED_USER Permite slo miembros del db_owner roles fijos de base de datos y dbcreator sysadmin roles fijos de servidor para conectarse a la base de datos. MULTI_USER Permite a todos los usuarios con los permisos apropiados conectarse a la base de datos. Es es el valor por omisin.

Recuperar informacin de bases de datos Se puede determinar las propiedades de una base de datos utilizando el DATABASEPROPERTYEX La siguiente tabla lista alguna de las propiedades
Collation IsAnsiNullDefault IsAnsiNullsEnabled IsAnsiPaddingEnabled IsAnsiWarningsEnabled IsArithmeticAbortEnabled IsAutoCreateStatistics IsAutoShrink IsAutoUpdateStatistics IsCloseCursorsOnCommitEnabled IsFulltextEnabled IsInStandBy IsNullConcat IsQuotedIdentifiersEnabled IsRecursiveTriggersEnabled Recovery Status Updateability UserAccess Version

La siguiente tabla muestra el sistema comnmente utilizado de los procedimientos almacenados que demuestran informacin acerca de bases de datos y parmetros de la base de datos.
Sistema de procedimientos almacenados sp_helpdb Descripcin Reporta en todas las bases de datos en un servidor. Proporciona de la base de datos el nombre, el tamao, el propietario, ID, la fecha de la creacin y opciones. Reporta sobre una base de datos especfica. Proporciona de una base de datos el nombre, propietario, tamao, la identificacin, la fecha de la creacin y opciones. Tambin lista archivos para datos y registro. Resume el espacio de almacenamiento que una base de datos u objeto de base de datos usa.

sp_helpdb nombreBD

sp_spaceused [nombreObjeto]

30

Crear y manejar Bases de datos

Creacin de grupos de archivo

2.2

BD Northwind

sysobject

sys...

Products ...

OrdHistYear1

C:\

D:\ OrdHist1.ndf OrdHist2.ndf

E:\

Northwind.mdf

Northwind.ldf

Grupo de Archivos Default

OrderHistoryGroup

Fig. 2.2 Grupo de archivos en Northwind El grupo de archivos es llamado colecciones de archivos. En este apartado se ver como SQL Server incluye un grupo de archivos por defecto y cmo se puede crear un grupo de archivos adicional utilizando cualquier sentencia CREATE DATABASE o ALTER DATABASE. Con el grupo de archivos, se puede localizar objetos especficos en un archivo especfico. En la figura que se muestra, el OrdHist1.ndf and OrdHist2.ndf estn puestos en discos separados para separar los archivos que estn consultados demasiado de aquellos que estn modificados mucho y reducir la conexin a la unidad de disco. El administrador del sistema tambin puede respaldar y restaurar archivos individuales o grupo de archivos en vez de respaldar o restaurar una base de datos entera. Al respaldar grupo de archivos o archivos es necesario una base de datos grande para tener una efectiva estrategia de respaldo o restauracin. Consideraciones cuando use grupo de archivos Utilizar grupo de archivos es una tcnica avanzada del diseo de la base de datos. Se debe entender la estructura de la base de datos, los datos, transacciones y consultas a fondo para determinar la mejor va para situar tablas e ndices en un grupo de archivos especfico. En mucho de los casos, usando las capacidades de RAID striping proporciona mucho la misma ganancia del desempeo que quizs logre utilizando grupo de archivos sin agregar la carga administrativa de definir y manejarlos.

31

Crear y manejar Bases de datos

Nota: El archivo de registro no parte de una grupo de archivos. El espacio del registro se maneja separadamente del espacio de datos. Tipos de grupos de archivos SQL Server ofrece 2 tipos: El grupo de archivos primario, el cual contiene las tablas del sistema en el archivo de datos primario. El grupo de archivos definidos por el usuario, el cual es cualquier grupo de archivos que son especificados utilizando la palabra clave FILEGROUP

Ejemplo ALTER DATABASE Northwind ADD FILEGROUP OrderHistoyGroup GO ALTER DATABASE Northwind ADD FILE ( NAME = 'OrderHistoyYear1', FILENAME = 'C:\MisDatos\Datos\OrdHist1.ndf', SIZE = 5MB), TO FILEGROUP OrderHistoyGroup GO Informacin acerca del grupo de archivos La informacin acerca del grupo de archivos est disponible usando las siguientes funciones: FILE_NAME, FILE_ID,FILE_PROPERTY,FILEGROUP_NAME,FILEGROUP_ID, FILEGROUP_PROPERTY. El sistema de procedimientos almacenados en la siguiente tabla tambin muestra informacin. Sistema de procedimientos Descripcin almacenados Sp_helpfile [[@filename=]'name'] Devuelve el nombre fsico y atributos de los archivos asociados a la actual base de datos. Utiliza este sistema de procedimientos almacenados para determinar los nombres de los archivos adjuntar,quitar al servidor. Devuelve los nombres y los atributos del archivo del grupo de archivos asociados con la base de datos actual.

sp_helpfilegroup [filegroup]

32

Crear y manejar Bases de datos

Manejo de base de datos


Manejar el crecimiento de archivos de datos y registro. Monitorear y ampliar un registro de transacciones. Reducir una base de datos o archivo. Suprimir una base de datos.

2.3

A medida del crecimiento o cambio de la base de datos, se puede expandir o reducir el tamao de sta automticamente o manualmente. Cuando ya no se necesita una base de datos, se puede borrar junto con los archivos asociados.

Manejar el crecimiento de los archivos de datos y del registro Usar Crecimiento de Archivo Automtico Ampliar Archivos de Base de Datos Agregar Archivos Secundarios de Base de Datos
ALTER DATABASE Sample MODIFY FILE ( NAME = 'Sample.log' , SIZE = 15MB) GO ALTER DATABASE Sample ADD FILE (NAME = Sampledata2, FILENAME = 'C:\MisDatos\Datos\Sample2.ndf', SIZE =15MB, MAXSIZE=20MB) GO

Cuando los archivos de datos crecen, o cuando la actividad de modificaciones incrementa, se puede necesitar agrandar el tamao de los datos o del registro. Se puede manejar el crecimiento de bases de datos usando el Administrador Corporativo de SQL Server o la sentencia ALTER DATABASE. Se debe estar en la base de datos master para poder utilizar esta sentencia. Se puede controlar el tamao de la base de datos :

Configurando la base de datos y los archivos de registro para el crecimiento automtico. Manualmente incrementar o decrementar el actual o mximo tamao de la base de datos existente y de los archivos de registro. Manualmente agregar una base de datos secundaria y archivos de registro.

33

Crear y manejar Bases de datos

Sintaxis: ALTER DATABASE nombreBD {ADD FILE <filespec>[,...n][ TOP FILEGROUP filegroup_name]} |ADD LOG FILE <filespec>[,...n] |REMOVE FILE logical_file_name [WITH DELETE] |ADD FILEGROUP filegroup_name |REMOVE FILEGROUP filegroup_name |MODIFY FILE <filespec> |MODIFY NAME = new_dbname |MODIFY FILEGROUP filegroup_name {filegroup_property|NAME=new_filegroup_name} |SET <optionspec>[,...n][WITH <temination>] COLLATE <collation_name> }

Monitorear y ampliar un registro de transacciones


Monitorear el registro. Monitorear situaciones que producen mucha actividad de registro. Ampliar el registro cuando es necesario.

Precaucin: Si el registro de transacciones se ejecuta sin espacio, SQL server no podr grabar las transacciones y no permitir cambios en la base de datos.

Monitorear el registro. Se puede monitorear el registro de transacciones con SQL Server Administrador Corporativo, la sentencia DBCC SQLPERF (LOGSPACE), o con Microsoft Windows 2000 System monitor. Contador de objetos Log Bytes Flushed/sec Log Flush/sec Log Flush Waits/sec Percent Log Used Log File(s) Size (KB) Log Cache Hit Ratio Despliega Nmero de bytes en el bfer de registro cuando el bfer est vaco. Nmero de vaciados del registro Nmero de compromisos que estn esperando un vaciado de registro. Porcentaje de espacio en el registro que est en uso El tamao cumulativo de todos los archivos del registro en la base de datos. Porcentaje de lectura del cach del registro que tuvo xito del cach del registro

34

Crear y manejar Bases de datos

Monitorear situaciones que producen extensa actividad de registro Algunas situaciones que producen actividad son:

Carga de informacin en una tabla que tiene ndices. SQL Server registra todos los insertados y cambios de ndices. Cuando carga tablas sin ndices, SQL Server registra solamente asignaciones de extendidas. Las transacciones que realizan muchas modificaciones (INSERT, UPDATE and DELETE) a una tabla en una sola transaccin. Tpicamente ocurre cuando la declaracin carece de una clusula de WHERE o cundo sta clusula es muy general, obteniendo una extensa cantidad de registros afectados. Agregando o modificando texto o imagen de datos en una tabla.

Ampliar el registro cuando es necesario Se puede ampliar el registro de transacciones usando SQL Server Administrador Corporativo o la sentencia ALTER DATABASE. Reducir una base de datos o archivo

Reducir una base de datos completa. Reducir un archivo de datos en la base de datos. Reducir una base de datos automticamente.

Cuando demasiado espacio es asignado o cundo los requisitos del espacio disminuyen, se puede reducir una base de datos completa o los archivos de datos especficos en una base de datos. Reducir una base de datos completa Se puede realizar utilizando el Administrador Corporativo o ejecutando la sentencia (DBCC) SHRINKDATABASE. Esto reduce el tamao de todos los archivos de datos en la base de datos. SQL Server reduce los archivos de registro usando un operacin de reduccin diferida y es as como si todo el registro existiera en una contigua reserva del registro. Los archivos de registro son reiniciados cuando el registro es truncado. DBCC SHRINKDATABASE (database_name[,target_percent][, {NOTRUNCATE | TRUNCATEONLY}]) La siguiente tabla describe las opciones de DBCC SHRINKDATABASE Opciones target_percent Descripcin Especifica el porcentaje deseado de espacio libre que deja en el archivo de la base de datos despus de que SQL Server ha reducido la base de datos. Causa que SQL Server retenga el espacio libertado del archivo en los archivos de la base de datos. El valor predefinido es liberar el espacio libertado del archivo al sistema operativo. 35

NOTRUNCATE

Crear y manejar Bases de datos

Opciones TRUNCATEONLY

Descripcin Causa que algn espacio no usado en los archivos de datos sea liberado al sistema operativo y se reduce el archivo al ltimo extendido asignado, reduciendo el tamao del archivo sin mover ningn dato. Ninguna tentativa se hace para trasladar las filas a pginas no asignadas SQL Server ignora target_percent cuando se utiliza esta opcin.

Ejemplo: Esto hace que reduzca el tamao de sample tal que el archivo tendr espacio libre del 25%. Es decir, si sample contiene 6MB de datos, el nuevo tamao de la base de datos ser de 8MB (6MB de datos, 2MB de espacio libre). DBCC SHRINKDATABASE (Sample, 25)

Nota: SQL Server no reduce un archivo a un tamao mas pequeo que la cantidad de espacio que ocupan los datos. Tambin, no reduce un archivo mas all del tamao especificado en el parmetro SIZE de la sentencia CREATE DATABASE.

Reducir un archivo de datos en la base de datos

Sintaxis: DBCC SHRINKFILE ({file_name|file_id}[,target_size] [{EMPTYFILE|NOTRUNCATE|TRUNCATEONLY}])

Ejemplo: DBCC SHRINKFILE (Sample, 10) Reducir una base de datos automticamente Autoreducir no est activo por defecto. Estableciendo este valora 'verdadero', se puede recuperar espacio sin usar automticamente. Se puede realizar esta operacin desde el administrador Corporativo. Considerar los siguientes factores y directrices cuando se reduzca:

La base de datos resultante debe ser de mayor tamao que la base de datos model o los datos existentes en la BD o el archivo de datos. Antes de que reduzca una base de datos o archivo de datos, se debe respaldar al igual que master. DBCC SHRINKDATABASE y SHRINKFILE realiza algunas acciones en una base diferida, as que no se puede ver la base de datos ni el tamao del archivo reducido inmediatamente. DBCC SHRINKFILE puede reducir el tamao de una base de datos a una ms pequea que el tamao especificado cuando la base de datos fue creada o alterada, pero no ms pequea que el tamao que ocupan los datos. 36

Crear y manejar Bases de datos

Borrar una base de datos


Mtodos para borrar una base de datos. Restricciones para borrar una base de datos.

Cuando ya no se necesite una base de datos es posible eliminarla. Al borrar una base de datos se eliminan todos los archivos contenedores del disco.

Mtodos para borrar una base de datos Sintaxis: DROP DATABASE nombre_BD [,...n]

ejemplo: Borrar las bases de datos Northwind y pub DROP DATABASE Northwind,pub Cuando se desee borrar una base de datos tmse en cuenta lo siguiente:

Con el Administrador Corporativo, slo se puede borrar una sola base de datos a la vez. Con Transact-SQL se puede borrar varias bases de datos a la vez. Despus de borrar una base de datos, cada ID login que utiliz esa base de datos particular como su base de datos predefinida no tendr una base de datos predefinida.

Nota: Respaldar master despus de borrar una base de datos. Restricciones para borrar una base de datos

Una base de datos que est en un proceso de de restauracin. Una base de datos que est abierta por un usuario en modo lectura o escritura. Una base de datos que est publicando alguna de sus tablas como parte de replicacin SQL Server. Una base de datos de sistema.

37

Crear y manejar Bases de datos

Introduccin a las estructuras de datos

2.4

Como son almacenados los datos Tipos de pginas y extensiones Pginas que manejan espacio de archivo Pginas que rastrean tablas e ndices

Cmo son almacenados los datos Database Datos (archivo)


.mdf o .ndf

Registro (archivo) .mdf o .ndf


Extendido (8 pags contiguas de 8kb)

Tablas, ndices

Datos

pgina(8kb)

Tamao max de fila=8060 bytes


1 pgina = 8060 bytes = 8 KB 1 extent = 8 pginas = 64 KB 1 MB = 16 extent = 128 pginas

Fig. 2.3 Forma en que se almacenan los datos en SQL Server 2000 Cuando se crea una base de datos, es importante entender cmo SQL Server almacena los datos, as poder calcular y especificar una cantidad de espacio para asignar para la base de datos. Considerar lo siguiente acerca del almacenamiento de datos:

Cuando se crea una base de datos, una copia de model, que contiene las tablas de sistema, es copiada a la base de datos. El mnimo tamao de la base de datos debe ser igual o mayor que el tamao de la base de datos model. SQL Server almacena, lee y escribe datos en bloques de 8kb de espacio contiguo de disco llamados pginas. Esto significa que una base de datos puede almacenar 128 pginas por megabyte. Las filas no pueden abarcar pginas. De este modo, la cantidad mxima de datos en una sola fila, quitando el espacio requerido para una fila de arriba es de 8060 bytes. Todas las pginas estn almacenadas en extendido. Un extendido es 8 pginas contiguas o 64 kb. Por lo tanto, una base de datos tiene 16 extendidos por MB.

38

Crear y manejar Bases de datos

EL registro de transacciones contiene toda informacin necesaria para recuperar de una base de datos en un fallo de sistema. Por defecto, el tamao del registro de transacciones es 25% del tamao de los archivos de datos.

Tipos de pginas y extensiones Tipos de pginas Pginas que rastrean asignacin de espacio. Pginas que contienen datos e ndices de usuario. Tipos de extensiones

Mezclado

Uniforme

Libre

Fig. 2.4 Los tipos de pginas y extensiones que utiliza SQL Server 2000 Tipos de pginas SQL Server utiliza muchos tipos de pginas: algunas rastrean espacio para asignar, y algunos contienen los datos de usuario e ndice. Las pginas que rastrean contienen informacin densamente empaquetada. Esto permite a SQL Server eficientemene guardarlos en memoria para fcil rastreo. Tipos de extendidos SQL Server utiliza 2 tipos de extensiones

Las extensiones que contienen pginas de 2 o ms objetos son llamados extensiones mezcladas. Cada tabla comienza como una extensin mezclada. Se utiliza extensin mezclada principalmente para pginas que rastrean espacio y contienen objetos pequeos. Las extensiones que tienen todas las 8 pginas asignadas a un slo objeto son llamadas extensiones uniformes. Son utilizadas cuando las tablas o ndices necesitan ms que 64 kb de espacio.

39

Crear y manejar Bases de datos

Paginas que manejan espacio de archivo

3 4

Numero de pgina

0 Cabecera de archivo 1 PFS 2 GAM 3 SGAM

Fig. 2.5 Pgina con espacio de archivo La primera extensin de cada archivo es una extensin mezclada que contiene un archivo de cabecera de pgina seguida por tres pginas de asignacin. SQL Server asigna esta extensin mezclada cuando se crea el archivo primario de datos y se utiliza estas pginas internamente. Archivo de cabecera de pgina Contiene los atributos del archivo, tales como el nombre de la base de datos que posee el archivo, su grupo de archivos, tamao mnimo y el incremento de crecimiento. Este es la primera pgina en cada archivo (Pagina 0). Pgina PFS (Siglas en ingls) La pgina Pgina de Espacio Libre(PEL-Siglas en espaol) es una pgina de asignacin que contiene informacin acerca del espacio libre disponible en las pginas en un archivo. La pgina 1 de cada archivo es una pgina PEL. SQL Server agrega otras pginas PEL como se necesiten. Cada pgina PEL puede rastrear 8,000 pginas contiguas, lo cual es cerca de 64MB de datos. Para cada pgina, la pgina PEL contiene un byte que rastrea:

Si la pgina se ha asignado Si la pgina est sobre una extensin mezclado o uniforme. Una aproximacin de cunto espacio est disponible en la pgina.

Pginas GAM y SGAM SQL Server utiliza un Mapa Asignacin Global (MAG-Siglas en espaol) y un Mapa de Asignacin Global Compartido (MAGC-Siglas en espaol) para determinar la ubicacin de extensiones libres o extensiones mezcladas con pginas libre.

40

Crear y manejar Bases de datos

Pginas MAG La pgina MAG es una pgina de asignacin que contiene informacin acerca de las extensiones asignadas. La pgina 2 de cada archivo es una pgina MAG. SQL Server agrega pginas MAG adicionales como se necesiten. Pginas MAGC La pgina MAGC es una pgina de asignacin que contiene informacin acerca de las extensiones mezcladas asignadas. La pgina 3 de cada archivo es una pgina MAGC. SQL Server agrega pginas MAGC adicionales como se necesiten. Las pginas MAGC rastrean extensiones mezcladas que actualmente tienen por lo menos una pgina sin uso. Cubren tambin 63,904 extensiones. Un bit puesto en 0 indica que una extensin es cualquier extensin uniforme o una extensin mezclada sin ninguna pgina libre. Un bit puesto en 1 indica una extensin con una o ms pginas libres.

Enhorabuena! El participante ha aprendido cmo se definen Bases de datos en SQL Server 2000, cmo trabaja el registro de transacciones y acerca de la creacin de grupos de archivos. Adems, ahora sabe el manejo de Bases de datos y podra administrar el crecimiento de sus bases de datos.

41

Crear y manejar Bases de datos

Prctica

2.5

Propsito Despus de completar estas prcticas, el participante debe ser capaz de: Crear una base de datos. Administrar el crecimiento de la base de datos. Cambiar las opciones de la base de datos para controlar la frecuencia con que el registro de transacciones es limpiado. Configuracin para la prctica Utilizar los archivos Script localizados en c:\Moc\2073A\Labfiles\L03

Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin usuario Contrasea Tiempo estimado: 35 min. De manera personal y utilizando nicamente los datos requeridos del manual del participante realizar lo siguiente: 1. Crear una base de datos llamada ClassNorthWind 2. Manejar el crecimiento del archivo de registro transacciones de ClassNorthWind. 3. Establecer el modelo de recuperacin de base de datos. Valor Administrador password

42

Crear tipos de dato y tablas

3. Crear tipos de Datos y tablas

Contenido Creacin de tipos de datos Creacin de tablas Generar valores de columnas Generar scripts Prctica 3.1 3.2 3.3 3.4 3.5

En este captulo se describe como crear tipos de datos y tablas y generar scripts TransactSQL que contienen sentencias para crear una base de datos y sus objetos. Al concluir este captulo el participante ser capaz de: Crear y borrar tipos de datos definidos por el usuario. Crear y borrar tablas en SQL Server 2000. Generar valores de columnas en tablas de SQL Server 2000. Generar scripts en Transact-SQL.

43

Crear tipos de dato y tablas

Creacin de tipos de datos

3.1

Tipos de datos provistos por SQL Server 2000. Crear y borrar tipos de datos definidos por el usuario. Reglas para especificar tipos de datos. Una parte muy importante en la creacin de tablas son los tipos de datos que sern utilizados. En este apartado se ver los tipos de datos por defecto de SQL Server y cmo crear los propios. Tipos de datos provistos por SQL Server 2000. Antes de crear una tabla es necesario definir los tipos de datos para una tabla. Los tipos de datos especifican el tipo de informacin (texto, nmeros, fechas, etc) que una columna puede contener, as de cmo los datos son almacenados. Microsoft SQL Server 2000 provee de varios tipos de datos adems que permite que el usuario defina sus propios tipos de datos. La siguiente tabla muestra los tipos de datos que se proveen: Tipo de datos Interger Tipos de datos que provee SQL Server Int bigint smallint,tinyint decimal[(p[,s])] numeric[(p[,s])] float[(n)] real Money Smallmoney Datetime,smalltime Char[(n)] varchar[(n)] text Unicode character Binary Image nchar[(n)] nvar[(n)] ntext binary[(n)] varbinary[(n)] Image Compatibilidad ANSI Integer dec Double precision float[(n)] para n=8,15 float[(n)] para n=1-17 Character[(n)] char VARING[(n)] character VARING[(n)] No de bytes 4 8 2,1 2 a 17 8 4 8,4 8,4 0-8000

Exact numeric Aproximate numeric Monetary Date and time Character

0-2Gb 0-8000 (4000 caracteres) 0-2 Gb 0-8000 16


44

binary VARYNG[(n)] -

Crear tipos de dato y tablas

Tipo de datos Global identifier Special

Tipos de datos que provee SQL Server Uniqueidentifier Bit,cursor, uniqueidentifier timestamp sysname table sql_variant

Compatibilidad ANSI -

No de bytes

16 rowversion 1, 0-8 8 256 0-8016

Nota: Es mejor evitar los tipos de datos float y real al hacer referencia de columnas en la clusula WHERE.

Crear y borrar tipos de datos definidos por el usuario1. Los tipos de datos definidos por el usuario se basan en los tipos de datos del sistema de Microsoft SQL Server 2000. Se pueden utilizar cuando varias tablas deben almacenar el mismo tipo de datos en una columna y desea asegurarse de que dichas columnas tienen exactamente el mismo tipo de datos, longitud y condicin que la aceptacin de valores NULL. Por ejemplo, es posible crear un tipo de datos definido por el usuario con el nombre postal_code a partir del tipo de datos char. Las variables de tabla no admiten los tipos de datos definidos por el usuario. Cuando cree un tipo de datos definido por el usuario, deber suministrar estos tres parmetros: Nombre Tipo de datos del sistema en el que se basa el nuevo tipo de datos Aceptacin de valores NULL (si el tipo de datos permite valores NULL) Cuando no est definida explcitamente la aceptacin de valores NULL, se asignar en funcin de la configuracin de los valores NULL ANSI predeterminada para la base de datos o para la conexin.

Nota: Si se crea un tipo de datos definido por el usuario en la base de datos model, existir en todas las nuevas bases de datos definidas por el usuario. Sin embargo, si el tipo de datos se crea en una base de datos definida por el usuario, slo existir en esa base de datos.

Manual en pantalla de Microsoft SQL Server 2000. 45

Crear tipos de dato y tablas

Creacin de tipo de datos definidos por el usuario. sp_addtype del sistema almacena los procedimientos de creacin de este tipo de datos. Sintaxis: sp_addtype [ [ @phystype = [ , [ @nulltype [ , [ @owner = ] 'owner_name' ] ] ejemplo: @typename ] = ] = ] type, system_data_type 'null_type' ]

EXEC sp_addtype city, 'invarchar(15)',NULL EXEC sp_addtype region, 'nvarchar(15)', NULL EXEC sp_addtype country,'nvarchar(15)',NULL

Borrar un tipo de datos definido por el usuario. sp_drop del sistema almacena los procedimientos para borrar este tipo de datos, tomado desde systype. Sintaxis: sp_droptype [ @typename = ] 'type' ejemplo: EXEC sp_droptype city

Nota: Un tipo de datos definido por el usuario no puede quitarse si se utiliza en una definicin de tabla, o si una regla o valor predeterminado est enlazado a l.

Reglas para especificar tipos de datos. Si el largo de la columna varia, utilizar un tipo de dato variable. Utilizar tinyint adecuadamente. Para tipos de datos numricos, use comnmente decimal. Si el almacenamiento es mayor que 8000 bytes, utilizar text o image; si es menor que 8000 bytes utilizar binary o char. Cuanto sea posible utilizar varchar ya que es ms funcional que text o image. Utilizar money para almacenar datos de moneda. No utilizar float o real como llaves primarias.

46

Crear tipos de dato y tablas

Creacin de tablas

3.2

Crear y borrar tablas Agregar y quitar una columna

Despus de que se haya definido los tipos de datos para una tabla es posible crear tablas, agregar y quitar columnas y generar valores para columnas. Crear y borrar tablas Cuando se cree una tabla, se debe especificar el nombre de la tabla, de columna y el tipo de datos de la columna. Los nombres de columna deben de ser nicos, aunque se puede utilizar el mismo nombre en diferentes tablas. Considerar los siguientes factores cuando se desee crear una tabla se puede tener: hasta 2 millones de tablas por base de datos. 1,024 columnas por tabla. 8060 byte por fila (este valor aproximado no aplica para image,text y ntext) Se puede especificar en la definicin de tabla si se permite valores nulos para cada columna. Si no se especifica, SQL Server suministra NULL por defecto. Ejemplo: En este ejemplo se establece sp_tableoption en ON de text in row, para especificar que pueden ser almacenados datos arriba de 1000 caracteres text, ntext o image. Sintaxis parcial : CREATE TABLE Nombre column_name data_type[COLLATE <nombre_colacion>] [NULL|NOT NULL] | nobre_columna AS expresion de columna calculada [,...n] Ejemplo: El siguiente ejemplo crea una tabla dbo.Categorias, especificando las columnas de la tabla, un tipo de datos para cada columna y si las columnas permiten valores nulos. CREATE TABLE dbo.Categorias (IDCategoria int IDENTITY (1,1) NOT NULL, NombreCategoria nvarchar(15) NOT NULL, Descripcion ntext NOT NULL, Picture image NULL)

Nota: Para ver las propiedades dela tabla haga clic con el botn derecho del mouse en el administrador coorporativo o con sp_help desde el analizador de consultas.

47

Crear tipos de dato y tablas

Una columna calculada es una columna virtual que no est fsicamente almacenada en la tabla. SQL Server utiliza una frmula que se crea para calcular este valor usando otras columnas en la tabla de ejemplo. Usando una columna calculada en una consulta se puede simplificar la sintaxis de la consulta. Agregar y quitar una columna Borrar una tabla. Antes de borrar cualquier tabla es necesario quitar dependencias entre otras tablas y otros objetos. sp_depends almacena las dependencias existentes. Sintaxis : DROP TABLE nombre_tabla [,...n] ejemplo: DROP TABLE dbo.Categorias Agregar y quitar una columna . sintaxis : ALTER TABLE nombre_tabla {|[ALTER COLUMN nombre_columna}] |[ ADD {<definicindecolumna>::= tipodedatos_columna { [NULL|NOT NULL] } |DROP COLUMN nombre_columna}[,...n] Agregar una columna La informacin que se especifica cuando se agrega una columna es la misma que cuando se crea una tabla. Ejemplo: ALTER TABLE Categorias ADD comision money null Quitar una columna No se puede recuperar cuando se quita una columna. Por tanto, hay que asegurarse que se desea quitar una columna antes de hacerlo. Ejemplo: ALTER TABLE categorias DROP COLUMN comision

Nota: Todos los ndices y restricciones que estn basados en una columna deben ser eliminados antes de quitar la columna.

48

Crear tipos de dato y tablas

Generar valores para una columna


Usar la propiedad identity Usar la funcin NEWID y el tipo de dato uniqueidentifier Usar la propiedad Identity

3.3

Crea una columna de identidad en una tabla. Esta propiedad se utiliza con las instrucciones CREATE TABLE y ALTER TABLE de Transact-SQL. Una columna de identidad es con frecuencia utilizada para valores de llaves primarias. Sintaxis parcial CREATE TABLE nombre_tabla (tipodedatos_columna [ IDENTITY [(seed, increment)]] NOT NULL ) Al utilizar la propiedad Identity considerara lo siguiente: 5. Slo una columna de identidad es permitida en una tabla. 6. Debe ser utilizada con los tipos de datos integer, numeric o decimal. Los tipos numeric y decimal pueden ser especificados con una escala de 0. 7. No pueden ser actualizadas. 8. No se permiten valores NULL. 9. Se puede utilizar la palabra reservada IDENTITYCOL en vez del nombre de la columna en una consulta. Esto permite hacer referencia a una columna que tenga la propiedad Identity sin tener que saber el nombre de la columna.

Se puede obtener informacin de la propiedad indetity de varias formas: A travs de IDENT_SEED(Retorna el valor de inicializacin) y IDENT_INCR(retorna el valor del incremento A travs de la variable global @@identity Con SCOPE_IDENTITY se obtiene el ltimo valor insertado de Identity. Con IDENT_CURRENT que retorna el ltimo valor generado por una tabla especfica en cualquier sesin o cualquier alcance. Tambin se puede manejar la propiedad identity:

Se pueden permitir valores explcitos que sern insertados en la columna de identidad de una tabla poniendo la opcin IDENTITY_INSERT en ON. Cuando se utilice INSERT se insertar un valor. Para comprobar el valor de identidad actual de la tabla especificada y, si fuera necesario, corregir el valor de identidad, se puede usar DBCC CHECKIDENTITY.

49

Crear tipos de dato y tablas

Ejemplo: En este ejemplo se crea una nueva tabla con la propiedad IDENTITY para un nmero de identificacin de incremento automtico. CREATE TABLE NuevaTabla (IDNum int IDENTITY(1,1(, Fnombre varchar (20), minit char(1), lnombre varchar(30)) Usar la funcin NEWID y el tipo de dato uniqueidentifier NEWID y uniqueidentifier son dos elementos que son usados juntos. Utilcese cuando los datos estn intercaladas con muchas otras tablas o cuando todos los registros deban tener mantenimiento. Ejemplo: En este ejemplo se crea una tabla que contendr un valor nico para cada registro nuevo se agregue en la columna IDCliente. CREATE TABLE Cliente ( IDCliente uniqueidentifier NOT NULL DEFAULT NEWID(), NombreCte char(30) NOT NULL)

50

Crear tipos de dato y tablas

Generar scripts

3.4

Generar esquema como un script Transact-SQL. Qu generar?

Cuando se crean objetos en una base de datos es conveniente grabar todos esos objetos en un archivo script. Generar esquema como un script Transact-SQL Se puede utilizar el Administrador corporativo para documentar la estructura de una base de datos (un esquema) generando un archivo script de Transact-SQL. Este contiene descripciones de las sentencias que sern utilizadas al crear una base de datos y sus objetos. El esquema generado como un script Transact-SQL puede ser usado:

Mantener un script de respaldo que permita a un usuario recrear a todos los usuarios, grupos, login y permisos. Crear o actualizar un script del desarrollo de una base de datos . Crear una prueba o entorno de desarrollo desde un esquema existente. Capacitar empleados contratados.

Qu generar?

Una base de datos completa dentro de un slo archivo script. El esquema nicamente-tabla para una, alguna o todas las tablas en una base de datos en un o mas archivos script. El esquema de tabla e ndice en un archivo script, procedimientos almacenados en otro archivo script y valores por defecto y reglas en otro archivo script.

Enhorabuena! Ya ha aprendido a utilizar los tipos de datos de SQL Server 2000, crear tipos definidos por el usuario y las reglas para su uso. Adems, vio como se crean y borran tablas en SQL Server 2000 y cmo se agregan columnas. As tambin, cmo generar un esquema como un script Transact-SQL.

51

Crear tipos de dato y tablas

Prctica

3.5

Propsito Despus de completar estas prcticas, el participante debe ser capaz de: Crear tipos de datos definidos por el usuario. Crear tablas. Agregar y quitar columnas. Generar scripts Transact-SQL. Configuracin para la prctica Para completar sta prctica, el participante deber: Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\Restore04.cmd Este archivo de comandos restaura la base de datos ClassNorthWind al estado requerido para esta prctica. Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 40 min. De manera personal, sin utilizar el manual del participante y en el orden de aparicin realice las siguientes prcticas: 1. 2. 3. 4. 5. Crear tipos de datos definidos por el usuario. Crear tablas en la base de datos ClassNorthWind. Agregar y quitar columnas. Generar scripts Transact-SQL. Cargar la base de datos ClassNorthWindcon datos.

52

Implementar integridad de datos

4. Implementar integridad de datos

Contenido Tipos de integridad de datos Exigir integridad de datos Definir restricciones Tipos de restricciones Deshabilitar restricciones Usar Defaults y Reglas Decidir qu mtodo usar para exigir integridad de datos Prctica 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8

En este captulo se describe como crear restricciones, defaults y reglas para una base de datos y los mtodos a aplicar para exigir la integridad de datos. Se comienza con una pequea introduccin al concepto de integridad de datos; incluye los mtodos para exigir integridad de datos. Posteriormente, la implementar y deshabilitar restricciones cuando sea necesario. Al concluir este captulo el participante ser capaz de: Describir los tipos de integridad de datos. Describir los mtodos para exigir integridad de datos Determinar que restricciones hay al crear restricciones. Definir y utilizar las restricciones DEFAULT, CHECK, PRIMARY KEY, UNIQUE y FOREING KEY. Deshabilitar verificacin de restricciones. Describir y utilizar defaults y reglas. Determinar que mtodo de integridad de datos exigir.

53

Implementar integridad de datos

Tipos de integridad de datos

4.1

Integridad de dominio (Columnas) Integridad de entidad (Filas)

Integridad referencial (entre tablas)

Un paso importante en la planeacin de base de datos es elegir el mejor camino para exigir la integridad de los datos. La integridad de los datos se refiere a la consistencia y exactitud de los datos que son almacenados en la base de datos. Los tipos de integridad de datos son: Integridad de dominio Especifica valores vlidos para una columna y determina si son permitidos los valores NULL. Integridad de entidad Requiere que todas las filas en la tabla tengan un identificador nico, conocido como llave primaria. La integridad de entidad define una fila como entidad nica para una tabla determinada. La integridad de entidad fuerza la integridad de la columna o columnas de los identificadores o la clave principal de una tabla (mediante ndices, restricciones UNIQUE, restricciones PRIMARY KEY o propiedades IDENTITY). Integridad referencial La integridad referencial protege las relaciones definidas entre las tablas cuando se crean o se eliminan registros. En Microsoft SQL Server, 2000 la integridad referencial se basa en las relaciones entre claves externas y claves principales o entre claves externas y claves exclusivas (mediante restricciones FOREIGN KEY, restricciones CHECK). La integridad referencial garantiza que los valores clave sean coherentes en las distintas tablas. Para conseguir esa coherencia, es preciso que no haya referencias a valores inexistentes y que, si cambia el valor de una clave, todas las referencias a ella se cambien en consecuencia en toda la base de datos. Cuando se fuerza la integridad referencial, SQL Server impide a los usuarios: Agregar registros a una tabla relacionada si no hay ningn registro asociado en la tabla principal. Cambiar valores en una tabla principal de manera que queden registros hurfanos en una tabla relacionada. Eliminar registros de una tabla principal cuando hay registros relacionados coincidentes.
54

Implementar integridad de datos

Exigir integridad de datos

4.2

Integridad de datos declarativa Integridad de datos procedural

Se puede exigir integridad de datos a travs de dos mtodos: integridad de datos declarativa y la procedural. Integridad de datos declarativa Con una integridad declarativa, se define el criterio que los datos deben satisfacer como parte de una definicin de datos y SQL Server 2000 automticamente asegura que los datos se ajusten a ese criterio. El mtodo preferido de aplicar la integridad bsica de datos utiliza la integridad declarativa. Considerar los siguientes factores acerca de este mtodo: La integridad declarativa es declarada como parte de una definicin de base de datos, utilizando restricciones declarativas que se definen directamente en tablas y columnas. Aplicar la integridad declarativa utilizando restricciones, defaults y reglas. Integridad de datos procedural Con esto, se escriben scripts que definen tanto el criterio que los datos deben satisfacer y el criterio de exigencia. Se debera limitar el uso de la integridad procedural a lgica complicada de negocios y excepciones. Por ejemplo, utilizar la integridad procedural cuando se desee tener una borrado en cascada. Considerar los siguientes factores al aplicar la integridad procedural: Pude ser implementada en el cliente o el servidor usando otros lenguajes de programacin y otras herramientas. Implementar la integridad procedural usando desencadenantes (triggers) y procedimientos almacenados.

55

Implementar integridad de datos

Definir restricciones

4.3

Determinar que tipo de restriccin utilizar. Crear restricciones. Consideraciones para utilizar restricciones

Las restricciones son lo mtodos preferidos para exigir la integridad de datos. En esta seccin se discutir cmo determinar el tipo de restriccin a utilizar, que tipo de integridad de datos que cada tipo de restriccin exigir y cmo definir restricciones.

Determinar que tipo de restriccin utilizar Las restricciones son un mtodo de exigir integridad de datos ANSI-estndar. Cada tipo de integridad de datos de dominio, entidad y referencial es exigido con tipos separados de restricciones. Las restricciones aseguran que valores vlidos sean entrados a columnas y que se mantengan las relaciones entre tablas. La tabla siguiente muestra los diferentes tipos de restricciones. Tipo de integridad Dominio Tipo de restriccin DEFAULT Descripcin Especifica el valor que ser suministrado a la columna cuando no se especifique un valor en la sentencia INSERT. Especifica los valores que son aceptados en una columna. Especifica los valores que son aceptados al actualizar, basados en los valores dentro de una columna de otra tabla. Identificadores exclusivamente para cada fila asegura que los usuarios no escriban valores duplicados y que un ndice sea creado para aumentar el rendimiento. Valores no permitidos: NULL Previene la duplicacin de llaves alternas(no primarias) y asegura que un ndice sea creado para aumentar el rendimiento. Valores no permitidos: NULL. Define una columna o combinaciones de columnas con valores que igualan a la llave primaria de la misma tabla o de otra. Especifica los valores que son aceptados en una columna basada en valores en otra columna en la misma tabla.

CHECK REFERENCIAL

Entidad

PRIMARY KEY

Unique

Referencial FOREIGN KEY

CHECK

56

Implementar integridad de datos

Crear restricciones Para crear restricciones se puede utilizar CREATE TABLE o ALTER TABLE. Adems, se puede agregar restricciones a una tabla utilizando datos existentes y ponindolas en una o ms columnas: Si la restriccin es aplicada a una sla columna entonces es llamada restriccin a nivel columna. Si la restriccin hace referencia a mltiples columnas entonces es llamada restriccin a nivel tabla, incluso si no hace referencia a todas las columnas en la tabla. Utilizar CREATE O ALTER TABLE sintaxis parcial: CREATE TABLE Nombre_tabla ({<definicion_columna> | <restriccin_Tabla>}[,...n]) <definicion_columna>::= {nombretipodato_columna} [[ DEFAULT expresion_restriccin] [<restriccion_columna>][,...n] ] < column_constraint > ::= [ CONSTRAINT constraint_name ] { [ NULL | NOT NULL ] | [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] [WITH FILLFACTOR = fillfactor] [ON {filegroup | DEFAULT} ] ] ] | [ [ FOREIGN KEY ] REFERENCES ref_table [ ( ref_column ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] [ NOT FOR REPLICATION ] ] | CHECK [ NOT FOR REPLICATION ] ( logical_expression ) } < table_constraint > ::= [ CONSTRAINT constraint_name ] { [ { PRIMARY KEY | UNIQUE } [ CLUSTERED | NONCLUSTERED ] { ( column [ ASC | DESC ] [ ,...n ] ) } [WITH FILLFACTOR = fillfactor] [ ON { filegroup | DEFAULT } ] ] | FOREIGN KEY [ ( column [ ,...n ] ) ] REFERENCES ref_table [ ( ref_column [ ,...n ] ) ] [ ON DELETE { CASCADE | NO ACTION } ] [ ON UPDATE { CASCADE | NO ACTION } ] [ NOT FOR REPLICATION ] | CHECK [ NOT FOR REPLICATION ] ( search_conditions ) }
57

Implementar integridad de datos

Ejemplo: Es ejemplo crea la tabla Productos, define columnas y define las restricciones tanto en la tabla como en la columna. USE NorthWind CREATE TABLE dbo.Productos ( IDProducto int IDENTITY(1,1) NOT NULL, NombreProd nvarchar(40) NOT NULL, IDSuplente int NULL, IDCategoria int NULL, Preciounitario money NULL CONSTRAINT DB_Productos_PrecioUnitario DEFAULT(0), CantStock smallint NULL CONSTRAINT DF_Productos_CantStoc DEFAULT(0), Ordenes smallint NULL CONSTRAINT DF_Productos_Ordenes DEFAULT(0), NivelOrden smallint NULL CONSTRAINT DF_Prodcutos_NivelOrden DEFAULT(0), Descontinuado bit NOT NULL CONSTRAINT DF_Productos_Descontinuado DEFAULT(0), CONSTRAINT PK_Productos PRIMARY KEY CLUSTERED(IDProducto), CONSTRAINT FK_Productos_Categorias FOREIGN KEY (IDCategoria) REFERENCES dbo.Categorias (IDCategoria) ON UPTDATE CASCADE, CONSTRAINT FK_Suplentes FOREIGN KEY (IDSuplente) REFERENCES dbo.Suplentes (IDSuplente) ON DELETE CASCADE, CONSTRAINT CK_Productos_Preciounitario CHECK (Preciounitario>=0), CONSTRAINT CK_NivelOrden CHECK(NivelOrden>=0), CONSTRAINT CK_CantStock CHECK(CantStock>=0), ) GO

Consideraciones para utilizar restricciones Considerar los siguientes factores cuando se implementen o modifiquen restricciones: Se puede crear, modificar y borrar restricciones sin tener que borrar o recrear una tabla. Se debe construir una lgica de verificacin de errores en las aplicaciones y transacciones para probar si una restriccin ha tenido violaciones. SQL Server verifica datos existentes cuando se agrega una restriccin en una tabla. Se debera especificar nombres de restricciones cuando se crean, ya que SQL Server suministra nombres complicados. Los nombres deben ser nicos en la base de datos y seguir las reglas de indentificadores de SQL Server. Para ayuda con restricciones, ejecute sp_helpconstraint o sp_help, o una consulta de vistas de esquema, tal como check_constraints, referencial_constraints y table_constraints. En las tablas siguientes se encuentran almacenadas las definiciones de restricciones: syscomments, sysreferences y sysconstraints.

58

Implementar integridad de datos

Tipos de restricciones
DEFAULT CHECK PRIMARY KEY UNIQUE FOREIGN KEY Integridad referencial en cascada.

4.4

En esta seccin se describe los diferentes tipos de restricciones, la sintaxis, ejemplos y las consideraciones para cada restriccin. DEFAULT Sintaxis parcial: [CONSTRAINT nombre_restriccion] DEFAULT expresion_restriccion

Ejemplo: En este ejemplo se agrega una restriccion con DEFAULT que inserta un valor 'desconocido' en la tabla Clientes si el nombre del cliente no es suministrado. USE NorthWind ALTER TABLE dbo.Clientes ADD CONSTRAINT DF_Nombrecontacto DEFAULT 'Desconocido' FOR Nombrecontacto Consideraciones: Verifica datos existentes en la tabla. Aplica nicamente con INSERT. Solamente una restriccion DEFAULT se puede definir por columna. No se puede poner en columnas con la propiedad Identity o en columnas con el tipo de dato rowversion. Permite otros valores de sistema- USER,CURRENT_USER,SESSION_USER,SYSTEM_USER o CURRENT_TIMESTAMP . Estos valores son tiles cuando usuarios han insertado datos en alguna tabla.

CHECK Una restriccin CHECK restringe los datos que los usuarios puedan introducir dentro de una columna en especfico para valores especficos. Las restrincciones CHECK son similares a la clusula WHERE en que se especifica las condiciones dentro del cual los datos sern aceptados. Sintaxis parcial: [CONSTRAINT nombre_restriccin] CHECK (expresionlogica)

Ejemplo: En este ejemplo se agrega una restriccin CHECK para asegurar que una fecha de cumpleaos est dentro de un rango aceptable.
59

Implementar integridad de datos

USE NorthWind ALTER TABLE dbo.Empleados ADD CONSTRAINT CK_Fecha_Cumple CHECK (Fecha_Cumple>'01-01-1900' AND Fecha_Cumple>getdate()) Consideraciones: Verifica los datos cada vez que se ejecute un INSERT o un UPDATE. Se puede hacer referencias sobre otras columnas en la misma tabla. No se puede poner a columnas con el tipo de dato rowversion. No puede contener subconsultas. Si cualquier dato viola esta restriccin, se puede ejecutar DBCC CHECKCONSTRAINTS para retornar las filas con violacin.

PRIMARY KEY Esta restriccin define una llave primaria en una tabla que exclusivamente identifica a una fila. Esto forza a una integridad de entidad. Sintaxis parcial: [CONSTRAINT Nombre_restriccin] PRIMARY KEY [CLUSTERED|NOCLUSTERED] {(columna[,...n])}

Ejemplo: Este ejemplo agrega una restriccin que especifica que el valor de la llave primaria de dbo.Clientes es la identificacin del cliente e indica que un ndice compuesto ser creado para forzar la restriccin. USE NorthWind ALTER TABLE dbo.Clientes ADD CONSTRAINT PK_Clientes PRIMARY KEY NONCLUSTERED(IDCliente) Consideraciones: Solamente una restriccin con PRIMARY KEY puede ser definida. Los valores introducidos deben de ser nicos. Los valores NULL no estn permitidos. Crea un nico ndice en una columna especfica. CLUSTERED es por defecto.

Nota: El ndice creado por una restriccin PRIMARY KEY no puede ser borrado directamente. Es borrado cuando se borra la restriccin.

60

Implementar integridad de datos

UNIQUE Especifica que dos filas en una columna no pueden tener el mismo valor. Esta restriccin refuerza la integridad de entidad con un ndice nico. Este tipo de restriccin es til cuando se tiene una llave primaria, como un nmero de empleado, pero si se desea garantizar que otro identificador como el No de licencia del empleado, tambin es nico. Sintaxis parcial: [CONSTRAINT Nombre_restriccin] UNIQUE [CLUSTERED|NONCLUSTERED] {(columna[,...n])} Ejemplo: En este ejemplo se crea una restriccin UNIQUE sobre el nombre de la compaa en la tabla suplentes. USE NorthWind ALTER TABLE dbo.Suplentes ADD CONSTRAINT U_NombreCia UNIQUE NONCLUSTERED (NombreCia) Consideraciones:

Permite un valor nulo. Se puede ubicar varios UNIQUE sobre una tabla. Se pude aplicar UNIQUE a una o ms columnas que exiga tener valores nicos, pero que no son llaves primarias en la tabla. UNIQUE es exigido por la creacin de un ndice nico sobre la columna o columnas especificadas. FOREIGN KEY Fuerza a la integridad referencial. Define una referencia a una columna con un PRIMARY KEY o UNIQUE en la misma tabla o en otra.

Sintaxis parcial: [CONSTRAINT nombre_restrinccin] [FOREIGN KEY][(Column[,...n])] Ejemplo: Este ejemplo usa un FOREIGN KEY para asegurar que el ID del cliente en la tabla dbo.ordenes esta asociada con un ID vlido en la tabla clientes. USE northWind ALTER TABLE dbo.ordenes ADD CONSTRAINT FK_Ordenes_Clientes FOREIGN KEY (IDCliente) REFERENCES dbo.clientes(IDCliente)

61

Implementar integridad de datos

Consideraciones Suministra integridad referencial de columna individual o mltiple . El nmero de columnas y tipos de datos que estn especificados en la sentencia FOREIGN KEY deben ser parecidos al nmero de columnas y tipos de datos en la clusula REFERENCES. A diferencia de PRIMARY KEY o UNIQUE, FOREIGN KEY no crea ndices automticamente. Sin embargo, si se utiliza varias ligas en la base de datos, se debe crear un ndice para el FOREIGN KEY para mejorar el desempeo de dicha liga. Para modificar datos, los usuarios deben de contar con permisos de SELECT o PREFERENCES sobre otras tablas a las se estn referenciando con esta restriccin. Se puede utilizar nicamente REFERENCES sin FOREIGN KEY cuando se haga una referencia de una columna en la misma tabla.

Integridad referencial en cascada 2

NO ACTION 1 Insertar nuevo ID


Ordenes IDOrden(FK) Clientes IDCliente(PK)

CASCADA
Clientes IDCliente(PK)

1 Actualizar Cascada
Ordenes IDOrden(FK)

2 Actualizar Idcliente viejo a

Clientes IDCliente(PK)

3 Borrar IDCliente

Fig. 4.1 Comparacin de una propagacin de cambios (NO ACTION y CASCADE)

La restriccin FOREIGN KEY incluye una opcin CASCADE que permite que cualquier cambio a una columna que define una restriccin UNIQUE o PRIMARY KEY automticamente propague el cambio al valor de la llave fornea. Esta accin se le denomina como integridad referencial en cascada.

Las clusulas REFERENCES de CREATE TABLE y ALTER TABLE soportan tambin las clusulas ON DELETE y ON UPDATE. Estas clusulas permiten especificar la opcin de CASCADA (CASCADE) o NO HACER NADA (NO ACTION).

Manual de referencia de Ms SQL Server 2000.


62

Implementar integridad de datos

Sintaxis parcial: [CONSTRAINT nombre_restriccin] [FOREIGN KEY][(columns[,...n]] REFERENCES referencia_tabla[(referencia_columna[,...n])] [ ON DELETE {CASCADE | NO ACTION}] [ON UPDATE {CASCADE| NO ACTION}]

NO ACTION especifica que cualquier intento de actualizar o borrar una referencia de una llave por llaves forneas en otras tablas se enve un error y el cambio sea retractado. Este es el valor por defecto. Si CASCADE es definido y una fila es cambiado en la tabla de origen, la fila correspondiente es entonces cambiado en la tabla referenciada. Por ejemplo, en la base de datos NorthWind, la tabla ordenes tiene una relacin referencial con la tabla Clientes; especificamente, la llave fornea ordenes.IDcliente hace referencia a la llave primaria Clientes.IDCliente. Si una sentencia UPDATE es ejecutada sobre la tabla Clientes en IDCliente y una accin ON UPDATE CASCADE es especificada para Ordenes.IDcliente, SQL Server checa por una o ms filas dependientes en la tabla Ordenes. Si cualquiera existe, actualiza las filas dependientes en la tabla Ordenes, as como la fila referenciada en la tabla Clientes. Consideraciones: Es posible realizar combinaciones de CASCADE y NO ACTION sobre tablas que tienen relaciones referenciales con otra tabla. Si SQL Server encuentra NO ACTION, termina y retracta las acciones relativas a CASCADE. Cuando una sentencia DELETE causa una combinacin de CASCADE y NO ACTION, todas las acciones CASCADE sern aplicadas antes que SQL Server cheque por un NO ACTION. CASCADE no puede ser referenciada por una columna con llave fornea o una llave primaria que est definida como una columna con un rowversion.

63

Implementar integridad de datos

Deshabilitar restricciones

4.5

Deshabilitar restricciones checando datos existentes. Deshabilitar restricciones checando cuando se cargan nuevos datos.

Por razones de desempeo, en algunas ocasiones es aconsejable desactivar restricciones. Por ejemplo, es ms eficiente permitir operaciones de lotes largos para procesar antes que activar restricciones. Esta seccin describe cmo deshabilitar restricciones comprobando, si se est creando una nueva restriccin o deshabilitando una ya existente.

Deshabilitar restricciones checando datos existentes. Aplicar restricciones CHECK y FOREIGN KEY. Usar la opcin WITH NOCHECK cuando se agregue una nueva restriccin. Usar si los datos existentes no cambiarn. Se pueden cambiar datos existentes antes de agregar restricciones. Sintaxis parcial: ALTER TABLE Nombre_tabla [WITH CHECK|WITH NOCHECK] ADD CONSTRAINT restriccion [FOREIGN KEY][(column[,...n])] REFERENCES referencia_tabla [(referencia_tabla)[,...n]] [CHECK (Condicion_busqueda)] Ejemplo: En este ejemplo, se agrega una restriccin FOREIGN KEY que verifica que todos los empleados estn asociados con un manejador vlido. La restriccin no es exigida sobre los datos ya existentes a la vez que se agrega esta restriccin. USE NorthWind ALTER TABLE dbo.Empleados WITH NOCHECK ADD CONSTRAINT FK_Empleados_Empleados FOREIGN KEY (ReportsTo) REFERENCES dbo.Empleados(IDEmpleado) Consideraciones: Se pueden deshabilitar solamente CHECK y FOREIGN KEY. Otras restricciones deben ser borradas y agregadas de nuevo. Para deshabilitar una restriccin checando cuando se agregan CHECK o FOREIGN KEY a una tabla con datos existentes, incluir la opcin WITH NOCHECK con la sentencia ALTER TABLE.

64

Implementar integridad de datos

Usar la opcin WITH NOCHECK si los datos existentes no cambiarn. Los datos deben cumplir con las restricciones CHECK si los datos son actualizados. Se debe estar seguro de querer deshabilitar una restriccin. Se puede ejecutar una consulta para cambiar los datos existentes antes de decidir agregar una restriccin.

Deshabilitar restricciones checando cuando se cargan nuevos datos.

Aplicar para restricciones CHECK y FOREIGN KEY Usar cuando: Los datos cumplen restricciones Se cargan nuevos datos que no cumplen restricciones Se pueden deshabilitar restricciones checando restricciones CHECK y FOREIGN KEY existentes tal que ningn dato que se modifique o se agregue a la tabla no es checado en contra de la restriccin.

Para evitar los costos de restricciones de chequeo, se puede querer desactivar restricciones cuando: Se tiene la seguridad de que los datos cumplen con las restricciones. Se quiera cargar nuevos datos que no cumplan con las restricciones. Posteriormente, se pueden ejecutar consultas para cambiar los datos y entonces reactivar las restricciones. Importante: Desactivar restricciones en una tabla no afecta las restricciones sobre otra tabla que hace referencia a la tabla original. Actualizar a una tabla puede engendrar todava errores de violacin de la restriccin. Para activar una restriccin que ha sido desactivada requiere la ejecucin de otra sentencia ALTER TABLE que contenga cualquiera de las clusulas CHECK o CHECKALL. Sintaxis parcial: ALTER TABLE nombre_Tabla {CHECK|NOCHECK} CONSTRAINT {ALL|restriccin[,...n]} Ejemplo: Este ejemplo desactiva una restriccin FK_Empleados_Empleados. Se puede reactivar ejecutando otra vez ALTER TABLE y CHECK. USE NorthWind ALTER TABLE dbo.clientes NOCHECK CONSTRAINT FK_Empleados_Empleados Para determinar si una restriccin est activa o desactiva en una tabla, ejecutar sp_help o utilizar la propiedad CntIsDisabled en la funcin OBJECTPROPERTY.

65

Implementar integridad de datos

Usar defaults y reglas

4.6

Los defaults (por defecto) y las reglas son objetos que pueden ser limitaciones para una o ms columnas o tipos de dato definidos por el usuario, marcndolos para definirlos una sola vez y usarlos repetidas veces. Una desventaja de usar defaults y reglas es que no son compatibles con ANSI. Creacin de un default

Si un valor no es especificado cuando se inserta un dato, un default especifica uno para la columna. Ligar un default. Despus de crear un default, se debe ligar a una columna o a un tipo definido por el usuario ejecutando sp_bindefault. Para quitar un default, ejecutar sp_unbindefault.

Sintaxis:

CREATE DEFAULT nombre_default AS expresion_constante

Ejemplo: Este ejemplo inserta un nmero telefnico en el formato correcto por defecto hasta que se introduzca un nmero en este campo. USE northWind GO CREATE DEFAULT telefono_default AS '(000)000-0000' GO EXEC sp_bindefault telefono_default, 'Clientes.telefono' Consideraciones Cualquier regla que esta sujeta a la columna y al tipo de datos validar el valor de un default. Cualquier restriccin con CHECK sobre una columna debe validar el valor de un default. No se puede crear una restriccin DEFAULT sobre una columna que est definida con un tipo de datos definido por el usuario si un default ya est sujeta al tipo de datos o columna. Creacin de una regla. Las reglas especifican los valores aceptables que se pueden insertar en una columna. Adems, aseguran que los datos que caen dentro de un rango especfico de valores, cumplan con un patrn particular o cumplan entradas delimitadas en una lista especificada.

66

Implementar integridad de datos

Ligar una regla. Despus de que se haya creado una regla, se debe ligar a luna columna o a un tipo de dato definido por el usuario ejecutando sp_bindrule. Para quitar una regla, ejecutar sp_unbindrule. Sintaxis: CREATE RULE nombre_regla AS expresiondecondicin

Ejemplo: En este ejemplo, la regla asegura que solamente algunos estados son permitidos. USE NorthWind GO CREATE RULE CodigoRegion_Rule AS @CodigoRegion IN ('IA', 'IL', KS', 'MO') GO EXEC sp_bindrule codigoRegion_Rule, 'Clientes.Region'

Quitar un default o una regla. La sentencia DROP quita un default o una regla de una base de datos. Sintaxis: DROP DEFAULT nombre_default[,...n] DROP RULE nombre_regla[,...n]

Consideraciones Una definicin de regla puede contener cualquier expresin que sea vlida en una clusula WHERE. Una columna o tipo de datos definido por el usuario puede tener solamente una regla.

67

Implementar integridad de datos

Decidir qu mtodo usar para exigir integridad de datos

4.7

Se debe considerar la funcionabilidad y los costos de rendimiento cuando se determine que mtodo usar para la exigencia de la integridad de datos. Es mejor usar integridad declarativa para la lgica fundamental de integridad, tal como cuando se exige valores vlidos y manteniendo la relacin entre tablas. Si se quiere mantener datos redundantes complejos que no son parte de una relacin de llave primaria o fornea, se debe usar los triggers o procedimientos almacenados. Sin embargo, ya que los desencadenantes (triggers) no se disparan mientras ocurre una modificacin, el chequeo del error sucede despus de que la sentencia es completada. Cuando un desencadenante detecta una violacin, debe deshacer los cambios. Componente de integridad de datos Restricciones Impacto Funcionalidad Costos de Modificacin rendimient Antes/Despu o s Baja Antes

Define con una tabla y valida el dato antes de que una transaccin inicie, resultando un mejor rendimiento.

Media

Defaults y Reglas

Implementa integridad Baja de datos como objetos separados que pueden ser asociados con una o ms tablas Suministra funcionalidad Alta adicional, tal como en cascada y lgica de aplicaciones complejas. Cualquier modificacin debe ser retractada Suministra el mas bajo nivel de integridad de datos. Implementado para cada columna cuando una tabla es creada. El dato es validado antes de que la transaccin inicie.

Baja

Antes

Desencadenante

Media-alta Despus (excepto para INSTEAD OF)

Tipo de datos, NULL/No NULL

Enhorabuena! Hasta ahora el participante ya ha aprendido acerca de la integridad de datos de cmo y cuando aplicarla. Asimismo, reconoce los diferentes tipos que hay y cmo decidir entre uno y otro.
68

Implementar integridad de datos

Prctica

4.8

Propsito Despus de completar estas prcticas, el participante debe ser capaz de: Definir y utilizar las restricciones DEFAULT y CHECK para exigir integridad de dominio. Definir y utilizar las restricciones PRIMARY KEY y FOREIGN KEY parar exigir integridad de entidad y referencial. Crear y utilizar reglas y defaults en SQL Server 2000.

Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo C:\Moc\2073A\Batches\Restore05.cmd. Este archivo restaura la base de datos ClassNortWind al estado requerido para sta prctica Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 30 min. De manera personal y sin utilizar el manual del participante realizar los siguientes ejercicios: 1. Definir restricciones DEFAULT 2. Definir restricciones CHECK 3. Definir restricciones PRIMARY KEY 4. Definir restricciones FOREIGN KEY

69

Planear ndices

5. Planear ndices

Contenido Introduccin a los ndices Arquitectura de ndice Qu columnas indizar Prctica 5.1 5.2 5.3 5.4

En este captulo se provee de una visin general de como planear ndices. Se explica cmo los ndices pueden mejorar el rendimiento de las bases de datos. Se trata de cmo SQL Server 2000 almacena ndices agrupados y no agrupados y de cmo recupera filas usando ndices. Tambin se estudia cmo SQL Server mantiene los ndices. Incluso, cundo utilizar los ndices y cundo no hay que utilizarlos, ya que el uso de los ndices no es til siempre (en algunos casos pueden disminuir el rendimiento). Se concluye con unas directrices para decidir qu columnas indizar. Al concluir este captulo el participante ser capaz de: Describir porqu y cuando se utilizan los ndices. Describir cmo SQL Server utiliza los ndices agrupados y no agrupados. Describir cmo la arquitectura de ndice de SQL Server facilita la recuperacin de datos. Describir cmo SQL Server mantiene los ndices y montculos. Describir la importancia de seleccin, densidad y distribucin de datos cuando se decida que columnas indizar.

70

Planear ndices

Introduccin a los ndices

5.1

Cmo almacena y accesa datos SQL Server. Crear o no ndices.

Al utilizar ndices se puede agrandar el rendimiento de las bases de datos. Los ndices son una de las herramientas disponibles ms potentes para el diseador de bases de datos. Un ndice es una estructura auxiliar que permite mejorar el rendimiento de las consultas mediante la reduccin de la actividad de entrada/salida necesaria para recuperar los datos solicitados, es decir, un ndice permite a Microsoft SQL Server 2000 localizar los datos mediante el uso de una menor cantidad de operaciones de entrada/salida que las que se necesitaran para buscar los datos accediendo solamente a la tabla de la base de datos. Cuando se utiliza un ndice de una tabla de la base de datos para buscar una fila de datos, SQL Server puede determinar rpidamente dnde se almacenan los datos y recuperarlos inmediatamente. As, los ndices de tabla de la base de datos son muy parecidos a los ndices de los libros (ambos proporcionan un acceso rpido a grandes cantidades de informacin).

Cmo almacena y accesa datos SQL Server


Como son almacenados los datos Las filas son almacenadas en pginas de datos. Los montculos son una coleccin de pginas para una tabla. Cmo son accesados los datos Se escanean todas las pginas de datos de una tabla. Se usa un ndice que apunta a la pgina de datos.
Pgina de datos

Pgina 4 Con Funk White

Pgina 5

Pgina 6

... ...

... ... ... ... ...

Rudd White Barr

... ...

... ... ... ... ...

Akhtar Funk Smith Martin

...

... ... ... ... ...

Fig. 5.1 Almacn de pginas de datos

Nota: En la ilustracin solamente los apellidos son mostrados en las pginas de datos, aunque las pginas de datos almacenan filas completas.

71

Planear ndices

Como son almacenados los datos Los montculos son una coleccin de pginas de datos que contienen filas de una tabla: Cada pgina de datos contiene 8kb de informacin. A un grupo de 8 pginas adyacente se le llama extensin. Los datos de las filas no son almacenadas en algn orden en particular y no hay un orden particular a la secuencia de las pginas de datos. Las pginas de datos no estn vinculadas en una lista vinculada. Cuando las filas estn siendo insertadas dentro de una pgina y una pgina est llena, las pginas de datos se dividen. Cmo son accesados los datos SQL Server accesa los datos de dos formas: Escaneando todas las pginas de datos de la tabla-llamado un escaneo de tablaCuando SQL Server ejecuta un escaneo de tabla: Inicia por el principio de la tabla. Escanea pgina por pgina a travs de todas las filas de la tabla. Extrae las filas que satisface con el criterio de la consulta. Usando ndices. Cuando SQL Server utiliza ndices: Atraviesa la estructura de rbol de ndice para encontrar las filas que solicita la consulta. Extrae solamente las filas necesitadas que satisfacen el criterio de la consulta.

SQL Server primero determina si un ndice existe. Entonces, el optimizador de consulta, el componente responsable de generar el plan ptimo de ejecucin para una consulta, determina si escanear una tabla o usar el ndice es ms eficiente para accesar una tabla.

Crear o no crear ndices


Porqu crear un ndice Acelerar el acceso de datos Exigir unicidad de filas Porqu no crear un ndice Consume espacio en disco Provoca sobrecabeceras Porqu crear un ndice Los ndices aceleran la recuperacin de datos. Por ejemplo, sin un ndice, se tendra que ir por un libro de texto pgina por pgina a la vez para encontrar algn tema. Cuando se considere crear o no crear ndices, hay que evaluar dos factores para asegurar que el ndice ser ms eficiente que escanear una tabla: la naturaleza de los datos y la naturaleza de las consultas basadas en la tabla: Los ndices generalmente aceleran las consultas que unen tablas y ejecutan operaciones de ordenamiento y agrupamiento. Los ndices exigen la unicidad de las filas si la unicidad es definida cuando se crean los ndices. Los ndices son creados y mantenidos en orden ascendente o descendente.

72

Planear ndices

Los ndices se crean mejor en columnas con un alto grado de seleccin que son, columnas o combinaciones de columnas en las cuales la mayora de los datos son nicos.

Porqu no crear un ndice Los ndices son tiles, pero consumen espacio en disco y provocan sobrecabeceras y costos de mantenimiento. Consideraciones: Cuando se modifiquen datos sobre una columna indizada, SQL Server actualiza los ndices asociados. El mantenimiento de los ndices requiere tiempo y recursos. Por tanto, no crear un ndice que no se utilizar frecuentemente. Los ndices sobre columnas que contienen una gran cantidad de datos duplicados puede tener pocos beneficios.

73

Planear ndices

Arquitectura de ndice
Arquitectura de ndice en SQL Server Usar montculos Usar ndices agrupados Usar ndices no agrupados

5.2

La arquitectura de ndice para ndice agrupado o no agrupado es diferente. La comprensin de las diferencias en la arquitectura ayudarn a crear el ms efectivo tipo de ndice.3 En los sistemas sin ndices, todas las recuperaciones de datos se deben realizar mediante la exploracin de las tablas. En un recorrido de tabla, todos los datos de la tabla se deben leer y comparar con los datos seleccionados. Los recorridos de tabla normalmente se deben evitar, debido a la cantidad de operaciones de entrada/salida que se generan con esta operacin (la exploracin de tablas grandes puede llevar gran cantidad de tiempo y consumir muchos recursos del sistema). Mediante el uso de un ndice, se puede reducir en gran medida el nmero de operaciones de entrada/salida, acelerando el acceso a los datos, as como liberando recursos del sistema para otras Un ndice de la base de datos se organiza en una estructura de rbol B. Cada pgina de ndice se denomina una pgina ndice o un nodo ndice. La estructura de ndices comienza con un nodo en el nivel superior. El nodo raz marca el inicio del ndice; es el primer dato al que se accede cuando se produce una bsqueda de datos. El nodo raz contiene una cantidad de filas ndice. Estas filas ndice contienen un valor clave y un puntero a una pgina de ndice (denominado nodo rama). Esta configuracin es necesaria debido a que en una tabla de datos de tamao medio, un ndice consta de miles o millones de pginas ndice. Comenzando por el nodo raz y atravesando los nodos rama, SQL Server puede acercarse a los dalos que se desean.

Fig. 5.2 Arquitectura de un ndice en SQL Server

http://usuarios.lycos.es/cursosgbd/UD7.htm 74

Planear ndices

Usando como analoga un libro, un ndice trabaja de forma parecida a lo siguiente: se supone que el ndice comienza en una pgina que lista los nmeros de las pginas en donde las entradas comienzan por a, b, c, y as consecutivamente. Despus se supone que estas pginas contienen los nmeros de pginas para las entradas en los rangos aa-ab, ac-ad, ae-af, etc., y esas pginas contienen punteros a las entradas de los rangos aaa-aab, aac-aad, aae-aaf, y as sucesivamente. Con esta ordenacin, se puede encontrar lo que se est buscando rpidamente, con relativamente pocas bsquedas. Esto es parecido a un ndice de tabla de una base de datos, siendo la primera pgina el nodo raz. Al igual que el nodo raz, cada nodo rama contiene un nmero de filas ndice guardadas en una pgina ndice. Cada fila ndice apunta a otro nodo rama o a un nodo hoja, como se muestra en la figura siguiente. Los nodos hoja forman el ltimo nivel de un ndice. A diferencia del nodo raz, cada nodo rama tambin tiene una lista enlazada a otros nodos rama del mismo nivel. En otras palabras, los nodos conocen los nodos adyacentes, as como tambin conocen los nodos inferiores.

Fig. 5.3 Niveles de pgina en un ndice Como implica el nombre rbol B, los nodos rama se expanden desde el nodo raz en forma de rbol. Cada grupo de nodos rama del mismo nivel de la estructura de rbol se conoce como un nivel de ndices, como se muestra en la figura siguiente. El nmero de operaciones de entrada/salida que se necesitan para alcanzar los nodos hoja (los nodos del nivel ms bajo del rbol) depende del nmero de niveles de ndices. Si la tabla de la base de datos slo contiene una cantidad pequea de datos, el nodo raz puede apuntar directamente a los nodos hoja, por lo que el ndice no tiene que contener ningn nodo rama (una situacin improbable).

En los ndices no agrupados, los nodos hoja contienen el valor clave y, o bien un identificador de fila apuntando a la fila deseada de la tabla, o bien la clave de ndice agrupado si tambin existe un ndice agrupado en la tabla. Y en un ndice agrupado el mismo dato est en el nodo hoja. El nmero de filas de un nodo hoja depende del tamao de las entradas de ndices y, en el caso de un ndice agrupado, del tamao de los datos.

Nota: Un identificador de fila es un puntero que construye automticamente SQL Server a partir del identificador de archivo, el nmero de pgina y el nmero de la fila de datos. Con el identificador de la fila, se pueden recuperar los datos con nicamente una operacin de entrada/salida adicional. Debido a que se conoce qu pgina hay que
75

Planear ndices

recuperar y SQL Server conoce dnde est esa pgina, la pgina se lee en memoria con una nica solicitud de entrada/salida La simplicidad de este proceso es la razn por la que los ndices son tan eficientes a la hora de recuperar los datos y de proporcionar tan gran mejora en el rendimiento. Hay que tener en cuenta que, debido a que el ndice se crea ordenado, cualquier cambio de los datos puede implicar una sobrecarga adicional. Por ejemplo, si una insercin implica la insercin de una nueva fila ndice en un nodo hoja que est lleno, SQL Server debe hacer sitio para la nueva fila. Esto lo hace moviendo aproximadamente la mitad de las filas del nodo hoja a otra pgina. Este movimiento de datos se denomina divisin de pgina. Una divisin de pgina en un nivel del rbol puede implicar divisiones en cascada en el rbol. Las divisiones de pgina se pueden evitar mediante un ajuste cuidadoso del factor de llenado.

ndices simples Un ndice simple es un ndice que se define en una sola columna de la tabla. Se debe hacer referencia a esta columna en la clusula WHERE de la instruccin para que se use este ndice para cumplir la instruccin. Un ndice simple puede ser efectivo dependiendo del tipo de datos que se estn ordenando, del nmero de elementos nicos de la columna y del tipo de instrucciones SQL que se usen. En otros casos se necesita un ndice compuesto. Por ejemplo, si se est indexando una libreta de direcciones con miles de nombres y direcciones, la columna state no es una buena candidata para un ndice simple ya que podra haber muchas entradas del mismo estado. Sin embargo, al aadir las columnas street y city al ndice, por tanto creando un ndice compuesto, se puede hacer que cada entrada sea casi nica. Este paso puede ser til si se usan consultas que buscan filas a travs de la direccin. ndices compuestos Un ndice compuesto es un ndice que se define en ms de una columna. Se puede acceder a un ndice compuesto usando una o ms claves de ndice. Con SQL Server 2000, un ndice puede abarcar hasta 16 columnas y sus columnas clave pueden ser de hasta 900 bytes. Para las consultas que formen parte de un ndice compuesto, no es necesario que se incluyan todas las claves de ndice en la clusula WHERE de una instruccin SQL, pero es sensato utilizar ms de una de ellas. Por ejemplo, si se crea un ndice en las columnas a, b y c de una tabla, se puede acceder al ndice usando una instruccin SELECT que contenga (a AND b AND c) o (a AND b) o a. Por supuesto, el uso de una clusula WHERE ms restrictiva, como la que contiene a AND b AND c, proporciona un mejor rendimiento. Recuperar menos filas de la base de datos ya que identifica una fila ms especficamente. Si se usa a AND b o solamente a, slo se iniciar un recorrido del ndice. Un recorrido de ndice ocurre debido a que ms de una entrada de ndice satisface la bsqueda. En un recorrido de ndice, los nodos de un ndice se exploran para recuperar vanos registros de datos. Adems, el ndice incluye parcialmente el valor que se ha seleccionado. Por ejemplo si el ndice se ha creado para las columnas a, b y c, y la consulta solamente especifica la columna a, se devolvern todas las filas que satisfagan ese valor de a, para todos los valores de b y c. Debido a que las columnas en que se basa un ndice estn ordenadas numricamente, el optimizador de consultas de SQL Server puede determinar el rango de pginas ndices que pueden contener los datos deseados. Una vez que se conocen las pginas de comienzo y fin, se recuperan todas las pginas que contienen los valores de datos y se exploran los datos demandados.

76

Planear ndices

Nota: El ndice solamente se puede utilizar si al menos una de las claves del ndice estn en la clusula WHERE de la consulta SQL. Continuando con el ejemplo anterior, una consulta con solamente un nombre o un nmero de telfono en la clusula WHERE no usa el ndice. En la mayora de los casos un recorrido de ndice puede ser bastante eficiente; sin embargo, si se accede a ms del 20 por ciento de las filas de la tabla, es ms eficiente un recorrido de tabla, en la cual se leen todas las filas de la tabla. La eficiencia de las consultas que usan un ndice depende de cmo su utilice el ndice y en la unicidad del ndice. Usar montculos SQL Server mantiene las pginas de datos en un montculo a menos que un ndice agrupado sea definido sobre la tabla. SQL Server: 1. Utiliza pginas de Mapa de Asignacin de ndice (IAM) para mantener los montculos. Las pginas IAM: o Contienen informacin sobre donde las extensiones de un montculo son almacenadas. La taba de sistema sysindexes almacena un puntero a la primera pgina IAM asociada con un montculo. o Son utilizados para navegar a travs del montculo y encontrar espacio disponible para nuevas filas que se estn insertando. o Conecta las pginas de datos. o Las pginas de datos y las filas en su interior no estn en ningn orden especfico y no estn vinculados conjuntamente. La nica conexin lgica entre las pginas de datos es que estn grabadas en las pginas IAM. 2. Recupera espacio para nuevas filas en el montculo cuando una fila es borrada. ndices agrupados Como se ha mencionado, un ndice agrupado es un ndice que almacena los datos de la fila actual de la tabla en sus nodos hoja, de forma ordenada. Estos son tiles para columnas que son buscadas frecuentemente para rangos de valores de llave o son accesados en orden. Este sistema ofrece algunas ventajas y algunas desventajas. Debido a que los datos de un ndice agrupado se almacenan en los nodos hoja, una vez llegan al nodo hoja, los datos estn disponibles, lo que puede resultar en un nmero menor de operaciones de entrada/salida. Cualquier reduccin de estas operaciones produce un mayor rendimiento, para las operaciones individuales y un mejor rendimiento medio para el sistema. Otra ventaja de los ndices agrupados es que los datos recuperados estn ordenados segn el orden del ndice. Por ejemplo, si se crea un ndice agrupado a partir de las columnas state, country, y city y una consulta que selecciona todos los valores para los que state es Texas, la salida resultante est ordenada segn country y city en el orden en que se haya definido en el ndice. Esta caracterstica se puede utilizar para evitar operaciones innecesarias de ordenacin si la base de datos y la aplicacin se han diseado cuidadosamente. Por ejemplo, si se sabe que siempre va a ser necesario ordenar los datos de un cierta forma, el uso de un ndice agrupado significa que no se va a tener que realizar la ordenacin una vez se hayan recuperado los datos. Una desventaja del uso de un ndice agrupado es que el acceso a la tabla siempre es a travs del ndice, lo que puede provocar una sobrecarga adicional. SQL Server comienza

77

Planear ndices

el acceso a los datos en el nodo raz y atraviesa el ndice hasta que llega al nodo hoja que contiene los datos. Si se crean muchos nodos hoja debido al volumen de datos, el nmero de niveles de ndices necesarios para soportar esta cantidad de nodos hoja tambin es grande, lo que se necesitan son ms operaciones de entrada/salida para que SQL Server vaya desde el nodo raz hasta el nodo hoja. Debido a que los datos reales se almacenan en el ndice agrupado, no se puede crear ms de un ndice agrupado en una tabla. Por otra parte, se pueden crear ndices no agrupados sobre una tabla agrupada (una tabla agrupada es sencillamente una tabla que tiene un ndice agrupado). El ndice agrupado se debera crear usando las claves de ndices a las que se accede ms frecuentemente (esto proporciona una mayor probabilidad de acceder a los datos a travs del ndice agrupado y por ello se mejora el rendimiento.) Consideraciones: Cada tabla puede tener nicamente un ndice agrupado. El orden fsico de la fila de la tabla y el orden de las filas en el ndice son iguales. Se deben crear ndices no agrupados antes que cualquier ndice agrupado ya que un agrupado cambia el orden fsico de la tabla. La unicidad del valor de la llave es mantenida explcitamente con la palabra clave UNIQUE o implcitamente con un identificador interno. Estos identificadores nicos son internos a SQL Server y no estn accesibles al usuario. El tamao promedio de un ndice agrupado es alrededor del 5% del tamao de la tabla. Sin embargo, el tamao de este ndice vara dependiendo del tamao de la columna indizada. Cuando una fila es borrada, el espacio es recuperado y est disponible para una nueva fila. Durante la creacin de un ndice, SQL Server temporalmente usa espacio de disco de la base de datos actual. Un ndice agrupado requiere de alrededor 1.2 veces el tamao de la tabla para trabajar el espacio cuando el ndice es creado. El espacio del disco que es usado durante la creacin del ndice es recuperado automticamente despus de que el ndice es creado.

Nota: Se debe asegurar que hay espacio suficiente en disco dentro de la base de datos para la creacin de ndices agrupados.

ndices no agrupados Estos ndices son tiles cuando se requiere varias formas de bsqueda de datos. Por ejemplo, un lector puede buscar frecuentemente un libro de jardinera, nombres cientficos y nombres comunes de planta. Se puede crear un ndice no agrupado para recuperar los nombres cientficos y un ndice agrupado para recuperar nombres comunes. A diferencia de los ndices agrupados, los ndices no agrupados no contienen los datos reales de la tabla en sus nodos hoja. Los nodos hoja pueden contener uno o dos tipos de informacin de ubicacin de filas de datos. En primer lugar, si no hay ndices agrupados en la tabla, los ndices no agrupados de esa tabla almacenan los identificadores de filas en sus nodos hoja. Cada identificador de fila apunta a la fila de datos real de la tabla. El identificador de fila est formado por un valor que incluye el ID del archivo de datos, el nmero de pgina y la fila de la pgina. Este valor permite un acceso rpido a los datos reales sealando exactamente dnde estn almacenados los datos.

78

Planear ndices

Si existe un ndice agrupado en la tabla, los ndices no agrupados contendrn en los nodos hoja el valor de la clave del ndice agrupado para esos datos, como se muestra en la figura siguiente. Cuando se alcanza el nodo hoja del ndice no agrupado, se usa el valor de la clave agrupada encontrada en el nodo para buscar en el ndice agrupado, donde se encontrar en su nodo hoja la fila de datos. Como ya se ha mencionado, solamente se puede tener un ndice agrupado por tabla. Se pueden crear 249 ndices no agrupados por tabla, pero esto no es deseable. Es frecuente tener varios ndices no agrupados en varias columnas de la tabla. El predicado de la clusula WHERE lo usa el optimizador de consultas para determinar qu ndice se utiliza. Consideraciones: Si un tipo de ndice no es especificado, por defecto ser no agrupado. SQL Server automticamente reconstruye ndices no agrupados existentes cuando: Un ndice agrupado es borrado. Un ndice agrupado es creado. La opcin DROP_EXISTING es utilizado para cambiar qu columna define el ndice agrupado. El orden del nivel de pginas de un ndice no agrupado difiere del orden fsico de la tabla. El nivel de pgina es clasificado en orden ascendente. La unicidad es mantenida a nivel de pgina con cualquier grupo de llaves y identificadores de fila. Puede tener hasta 249 ndices no agrupados por tabla. Los ndices no agrupados son mejor creados sobre columnas en los que lo rangos de selectividad de datos van de altamente selectivo a nico. Crear ndices agrupados antes que ndices no agrupados. Los identificadores de fila especifican el orden lgico de filas y consiste del archivo ID, el nmero de pgina y la fila ID.

79

Planear ndices

Qu columnas indizar
Entender los datos. Indizar directivas. Elegir el ndice agrupado apropiado. Indizar para soportar consultas. Determinar selectividad. Determinar densidad. Determinar distribucin de datos.

5.3

Planear ndices tiles es una de las ms importantes aspectos de mejorar el desempeo de consultas. Esto requiere de un entendimiento de la estructura de ndices y de cmo son utilizados los datos.

Entender los datos


Antes de crear un ndice, se debe tener un cabal entendimiento de los datos, incluyendo: Diseo fsico y lgico Las caractersticas de los datos. Cmo es usado el dato. Para disear tiles y efectivos ndices, se debe basar en el anlisis de consultas que envan los usuarios. Un anlisis pobre de cmo los usuarios accesan datos llega a ser aparente en la forma de respuesta lenta a la consulta o incluso bloqueos innecesarios a la tabla. Se debe estar conciente de cmo los usuarios accesan datos observando: Los tipos de consulta ejecutadas. La frecuencia de consultas que son ejecutadas normalmente. Considerando un total entendimiento de los requerimientos de los datos del usuario ayuda a determinar que columnas indizar y qu tipos de ndice crear. Quiz se tenga que sacrificar alguna velocidad en una consulta para ganar mejor desempeo sobre otra.

Indizar directivas
El entorno de negocio, las caractersticas del dato y el uso del dato determina las columnas que se especifica para generar un ndice. La utilidad de un ndice est directamente relacionada al porcentaje de filas regresadas de una consulta. Los bajos porcentajes o alta selectividad son ms eficientes.

Nota: Cuando se crea un ndice sobre una columna, la columna es referida a como la columna de ndice. Un valor dentro de una columna del ndice se llama valor llave.

Crear ndices sobre columnas frecuentadas, tales como: Llaves primarias.


80

Planear ndices

Llaves forneas o columnas que son usadas con frecuencia en tablas unidas. Columnas que son buscadas por rangos de valores llave. Columnas que son accesadas en orden. Columnas que son agrupadas juntas durante una agregacin. No crear ndices sobre columnas que: Rara vez se haga referencia en una consulta. Contienen pocos valores nicos. Por ejemplo, un ndice sobre una columna con 2 valores, masculino y femenino, retorna un alto porcentaje de filas. Son definidas con los tipos de datos text, ntext and image. Las columnas con estos tipos de datos no pueden ser indizadas.

Elegir el ndice agrupado apropiado


Considerar cmo la tabla es usada cuando se elige el ndice agrupado para cada tabla. Tablas pesadamente actualizadas Cuando se optimiza el rendimiento para la insercin de datos a una tabla pesada usada, considerar crear un ndice agrupado en una columna de identidad con llave primaria. Forzar inserciones a un grupo pequeo de pginas al final de la tabla, incrementa velocidad. El acceso frecuente mantiene estas pginas en memoria. Clasificar Las tablas que estn con frecuencia clasificadas para informes, agrupadas por agregacin o buscadas por rangos de datos se pueden beneficiar de un ndice agrupado sobre la columna clasificada. Usar un ndice agrupado es til cuando muchas columnas de la tabla son retornadas y un ndice no agrupado es imprctico. Por ejemplo, una tabla de lista de correo se beneficiara de un ndice agrupado sobre el cdigo postal, ya que las etiquetas de correo deben ser impresas y aplicadas en un orden especfico. Tipo de dato y longitud de columna SQL Server usa los valores de ndices agrupados como el identificador de columna dentro de cada ndice agrupado. El valor del ndice agrupado puede ser repetido muchas veces en la estructura de una tabla.

Indizar para soporte de consultas


El rendimiento de una consulta depende de cmo estn diseados los ndices. Tambin es importante mencionar que las consultas con un argumento de bsqueda pueden aprovecharse de una columna indizada. Un argumento de bsqueda limita una bsqueda equivalencia ms exacta, un rango de valores o una combinacin de dos o ms elementos unidos por un operador AND. Un argumento de bsqueda contiene una expresin constante que actan sobre una columna usando un operador. Cuando se escriben consultas que contengan argumentos de bsqueda, se incrementa la posibilidad de que el optimizador de consulta utilice un ndice.

81

Planear ndices

Si una expresin no limita una bsqueda, no es considerada un argumento de bsqueda. En muchos casos, se deben reescribir las consultas para convertirlas en argumentos de bsqueda. Para limitar bsquedas, se debe: Especificar una clusula WHERE en la consulta. Verificar que el WHERE limita el nmero de filas. Verificar que exista una expresin para cada tabla referida en la consulta. Evitar usar comodines delanteros. La siguiente tabla muestra buenos argumentos de bsqueda: Argumentos de bsqueda WHERE Cust_id =47635 WHERE date BETWEEN '07/23/2004' AND '07/30/2004' WHERE apellido LIKE 'Jim%' WHERE apellido LIKE 'Jim%' Consulta Limita la bsqueda ya que cus_id es nico Limita la bsqueda a rangos pequeos de datos nicamente. Limita la bsqueda a los apellidos que inicien con Jim.

Determinar selectividad
Un concepto y trmino que es con frecuencia utilizado en discusiones de ndices es Selectividad. Cuando se determina qu columnas indizar y se elige el tipo de ndice a crear, se debe considerar cuan selectivos son los valores de datos. La selectividad deriva del porcentaje de filas que en una tabla son accesadas o retornadas de una consulta. El optimizador de consulta determina la selectividad para SELECT, UPDATE o DELETE. Cuando se crean ndices, se deben crear sobre: Columnas que son referenciadas muy seguidos en operadores de unin o en la clusula WHERE. Los datos que son altamente selectivos. Dentro de alta selectividad, el criterio de bsqueda limita el nmero de filas retornadas a un bajo porcentaje del total posible. Una fila retornada es la selectividad ms alta que puede ser lograda. En la baja selectividad, el criterio de bsqueda retorna un alto porcentaje de filas de la tabla. Se puede determinar cuan selectiva es una consulta estimando el nmero de filas retornadas, relativo al nmero total de filas en una tabla para una consulta especfica. Para los ejemplos siguientes, se asume que hay 10,000 filas en la tabla miembros y que los nmeros de miembros estn en el rango de 1 a 10,000. Ejemplo1: En este ejemplo, la consulta retorna una fila SELECT * FROM miembros WHERE IDMiembro=8999 ejemplo2: En este ejemplo, la consulta retorna 999 filas. SELECT * FROM miembros WHERE IDMiembro > 9001 ejemplo3: En este ejemplo, la consulta retorna 9,000 filas. SELECT * FROM Miembros WHERE IDMiembro < 9001

82

Planear ndices

Determinar densidad
Un concepto relacionado a la selectividad es el concepto densidad. Cuando se determina qu columnas indizar, se debe examinar la densidad de los datos. Definicin La densidad es el porcentaje promedio de filas duplicadas en un ndice. Si los datos o consulta no es muy selectiva (baja selectividad), se tiene una alta cantidad de densidad. Un ndice con un gran nmero de duplicados tiene densidad alta. Por ejemplo, un ndice sobre la columna apellido puede ser muy denso. Un ndice nico tiene densidad baja. Un ejemplo de esto sera un ndice sobre la columna de nmero de seguro social, el nmero de licencia de conducir o apellido + nombre(compuesto). Cuando se determina la densidad del dato, recordar que la densidad relaciona a los elementos especficos de datos. La densidad puede variar. Considerar un ndice sobre la columna apellido. Los elementos de datos de este ndice son muy densos para apellidos comunes tal como Prez, Lpez mientras que el apellido Ota probablemente no es muy denso. Ya que el dato no es distribuido uniformemente, el optimizador de consulta puede o no utilizar un ndice. En la siguiente ilustracin, la consulta el optimizador de consulta puede: Ejecutar un escaneo de tabla para recuperar el apellido 'Randall' Utilizar un ndice para accesar al apellido 'Ota'.

Apellido Randall .. .. Randall Randall .. .. Ota ..

Nombre Roy .. .. Cintia Alex .. .. Lana ..

Alta densidad Select * FROM Miembros WHERE apellido='Randall' Baja densidad Select * FROM Miembros WHERE apellido='Ota'
Fig. 10 Densidad en la columna apellido: una columna con un gran nmero de duplicados tiene alta densidad.

Determinar Distribucin de datos


La distribucin de datos est relacionada con el concepto de densidad. Cuando se determina la densidad de los datos, se debe tambin cmo son distribuidos. Definicin La distribucin de datos indica la cantidad de datos que existen para un rango de valores dentro de una determinada tabla y cuntas filas caen en ese rango. Si una columna indizada tiene muy pocos valores nicos, la recuperacin de datos puede ser baja a

83

Planear ndices

causa de la distribucin de datos. Por ejemplo, un directorio telefnico ordenado alfabticamente por apellidos puede mostrar que hay una alta incidencia de gente con apellidos Randall o Jones. En una distribucin estndar, los rangos de valores llave permanecen constantes mientras el nmero por rango cambia. Una distribucin uniforme permite que el optimizador de consulta determine con facilidad la selectividad de una consulta estimando el nmero de filas calificativas como un porcentaje del total de filas en la tabla. Similar a la densidad, los elementos de datos de un ndice pueden variar en cmo los datos estn distribuidos. Normalmente, los datos no son distribuidos uniformemente. Por ejemplo, si la tabla miembros contiene 10,000 filas y tiene un ndice sobre la columna apellido, los apellidos no estn normalmente distribuidos uniformemente.

Distribucin estndar de valores No de apellidos

A-E
No de apellidos

F-J

K-O

P-U

V-Z

apellido Distribucin uniforme de valores

A-E

F-J

K-O P-U apellido

V-Z

Fig. 11 Tipo de distribucin de valores: estndar y uniforme Estimar el porcentaje de filas retornadas En muchos casos, se puede aproximar el porcentaje de datos a ser retornados en un conjunto de resultados. Por ejemplo, si el criterio es femenino/masculino, el conjunto de resultados para femenino puede ser estimado en un 50%. Cuando se estima el porcentaje de filas retornadas en valores tales como apellido, ciudad o otro dato demogrfico, es crtico que se conozcan datos, ya que la distribucin de datos vara ampliamente in entornos diferentes. Ejemplo: Esta consulta es utilizada para mostrar la distribucin (cantidad de duplicadas) de valores de columna en una base de datos existente. La consulta retorna cada valor solamente una vez con un nmero (contador) que indica cuntas ocurrencias hay en la tabla. SELECT column, count(*) AS 'Datacount' FROM table GROUP BY column ORDER BY 'Datacount' DESC

84

Planear ndices

Prctica
Propsito Despus de completar estas prcticas, se debe ser capaz de:

5.6

Utilizar el sp_help para determinar la estructura del ndice de una tabla. Consultar la tabla sysindexes para identificar la estructura del ndice en una tabla. Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\Restore06.cmd Este archivo restaura la base de datos Credit al estado requerido para sta prctica. Nota: Debe haber ejecutado install server name desde la misma ruta Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 20 min. De manera realizar los siguientes ejercicios: 1. Identificar ndices utilizando sp_help 2. Ver entradas en la tabla sysindexes

85

Crear y mantener ndices

6.Crear y mantener ndices

Contenido Creacin de ndices Creacin de opciones de ndice Mantenimiento de ndices Prcticas 6.1 6.2 6.3 6.4

En este captulo se ver cmo SQL Server crea y mantiene los ndices para mejorar el acceso a los datos. Al utilizar el Asistente para optimizacin de ndices, Microsoft SQL Server crea ndices, analiza las consultas y determina los ndices que se deben crear. Al concluir este captulo el participante ser capaz de: Crear ndices y vistas indizadas con caractersticas nicas o compuestas. Usar las opciones de CREATE INDEX. Describir como mantener ndices a travs del tiempo.

86

Crear y mantener ndices

Creacin de ndices

6.1

Crear y borrar ndices. Crear ndices nicos. Crear ndices compuestos. Crear ndices sobre columnas calculadas. Obtener informacin sobre ndices existentes.

Ahora que ya se ha discutido acerca de las arquitecturas de ndice, se discutir cmo crear y borrar ndices y obtener informacin sobre los ndices existentes. Crear y borrar ndices Para crear ndices se utiliza la sentencia CREATE INDEX. Tambin se puede utilizar el asistente para crear ndices de SQL Server del Administrador Corporativo. Cuando se crea un ndice sobre una o ms columnas en un tabla tmense en cuenta los siguientes factores y directivas: SQL Server automticamente crea ndices cuando una restriccin PRIMARY KEY o UNIQUE es creada en un tabla. Se debe ser propietario de la tabla a la que se le ejecutar un CREATE INDEX. Los ndices pueden ser creados sobre vistas. SQL Server almacena informacin de ndice en la tabla del sistema sysindexes. Antes de que sea creado un ndice sobre una columna, determinar si los ndices ya existen sobre esa columna. Mantener ndices pequeos definindolos sobre columnas que son pequeas en tamao. Tpicamente, los ndices ms pequeos son ms eficientes que los ndices con valores de llave ms extensos. Seleccionar columnas sobre las bases de unicidad tal que cada valor de llave identifique un pequeo nmero de filas. Cuando se crea un ndice agrupada, todos lo ndices no agrupados son reconstruidos. Sintaxis: CREATE [ UNIQUE ][ CLUSTERED|NOCLUSTERED ] INDEX nombre_indice ON {tabla|vista} (column[ASC|DESC][,...n] [ WITH [ PAD_INDEX ] [[,] FILLFACTOR= factorderelleno] [[,] IGNORE_DUP_KEY ] [[,] DROP_EXISTING] [,] STATISTICS_NORECOMPUTE ] [[,] SORT_IN_TEMPDB ] ] [ ON grupodearchivos] Ejemplo: Este ejemplo crea un ndice agrupado sobre la columna apellido en la tabla Empleados.
87

Crear y mantener ndices

CREATE CLUSTERED INDEX CL_apellido ON Empleados(apellido) DROP INDEX Para quitar un ndice de una tabla se debe utilizar DROP INDEX. Considerar los siguiente: Despus de ejecutar DROP INDEX, se obtiene todo el espacio que ocupaba anteriormente el ndice. Despus, se puede utilizar este espacio para cualquier objeto de base de datos. Para quitar los ndices creados para implementar las restricciones PRIMARY KEY o UNIQUE, se debe quitar la restriccin. Cuando se quita una tabla, todos los ndices de esa tabla tambin son borrados. Cuando se quita un ndice agrupado, todos los ndices no agrupados en la tabla son reconstruidos automticamente. Se debe estar en la base de datos en la que un ndice reside en orden para borrar ese ndice. No se puede especificar DROP INDEX sobre un ndice de una tabla de sistema. Sintaxis: DROP INDEX 'Tabla.index | vista.index'[,...n] Ejemplo: Este ejemplo borra el ndice CL_Apellido de la tabla Empleados. USE Northwind DROP INDEX Empleados.CL Crear ndices nicos Un ndice nico asegura que todos los datos dentro de una columna son nicos y no contengan valores duplicados. Si la tabla tiene una restriccin con PRIMARY KEY o UNIQUE, SQL Server automticamente crea un ndice nico cuando se ejecute CREATE TABLE o ALTER TABLE. Si la unicidad se debe exigir, es preferible crear restricciones PRIMARY KEY o UNIQUE en la columna que un ndice nico. Consideraciones: SQL Server automticamente crea ndices nicos sobre columnas en una tabla definida con las restricciones PRIMARY KEY o UNIQUE. Si una tabla contiene datos, SQL Server revisa valores duplicados cuando se crea el ndice. SQL Server revisa los valores duplicados cada vez que se utiliza INSERT o UPDATE. Si existen valores de llave duplicados entonces cancela estas operaciones y retorna un mensaje de error con el primer duplicado. Asegurarse que cada fila tiene un valor nico dos filas no pueden tener el mismo nmero de ID si un ndice nico se ha creado sobre una columna. Esta regulacin asegura que cada entidad es identificada como nica. Crear ndices nicos solamente sobre columnas en las que la integridad de entidad puede ser exigida. Por ejemplo, no se creara un ndice nico sobre la columna apellido de la tabla empleados ya que varios empleados pueden tener los mismos apellidos.
88

Crear y mantener ndices

Ejemplo1: Este ejemplo crea un ndice nico no agrupado llamado U_CteID en la tabla Clientes. El ndice es generado sobre la columna IDCliente. El valor en la columna IDCliente debe se nico para cada fila en la tabla. USE Northwind CREATE UNIQUE NONCLUSTERED INDEX U_CteID ON Clientes(IDCliente) Si existe un valor de llave duplicado cuando se crea un ndice nico, CREATE INDEX fallar. SQL Server retorna un mensaje de error con el primer duplicado, pero de otros valores duplicados pudieran existir, igualmente. Utilizar el siguiente ejemplo sobre cualquier tabla para encontrar todos los valores duplicados en una columna. Reemplazar el texto en cursiva con informacin verdica: SELECT index_col, COUNT (index_col) FROM nombreTabla GROUP BY index_col HAVING COUNT (index_col)>1 ORDER BY index_col Ejemplo2: Este ejemplo determina si existe duplicado en ID del Cliente en la columna IDCliente en la tabla Clientes. Si es as, SQL Server retorna el ID del cliente y el nmero de entradas duplicadas en los resultados. SELECT IDCliente, COUNT(IDCliente) AS '# de duplicados' FROM Northwind.dbo.Clientes GROUP BY IDCliente HAVING COUNT(IDCliente)>1 ORDER BY IDCliente resultados: IDCliente (0 fila(s) afectadas # de duplicadas

Crear ndices compuestos OrdenesDetalles IDOrde IDProduc PrecioUnitar Cantid Descuen n to io ad to 10248 10248 10248 11 42 72 14000 9800 34800 12 10 5 0 0 0

Llave compuesta Los ndices compuestos se refieren a ms de una columna. Se crean ndices compuestos: Cuando 2 o ms columnas son mejor buscadas como una llave Si las consultas se refieren solamente a las columnas en el ndice.
89

Crear y mantener ndices

Por ejemplo, un directorio telefnico es un buen ejemplo de dnde un ndice compuesto sera til. El directorio est organizado por apellidos. Adentro el apellido, este es organizado por nombres ya que existen entradas con el mismo apellido. Cuando se planee la posibilidad de crear ndices compuestos, considerar lo siguiente: Se puede combinar hasta 16 columnas dentro de un slo ndice compuesto. La suma del largo de las columnas que constituyen al ndice compuesto no puede exceder los 900 bytes. Todas las columnas en un ndice compuesto deben ser de la misma tabla, excepto cuando un ndice es creado para una vista. Definir primero la columna ms nica posible. La primera columna definida en CREATE INDEX es referida como la de ms alto orden(highest order). La clusula WHERE de una consulta debe hacer referencia a la primera columna del ndice compuesto para que el optimizador de consultas lo utilice. Un ndice sobre (columna1,columna2) no es lo mismo que (columna2,columna1)- cada uno tiene un orden distinto de columna. La columna que contiene los datos ms selectivos o que retornara el porcentaje ms bajo de filas con frecuencia determina el rden de la columna. Los ndices compuestos son tiles para tablas con mltiples columnas llave. Utilizar ndices compuestos para incrementar el rendimiento y reducir el nmero de ndices que se crean en la tabla.

Nota: Mltiples ndices sobre las mismas columnas son, tpicamente, intiles. Ejemplo: Este ejemplo crea un ndice compuesto no agrupado sobre la tabla OrdenesDetalles. Las columnas IDOrden y IDProducto son los valores llave compuestos. Ntese que la columna IDOrden es listada primero ya que es ms selectiva que la otra. USE Northwind CREATE UNIQUE NONCLUSTERED INDEX U_OrdID_ProdID ON [OrdenesDetalles} (IDOrden, IDProducto) Crear ndices sobre columnas calculadas Se pueden crear ndices sobre columnas calculadas cuando: La expresin de la columna calculada es determinista. Las expresiones deterministas siempre retornan el mismo resultado. La opcin de nivel de coneccin ANSI_NULL est en ON cuando CREATE TABLE es ejecutada. La funcin OBJECTPROPERTY informa si la opcin est en la propiedad IsAnsiNullsOn. La expresin de la columna calculada que es definida por la columna calculada no evala los tipos de datos text, ntext o image. La conexin sobre la cual el ndice es creado y todas las conexiones que intentan INSERT, UPDATE o DELETE que cambian los valores en el ndice, tienen 6 opciones ON y una opcin OFF. Estas opciones deben de estar en ON: ANSI_NULLS ANSI_PADDING ANSI_WARNINGS

90

Crear y mantener ndices

ARITHABORT CONCAT_NULL_YIELDS_NULL QUOTED_IDENTIFIERS Adems, para que stos ON se fijen, la opcin NUMERIC_ROUNDABORT debe de estar puesta en OFF.

Nota: El optimizador de consultas ignora un ndice sobre una columna calculada para cualquier sentencia SELECT que es ejecutada por una conexin que no tiene esas mismas opciones de fijacin. Obtener informacin sobre los ndices existentes En algn momento se puede requerir de informacin acerca de los ndices existentes antes de crearlos, modificarlos o borrarlos. Se puede utilizar el administrador corporativo o ejecutar sp_helpindex para obtener informacin de ndices, tal como el nombre del ndice, el tipo y las opciones para una tabla en especfico. Ejemplo: Este ejemplo lista los ndices sobre la tabla clientes. USE Northwind EXEC sp_helpindex clientes Resultado: Result index_name PK_Clientes POSTCOD City row(s) affected) Tambin se puede utilizar sp_help para obtener informacin sobre ndices, as como tambin de otra informacin de tabla.

index_description Clustered, unique, Primary key located on PRIMARY Nonclustered located on PRIMARY Nonclustered located on PRIMARY

index_key IDCliente CP City

91

Crear y mantener ndices

Creacin de opciones de ndice

6.2

La opcin FILLFACTOR La opcin PAD_INDEX

SQL Server ofrece opciones de creacin de ndices que pueden acelerar la creacin de ndices y con el tiempo tambin realzar el rendimiento del ndice. La opcin FILLFACTOR Se puede utilizar esta opcin para optimizar el rendimiento de INSERT y UPDATE sobre tablas que contengan ndices agrupados o no agrupados. Cuando una pgina de ndice se llena, SQL Server debe tomar tiempo para dividir la pgina para crear espacio para las nuevas filas. Utilice FILLFACTOR para asignar un porcentaje de espacio libre en le nivel pgina de las pginas de ndice para reducir la divisin de pgina.

Nota: FILLFACTOR es aplicada solamente cuando el ndice es creado o regenerado. SQL Server no mantiene dinmicamente el porcentaje especificado de espacio asignado en las pginas de ndice. Especifica un porcentaje que indica cunto debe llenar SQL Server el nivel hoja de cada pgina de ndices durante la creacin de los mismos. Cuando se llena una pgina de ndices, SQL Server requiere tiempo para dividir la pgina de ndices y hacer sitio a las nuevas filas, lo que resulta bastante costoso. En el caso de las tablas con muchas actualizaciones, la eleccin adecuada de un valor para FILLFACTOR proporciona mejor rendimiento en las actualizaciones que un valor de FILLFACTOR inadecuado. El valor de FILLFACTOR original se almacena con el ndice en sysindexes. Cuando se especifica FILLFACTOR, SQL Server redondea el nmero de filas que debe colocarse en cada pgina. Por ejemplo, emitir CREATE CLUSTERED INDEX ... FILLFACTOR = 33 crea un ndice agrupado con un valor FILLFACTOR del 33 por ciento. Suponga que SQL Server calcula que 5,2 filas es el 33 por ciento del espacio de una pgina. SQL Server redondea esa cantidad, de forma que coloca seis filas en cada pgina. % FILLFACTOR 0(default) De 1 - 99 Pgina nivel hoja Pgina intermedia Completamente llena Una entrada libre Actividad de valores llave Sin modificacin ligera Moderada modificacin pesada Sin modificacin ligera

<= de FILLFACTOR Una entrada llena libre Completamente llena Una entrada libre

100

92

Crear y mantener ndices

Cuando se utilice la opcin FILLFACTOR, considerar los siguientes factores y directrices: FILLFACTOR valora el rango de 1 a 100%. El valor por defecto de FILLFACTOR es 0. Este valor rellena el nivel hoja de las pginas ndice al 100% y libera espacio para el tamao mximo de una entrada de ndice en el nivel intermedio de hoja de las pginas de ndice. No se puede especificar FILLFACTOR=0. Se puede cambiar el valor por defecto a nivel servidor usando sp_configure. Sysindexes almacena el valor de FILLFACTOR que fue aplicada la ltima vez, junto con otra informacin de ndice. El valor de FILLFACTOR es especificado en porcentajes. El porcentaje determina cuntas pginas del nivel-hoja deben ser llenadas. Por ejemplo, un factor de relleno de 65% llena el 65% de las pginas del nivel-hoja, liberando el 35% del espacio libre. El tamao de la fila tiene un impacto sobre cuantas filas pueden acomodarse dentro o llenar la pgina para el porcentaje especfico del factor de relleno. Utilice FILLFACTOR en tablas dentro de las cuales muchas filas son insertadas o cuando los valores de la llave del ndice agrupado son modificados con frecuencia.

La opcin PAD_INDEX Especifica el espacio que debe dejarse abierto en cada pgina (nodo) de los niveles intermedios del ndice. La opcin PAD_INDEX slo es til cuando se especifica tambin FILLFACTOR, porque PAD_INDEX utiliza el mismo porcentaje especificado por FILLFACTOR. De manera predeterminada, SQL Server asegura que cada pgina de ndice contiene suficiente espacio libre para acomodar al menos una fila del tamao mximo que pueda tener el ndice, dado el conjunto de claves de las pginas intermedias. Si el porcentaje especificado para FILLFACTOR no es suficientemente grande para acomodar una fila, SQL Server anula internamente el porcentaje para permitir el valor mnimo. Consideraciones: SQL Server aplica el porcentaje que la opcin FILLFACTOR especifica a las pginas de nivel-hoja y a nivel intermedio. Por defecto, SQL Server siempre libera suficiente espacio para acomodar a por lo menos una fila del tamao mximo del ndice para cada pgina de nivel intermedio, independientemente de qu tan alto est el valor de FILLFACTOR. El nmero de filas de una pgina de ndice de nivel-intermedio no es nunca inferior a dos, independientemente de lo bajo que sea el valor de FILLFACTOR. PAD_INDEX utiliza el valor del factor de relleno. Ejemplo: Este ejemplo crea un ndice IDOrden_ind sobre la columna IDOrden en la tabla Ordenes. Especificando PAD_INDEX con FILLFACTOR, SQL Server crea pginas de nivelhoja y nivel-intermedio que estan al 70% llenas. Sin embargo, sin la opcin PAD_INDEX, las pginas de nivel-hoja se llenan al 70% y las pginas de nivel-intermedio se llenan casi completamente. USE northwind CREATE INDEX IDOrden_ind ON Ordenes(IDOrden) WITH PAD_INDEX, FILLFACTOR=70

93

Crear y mantener ndices

Mantenimiento de ndices

6.3

Fragmentacin de datos La sentencia DBCC SHOWCONTIG La sentencia DBCC INDEXDEFRAG La opcin DROP_EXISTING

Los ndices se deben de mantener despus de ser creados para asegurar un rendimiento ptimo. Con el tiempo, los datos se fragmentan. SQL Server suministra un Asistente para Optimizacin de ndice que rastrea el uso de los ndices automticamente y asiste en el mantenimiento y creacin de ndices que realiza ptimamente.

Fragmentacin de datos Cmo ocurre La fragmentacin ocurre cuando el dato es modificado. Por ejemplo, cuando las filas de datos son agregadas o borradas de una tabla o cuando los valores de las columnas indizadas cambian, SQL Server ajusta las pginas de ndice para acomodar los cambios y mantener el almacenamiento de los datos indizados. El ajuste de las pginas de ndice es conocido como divisin de pgina. Este proceso incrementa el tamao de una tabla y el tiempo que requiere para procesar consultas. Mtodos de administrar la fragmentacin Existen dos mtodos de administrar la fragmentacin en SQL Server. El primero es borrar y recrear un ndice agrupado y especificar un valor para el factor de relleno utilizando FILLFACTOR. El segundo es regenerar un ndice y especificar un valor para el factor de relleno. Entorno de inters(o de negocio) El grado de fragmentacin que es aceptable en la base de datos depende del entorno: En un entorno de sistemas de procesamiento de transacciones en lnea (OLTP), la fragmentacin es benfica ya que un entorno OLTP es de escritura intensiva. Para un entorno de Servicio de Anlisis puede ser malo ya que el entorno es de lectura intensiva.

La sentencia DBCC SHOWCONTIG Esta sentencia presenta informacin sobre los datos e ndices de una tabla especfica. Qu determina esta sentencia Cuando se ejecuta DBCCSHOWCONTIG, SQL Server va a travs de las pginas de ndice al nivel-hoja para determinar si una tabla o ndice especfico estn muy fragmentados. Tambin determina si los datos y pginas de ndice estan llenos.

94

Crear y mantener ndices

Cuando ejecutar DBCC SHOWCONTIG 4 Ejecutar esta sentencia en tablas con muchas modificaciones, tablas que contengan datos importados o tablas que parezcan de bajo rendimiento de consultas. Cuando se ejecute esta sentencia, considerar los siguientes factores y directrices: SQL Server requiere que se haga referencia a cualquier ID de tabla o ndice,consultar la tabla sysindexes para obtener el ID de la tabla o ndice,determinar que tan seguido se debe ejecutar esta sentencia. Medir el nivel de actividad en una tabla en una base diaria, semanal o mensual. La siguiente tabla describe las estadsticas que la sentencia DBCC SHOWCONTIG retorna: Estadstica Descripcin Pages Scanned Extents Scanned Extent Switches Nmero de pginas de la tabla o el ndice. Nmero de extensiones de la tabla o el ndice. Nmero de veces que la instruccin DBCC se movi desde una extensin a otra mientras recorra las pginas de la tabla o del ndice. Nmero de pginas por extensin en la cadena de pginas. Best count es el nmero ideal de cambios de extensin si todo est vinculado de forma contigua. Actual count es el nmero real de cambios de extensin. El valor de densidad de recorrido es 100 si todo es contiguo; si es menor que 100, hay fragmentacin. La densidad de recorrido es un porcentaje. Porcentaje de pginas sin orden devueltas al recorrer las pginas de hoja de un ndice. Este nmero no es relevante para los montones e ndices de texto. Una pgina sin orden es aquella cuya siguiente pgina indicada en un IAM es diferente de la sealada por el puntero de pgina siguiente de la pgina hoja. Porcentaje de extensiones sin orden al recorrer las pginas hoja de un ndice. Este valor no es relevante para los montones. Una extensin sin orden es aquella en que la extensin que contiene la pgina actual de un ndice no es fsicamente la extensin siguiente a la que contiene la pgina anterior de un ndice. Valor promedio de los bytes libres de las pginas examinadas. Cuanto mayor sea este valor, menos pginas llenas hay. Los valores bajos son buenos indicadores. Este valor tambin est influido por el tamao de la fila; un tamao de fila grande puede provocar valores altos. Densidad de pgina promedio (como porcentaje). Este valor tiene en cuenta el tamao de la fila, de forma que es una medida ms precisa del grado de ocupacin de las pginas. Cuanto mayor sea el porcentaje, mejor.

Avg. Pages per Extent Scan Density [Best Count: Actual Count]

Logical Scan Fragmentation

Extent Scan Fragmentation

Avg. Bytes free per page

Avg. Page density (full)

Ayuda en pantalla de Ms SQL Server 2000.


95

Crear y mantener ndices

Sintaxis: DBCC SHOWCONTIG [ ( { table_name | table_id | view_name | view_id } [ , index_name | index_id ] ) ] [ WITH { ALL_INDEXES | FAST [ , ALL_INDEXES ] | TABLERESULTS [ , { ALL_INDEXES } ] [ , { FAST | ALL_LEVELS } ] } ]

Ejemplo: Este ejemplo ejecuta una sentencia que accesa a la tabla Clientes. USE Northwind DBCC SHOWCONTIG (Clientes, PK_Clientes) Resultado: DBCC SHOWCONTIG scanning 'Clientes' table ... Tabla: 'Clientes' ( 2073058421); ndice ID: 1, basededatos ID: 6 TABLE level scan performed. Pages scanned: 3 Extents scanned: 2 Extent switches: 1 Avg. Pages per Extents: 1.5 Scan Density [Best Count: Actual count]: 50.00%[1:2] Logical scan fragmentation: 0.00% Extent scan fragmentation: 50.00% Avg. Bytes free per page: 246.7 Avg. Page density (full): 96.95% DBCC excution completed. If DBCC printed error messages, contact your system administrator.

Sentencia DBCC INDEXDEFRAG Como los datos en una tabla cambian, los ndices llegan a fragmentarse. DBCC INDEXDEFRAG puede desfragmentar el nivel-hoja de ndices agrupados y no agrupados en tablas y vistas. Desfragmentar arregla las pginas de tal forma que el orden fsico de las pginas coincida con el orden lgico de izquierda-derecha de los nodos-hoja. Esta reordenamiento mejora el rendimiento del recorrido de ndice. Consideraciones: Compacta las pginas de un ndice, teniendo en cuenta el FILLFACTOR especificado cuando se cre el ndice. Las pginas vacas creadas como resultado de esta compactacin se quitarn. Si un ndice abarca ms de un archivo, DBCC INDEXDEFRAG desfragmenta los archivos de uno en uno. Las pginas no se migran entre archivos. Cada cinco minutos, DBCC INDEXDEFRAG informar al usuario del porcentaje estimado completado. DBCC INDEXDEFRAG puede terminarse en cualquier momento del proceso y se mantiene el trabajo finalizado.
96

Crear y mantener ndices

DBCC INDEXDEFRAG es una operacin en lnea. Mientras se ejecuta esta operacin, la tabla subyacente permanece disponible para los usuarios de la base de datos. Se puede tardar menos en desfragmentar un ndice relativamente poco fragmentado que en generar un ndice nuevo porque el tiempo de desfragmentacin est relacionado con el volumen de la fragmentacin. Un ndice muy fragmentado puede tardar mucho ms en desfragmentarse que en volver a generarse. Adems, la desfragmentacin siempre se registra, sin tener en cuenta la configuracin del modelo de recuperacin de la base de datos (vea ALTER DATABASE). La desfragmentacin de un ndice muy fragmentado puede generar ms informacin en el registro que una creacin de ndice registrada. No obstante, la desfragmentacin se realiza como una serie de transacciones cortas y, por tanto, no requiere un gran registro si se realizan con frecuencia copias de seguridad del registro o si la configuracin del modelo de recuperacin es SIMPLE. Adems, DBCC INDEXDEFRAG no le ayudar si se intercalan dos ndice en el disco, porque INDEXDEFRAG coloca las pginas en su lugar. Para mejorar la agrupacin de pginas, vuelva a generar el ndice.

Nota: DBCC INDEXDEFRAG no est aceptado para ser utilizado en las tablas de sistema.

ndices Desfragmentados vs. Reconstruidos El tiempo requerido para desfragmentar es relativo a la cantidad de fragmentacin. Un ndice muy desfragmentado quizs requiera ms tiempo que un reconstruido. Un ndice relativamente no fragmentado desfragmenta ms rpido que reconstruir un nuevo ndice.

Nota: Usar DBCC INDEXDEFRAG no mejora el rendimiento cuando los ndices son fsicamente desfragmentados en disco. Para desfragmentar un ndice fsicamente, reconstruir el ndice. Sintaxis: DBCC INDEXDEFRAG ( { database_name | database_id | 0 } , { table_name | table_id | 'view_name' | view_id } , { index_name | index_id } ) [ WITH NO_INFOMSGS ] Ejemplo: Este ejemplo ejecuta DBCC INDEXDEFRAG sobre el ndice mem_no_CL de la tabla miembros en la base de datos Crdito. DBCC INDEXDEFRAG (Credito, miembros, mem_no_CL) Resultado: Pginas escaneadas 150 1 fila(s) afectada(s) Pginas movidas 28 Pginas removidas 9

97

Crear y mantener ndices

La opcin DROP_EXISTING Usar esta opcin para cambiar las caractersticas de un ndice o para reconstruir ndices sin tener que borrar el ndice y recrearlo. El beneficio de usar DROP_EXISTING es que se puede modificar ndices creados con restricciones PRIMARY KEY o UNIQUE. Reconstruir un ndice Al ejecutar CREATE INDEX con la opcin DROP_EXISTING: Se reorganiza las pginas de nivel-hoja comprimiendo o expandiendo filas. Quita fragmentacin. Recalcula las estadsticas de ndice. Cambiar caractersticas de ndice Cuando se utiliza DROP_EXISTING, se pueden cambiar las siguientes caractersticas: Tipo Se puede cambiar un ndice no agrupado dentro de un ndice agrupado. Se puede cambiar un ndice agrupado dentro de un ndice no agrupado. Columnas ndice Se puede cambiar la definicin de ndice para especificar columnas diferentes. Se pueden especificar columnas adicionales o quitar columnas especificadas de un ndice compuesto. Se pueden cambiar las columnas ndice para ser nicas o no. Opciones Se puede cambiar el valor de porcentaje de FILLFACTOR o PAD INDEX. Cuando se utilice DROP_EXISTING, considerar los siguientes factores y directrices: Para un ndice agrupado, SQL Server requiere que se tenga 1.2 veces la cantidad de espacio en la tabla para organizar fsicamente los datos. DROP_EXISTING acelera el proceso de construccin de ndices agrupados y no agrupados eliminando el proceso de ordenamiento. Utilizar FILLFACTOR con DROP_EXISTING si se desea que las pginas de nivel-hoja sean llenadas a un porcentaje seguro. No se pueden reconstruidr ndices de tablas de sistema. DROP_EXISTING en ndices agrupados ayuda a evitar el trabajo innecesario de borrar y recrear ndices no agrupados si el ndice agrupado es reconstruido sobre la misma columna. Los ndices no agrupados son reconstruidos una vez y solamente si las llaves son diferentes. Ejemplo: Este ejemplo el ndice es redefinido como un ndice compuesto agrupado con una opcin especificada de llenar cada pgina al 65%. Fallar si un ndice agrupado ya existe en la tabla OrdenesDetalles. CREATE UNIQUE NONCLUSTERED INDEX U_IDOrden_IDProd ON [OrdenDetalles] (IDOrden, IDProd) WITH DROP_EXISTING, FILLFACTOR=65

Enhorabuena! Hasta aqu el participante ha aprendido a crear y mantener ndices. Ya es capaz de crear ndices de las tablas que cre e igualmente de dar mantenimiento a esos ndices.

98

Crear y mantener ndices

Prctica

6.4

Propsito Despus de completar estas prcticas, se debe ser capaz de: Crear ndices. Determinar el tamao y la densidad de ndices. Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\restore07a.cmd Este archivo restaura la base de datos ClassNorthWind a un estado requerido para sta prctica. Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 20 min. De manera personal, sin utilizar el manual del participante y en el orden de aparicin realice las siguientes prcticas: 1. Crear ndices. 2. Examinar la estructura de un ndice.

99

Vistas

7. Vistas

Contenido Introduccin a las vistas Ventajas de vistas Definir vistas Modificar datos a travs de vistas Optimizar el rendimiento utilizando vistas Prctica 7.1 7.2 7.3 7.4 7.5 7.6

En este captulo se aprender a definir vistas y sus ventajas. Se describe la creacin de vistas con ejemplos de proyecciones y uniones. Estos ejemplos ilustran cmo se incluyen columnas calculadas y funciones incorporadas en la definicin de una vista. Adems, se ver la modificacin de datos a travs de vistas. La ltima seccin precisa cmo mejorar el rendimiento. Al concluir este captulo el participante ser capaz de: Describir el concepto de una vista. Listar las ventajas de una vista. Definir una vista utilizando la sentencia CREATE VIEW. Modificar datos a travs de vistas. Optimizar el rendimiento usando vistas.

100

Vistas

Introduccin a las vistas

7.1

Una vista es una tabla virtual cuyo contenido est definido por una consulta. Al igual que una tabla real, una vista consta de un conjunto de columnas y filas de datos con un nombre. Sin embargo, la vista no existe como conjunto de valores de datos almacenados en una base de datos. Las tablas consultadas en una vista son llamadas tablas base. Con algunas excepciones, se puede nombrar y almacenar cualquier sentencia SELECT como una vista. Algunos ejemplos comunes de vistas son: Un subconjunto de filas o columnas de una tabla base. Una unin de dos o ms tablas base. Una liga de dos o ms tablas base. Un resumen estadstico de una tabla base. Un subconjunto de otra vista o alguna combinacin de vistas y tablas base. Ejemplo: Este ejemplo crea una vista en Northwind. La vistas despliega 2 columnas en la tabla Empleados. USE Northwind GO CREATE VIEW dbo.vistaEmpleados AS SELECT apellido, nombre FROM Empleados SELECT * FROM vistaEmpleados Resultado: Apellido Davolio Fuller Leverling . . Nombre Nancy Andrew Janet . .

(9 fila(s) afectada)

101

Vistas

Ventajas de vistas

7.2

Las vistas brindan varias ventajas, incluyendo el enfoque de datos para los usuarios, oculta la complejidad de la base de datos, simplifica la administracin de permisos de usuarios y organiza los datos para exportar a otras aplicaciones. Enfoque de datos para usuarios Las vistas crean un entorno controlado que permite accesar a datos especficos mientras que otros datos son cubiertos. Los datos que son innecesarios, susceptibles o inapropiados puede ser quitados de una vista. En suma, con los permisos apropiados y un poco de restricciones, los usuarios pueden modificar los datos que proveen las vistas. Ocultar la complejidad de la base de datos Las vistas protegen la complejidad del diseo de la base de datos del usuario. Estas proporcionan a los desarrolladores la habilidad de cambiar el diseo sin afectar la interaccin del usuario con la base de datos. En suma, los usuarios pueden ser una versin amigable de los datos usando nombres que son ms fciles de entender que nombres estructurados con la nomenclatura de bases de datos. Simplificar la administracin de permisos de usuarios En lugar de conceder permisos para usuarios para consultar columnas especficas en las tablas base, los propietarios de la base de datos pueden conceder permisos para que los usuarios consulten los datos a travs de vistas. De esta forma, se protegen posibles cambios en el diseo de las tablas base subyacentes. Las vistas se utilizan para alguna de estas funciones, o para todas: Restringir el acceso del usuario a filas concretas de una tabla. Por ejemplo, permitir que un empleado slo vea las filas que guardan su trabajo en una tabla de seguimiento de actividad laboral. Restringir el acceso del usuario a columnas especficas. Por ejemplo, permitir que los empleados que no trabajen en el departamento de nminas vean las columnas de nombre, oficina, telfono y departamento de la tabla de empleados, pero no permitir que vean las columnas con los datos de salario u otra informacin personal. Combinar columnas de varias tablas de forma que parezcan una sola tabla. Agregar informacin en lugar de presentar los detalles. Por ejemplo, presentar la suma de una columna o el valor mximo o mnimo de una columna. Mejorar el rendimiento Como las vistas almacenan consultas complejas, otras consultas pueden utilizar estos resultados. Las vistas permiten particionar datos. Las vistas con particiones se pueden utilizar para distribuir el procesamiento de la base de datos en un grupo de servidores. El grupo de servidores tiene las mismas ventajas en el rendimiento que un clster de servidores y se puede utilizar para admitir las necesidades de procesamiento de grandes sitios Web o centros de datos corporativos.

102

Vistas

Definir vistas

7.3

Crear vistas Ejemplo de una vista con tablas asociadas(join) Alterar y borrar una vista Evitar romper cadenas de propiedad Localizar informacin de la definicin de vistas Esconder definicin de vistas

En esta seccin se ver cmo crear, alterar y borrar vistas. Tambin, cmo evitar romper cadenas de propiedad, esconder y localizar informacin de vistas en una base de datos. Crear vistas Cuando se trata de crear una base de datos SQL Server verifica la existencia de los objetos referenciados en la definicin de la vista. Al dar un nombre a una vista se deben seguir las reglas para identificadores para distinguir los nombres de tabla de los de vista. Por ejemplo, vwSueldos. Sintaxis: CREATE VIEW [< owner > . ] view_name [ ( column [ ,...n ] ) ] [ WITH < view_attribute > [ ,...n ] ] AS select_statement [ WITH CHECK OPTION ] Para crear una vista, debe contar con el permiso del propietario de la base de datos y con los permisos correspondientes para cualquier tabla o vista a la que se haga referencia en la definicin de la vista. Para evitar diferencias entre propietarios de tablas y vistas, es recomendable asignar como propietario de todos los objetos al usuario dbo cuando se creen; de otra manera el objeto ser creado con el nombre del usuario como propietario de ese objeto. Las vistas pueden ser tan complejas como se desee. Se deben especificar nombres de columnas si: Alguna de las columnas de la vista derive de una expresin aritmtica, una funcin integrada o una constante. Dos o ms columnas de la vista tuviesen, en caso contrario, el mismo nombre (normalmente, debido a que la definicin de la vista incluye una combinacin y las columnas de dos o ms tablas diferentes tienen el mismo nombre). Desee darle a una columna de la vista un nombre distinto del de la columna de la que deriva. (Tambin puede cambiar el nombre de las columnas en la vista). Una columna de una vista hereda los tipos de datos de la columna de la que deriva, aunque no cambie su nombre. Esta regla no se aplica cuando una vista se basa en una consulta que contiene una combinacin externa, ya que las columnas pueden cambiar al pasar de no permitir valores NULL a permitirlos. Es recomendable probar la sentencia SELECT antes de crear la vista para asegurar los resultados esperados.

103

Vistas

Restricciones Slo puede crear vistas en la base de datos actual. Sin embargo, las tablas y las vistas a las que se haga referencia desde la nueva vista pueden encontrarse en otras bases de datos e, incluso, en otros servidores, si la vista se define mediante consultas distribuidas. Los nombres de las vistas deben seguir las reglas para los identificadores y ser nicos para cada usuario. Adems, el nombre debe ser distinto del de las tablas que posee el usuario. Se pueden generar vistas dentro de otras vistas y en procedimientos que hagan referencia a vistas. Microsoft SQL Server 2000 permite anidar hasta 32 niveles de vistas. No puede asociar con las vistas reglas ni definiciones DEFAULT. Los desencadenadores AFTER no se pueden asociar con las vistas; slo se pueden asociar los desencadenadores INSTEAD OF. La consulta que defina la vista no puede incluir las clusulas ORDER BY, COMPUTE o COMPUTE BY, ni la palabra clave INTO. CREATE VIEW puede incluir ORDER BY, slo si la palabra clave TOP es usada. Las vistas no pueden referenciar a ms de 1,024 columnas. No se pueden crear vistas temporales, ni vistas dentro de tablas temporales. CREATE VIEW no puede ser combinada con otras sentencias de SQL-Transact en un slo lote. Ejemplo1: He aqu un ejemplo de vista que crea un columna (Subtotal) que calcula el subtotal de una orden desde las columnas PrecioUnitario, Cantidad y Descuento. CREATE VIEW dbo.vwSubtotalOrden (IDOrden, Subtotal) AS SELECT OD.IDOrden, SUM(CONVERT( money,(OD.PrecioUnitario*Cantidad*(1-discount)/100)) * 100) FROM [OrdenDetalles] OD GROUP BY OD.IDOrden GO Ejemplo2: Este ejemplo consulta la vista creada en el ejemplo1. SELECT * FROM vwSubtotalOrden resultado: IDOrden 10271 10977 10440 . . . (830 fila(s) afectadas) Ejemplo de una vista con tablas asociadas (joined) A menudo se crean vistas para proporcionar una manera fcil de ver informacin desde dos o ms tablas asociadas en un lugar central.
104

Subtotal 48000 2233000 4924.14 . . .

Vistas

En este ejemplo, vwShipstatus esta asociada con Ordenes y Clientes. USE Northwind GO CREATE VIEW dbo.vwShipstatus AS SELECT IDOrden,ShippedDate,Contacto FROM Clientes c INNER JOIN Ordenes o ON c.IDCliente =o.IDCliente WHERE RequiredDate < ShippedDate SELECT * FROM vwShipstatus Resultado: Idorden 10264 10271 10280 . . . (37 fila(s) afectadas) ShippedDate 1996-08-23 1996-08-30 1996-09-12 . . . Contacto Maria Prez Arturo Brain Cristina Vergara . . .

Alterar y borrar una vista Se puede alterar una vista borrndola y recrendola o ejecutando ALTER VIEW. ALTER VIEW cambia la definicin de una vista, incluyendo vistas indizadas, sin afectar procedimientos almacenados dependientes o desencadenantes. Esta sentencia est sujeta a las mismas restricciones que CREATE VIEW. Si se borra una vista y se recrea, se deben reasignar los permisos sobre sta.

105

Vistas

Sintaxis: ALTER VIEW [ < database_name > . ] [ < owner > . ] view_name [ ( column [ ,...n ] ) ] [ WITH {ENCRIPTION | SCHEMABINDING | VIEW_METADATA} [ ,...n ] ] AS select_statement [ WITH CHECK OPTION ]

Nota: Si la definicin de vista se cre mediante WITH ENCRYPTION o CHECK OPTION, estas opciones slo se habilitan si se incluyen en ALTER VIEW.

Ejemplo: El siguiente ejemplo altera la vista vwEmpleados la agregar una columna. USE Northwind GO ALTER VIEW dbo.vwEmpleados AS SELECT Apellido,Nombre, extensio FROM empleados Consulta: SELECT * FROM dbo.vwEmpleados Resultado: Apellido Davolio Fuller Leverling . .. ... (9 fila(s) afectadas) Nombre Nancy Andrew Janet ... ... Extensin 5467 3457 3355 ... ...

Nota: Si se define una vista con 'SELECT *' y se altera la estructura de las tablas adyacentes agregando columnas, las nuevas columnas no aparecern en la vista. Cuando todas las columnas estn seleccionadas en un CREATE VIEW, la lista de columnas es interpretada solamente como se cre la vista. Para ver las nuevas columnas en la vista, se debe alterar la vista.

DROP VIEW se utiliza para quitar una definicin de vista. Al borrar la definicin de una vista se borran tambin todos los permisos asignados a esta. Adems, si los usuarios consultan cualquier vista que haga referencia a la vista borrada, ellos recibirn un mensaje de error. Sin embargo, al borrar una tabla que haga referencia a una vista no borra la vista automticamente sino que se debe borrar explcitamente.

Nota: El permiso para borrar una vista va al propietario y no es transferible. Es por defecto. Sin embargo, el administrador del sistema o el propietario de la base de datos pueden
106

Vistas

borrar cualquier objeto especificando el nombre del propietario en DROP VIEW.

Evitar romper cadenas de propiedad SQL Server permite al propietario de un objeto original mantener control sobre usuarios autorizados para accesar el objeto. Las definiciones de vista dependen de objetos subyacente s(vistas o tablas). Estas dependencias pueden ser imaginadas como las cadenas de dependencia. Si un propietario de una vista tambin posee los objetos adyacentes, solamente el propietario concede permiso a la vista. Cuando el objeto es usado, los permisos son checados solamente en la vista. Para evitar romper las cadenas de propiedad, el usuario dbo debe apropiarse de todas las vistas. Cuando el objeto es utilizado, los permisos son checados en cada objeto dependiente con un propietario diferente. Ejemplo: Maria crea una vista vw2. Con la siguiente sentencia concede permiso de acceso a Pierre. GRANT SELECT ON vw2 TO Pierre Sin embargo, maria.vw2 depende de un objeto, propiedad de otro usuario(Lucia). Los permisos son checados en cada objeto dependiente con diferentes propietarios. Pierre consulta la vista usando la siguiente sentencia: SELECT * FROM Maria.vw2 Ya que maria.vw2 depende de lucia.vw1, SQL Server checa los permisos de maria.vw2 y de lucia.vw1. Si Lucia ha otorgado previamente permiso de acceso a Pierre sobre vw1, Pierre tambin puede accesar; de lo contrario se le niega el acceso, permitiendo a Lucia mantener el control sobre personas a quienes les autorice el acceso a los objetos que ella cree. Localizar informacin de la definicin de vistas Se puede ver la definicin de una vista para alterar la definicin de la vista o para entender cmo resultaron sus datos desde una tabla base. Se puede localizar informacin de definicin de vista con el administrador corporativo o ejecutando las siguientes vistas y tablas de sistema: Vista del esquema informacin o tabla de sistema INFORMATION_SCHEMA.TABLES or sysobjects INFORMATION_SCHEMA.VIEW_TABLE_USAGE or sysdepends INFORMATION_SCHEMA.VIEWS or syscomments INFORMATION_SCHEMA.VIEW_COLUMN_USAGE or syscolumns Despliega informacin Nombres de vista. Nombre de objetos base Definicin de vista Columnas definidas en una vista

107

Vistas

Nota: INFORMATION_SCHEMA.VIEW_TABLE_USAGE y ...VIEW_COLUMN_USAGE despliegan informacin para el nombre del usuario solamente. Para desplegar el texto que fue usado para crear una vista, utilizar el administrador corporativo, consultar INFORMATION_SCHEMA.VIEWS or ejecutar sp_helptext con el nombre de la vista como parmetro: Sintaxtis: sp_helptext objname

Para recuperar un informe de las tablas o vistas en la que depende una vista y de objetos que dependen de una vista particular, utilizar el administrador corporativo o ejecutar el procedimiento almacenado de sistema sp_depends. Se deben ver las dependencias antes de borrar cualquier objeto. Antes de alterar o borrar una tabla, utilizar sp_depends para determinar si cualquier objeto hace referencia a la tabla. Sintaxis: sp_depends objname

Esconder definiciones de vista Ya que un usuario puede pesplegar la informacin de una vista, si desea tambin puede esconder ciertas definiciones de una vista. Se pueden encriptar las entradas de datos a la tabla syscomments que contiene el texto de la sentencia CREATE VIEW especificando en su definicin WITH ENCRYPTION. Antes de encriptar una vista, asegurarse que la definicin de la vista(script) ha sido guardada en un archivo. Para desencriptar el texto de una vista, se debe borrar la vista y recrearla o alterar la vista y usar la sintaxis original. Ejemplo: En este ejemplo, dbo.[subtotal Orden] se crea usando la opcin WITH ENCRYPTION para esconder la definicin de la vista. USE Northwind GO CREATE VIEW dbo.[Subtotal Orden] WITH ENCRYPTION AS SELECT IDOrden, sum(CONVERT(money,(PrecioUnitario*Cantidad*(1-discount)/100))*100) as Subtotal FROM OrdenDetalles GROUP BY IDOrden Cuando las consideraciones de seguridad requieren que la definicin de la vista no est disponible para los usuarios, encriptar. Nunca borra entradas de la tabla syscomments.

108

Vistas

Modificar datos a travs de vistas

7.4

No se puede afectar a ms de una tabla adyacente No se puede realizar para ciertas columnas Puede causar errores si afectan columnas que no son referenciadas en la vista. Son verificadas si el WITH CHECK POINT ha sido especificado.

Las vistas no mantienen una copia separa de datos. En su lugar, muestran el conjunto de resultados de una consulta de una o ms tablas base. En consecuencia, dondequiera que se modifiquen datos en la vista, se actualizarn en la tabla base. Con algunas restricciones, se pueden insertar, actualizar o borrar datos a travs de una vista. En general, una vista debe ser definida sobre una tabla individual y no debe incluir funciones agregadas o clusulas GOUP BY en la sentencia SELECT. Especficamente, las modificaciones que son hechas utilizando vistas: No afectan ms que a una tabla adyacente. Se pueden modificar vistas que son resultado de 2 o ms tablas, pero cada actualizacin o modificacin puede afectar solamente una tabla. No se pueden ser hechas en ciertas columnas. SQL Server no permite que se cambie una columna que es el resultado de un clculo, tal como las columnas que contienen valores calculados, funciones incorporadas o funciones de filas agregadas. Pueden causar errores si las modificaciones afectan a columnas que estn referenciadas en una vista. Por ejemplo, se recibir un mensaje de error al querer insertar una fila dentro de una vista que est definida en una tabla que contiene columnas que no son referenciadas en la vista y que no permite NULL o contiene valores por defecto. Son verificadas si WITH CHECK OPTION ha sido especificada en la definicin de la vista. La opcin WITH CHECH OPTION exige que todas las instrucciones de modificacin de datos ejecutadas contra la vista se adhieran a los criterios establecidos en SELECT, que define la vista. Si los valores cambiados estn fuera del rango de la definicin de la vista, SQL Server rechaza las modificaciones.

109

Vistas

Optimizar el rendimiento usando vistas

7.5

Consideraciones de rendimiento Vistas indizadas Vistas con particiones

En esta seccin se describen las consideraciones de rendimiento al usar vistas y cmo las vistas permiten optimizar el rendimiento ordenando los resultados de consultas complejas y particionando datos. Consideraciones de rendimiento Cuando las vistas que asocian varias tablas y evalan expresiones complejas son anidadas con otra vista, la fuente inmediata de cualquier problema de rendimiento puede ser difcil de determinar. Por tanto, considrese crear definiciones de vistas separadas antes que vistas anidadas. Ejemplo: En el siguiente ejemplo, vwTopSales consulta a un subconjunto de filas desde vwTotalPurchase. USE Northwind GO CREATE VIEW dbo.vwTopSales AS SELECT * FROM dbo.vwTotalPurchase WHERE Subtotal >50000 GO Las definicin de vista de dbo.vwTopSales esconde la complejidad de la consulta subyacente que es usada para crear vwtotalPurchase, la cual asocia 3 tablas base. USE Northwind GO CREATE VIEW dbo.vwTotalPurchase AS SELECT Compania, sum(CONVERT(money,(PrecioUnitario*Cantidad*(1-discount)/100))*100) as Subtotal FROM clientes c INNER JOIN Ordenes o ON c.IDClientes = o.IDCliente INNER JOIN OrdenDetalles od ON o.IDOrden = od.IDOrden GROUP BY Compania GO Cuando los usuarios experimenten cualquier problema de rendimiento cuando ejecutend la siguiente consulta, el origen del problema no ser fcilmente visible: SELECT * FROM dbo.Topsales
110

Vistas

WHERE Compania= 'Ernst Handel' Resultado: Compania Ernest Handel (1 fila(s) afectadas) Subtotal 104874.98

Vistas indizadas Se pueden crear ndices sobre vistas. Una vista indizada almacena un conjunto de resultados de una vista en la base de datos. A causa del tiempo rpido de recuperacin, se puede usar vistas indizadas para mejorar el rendimiento de la consulta. Crear una vista indizada Para crear una vista indizada implementar un ndice UNIQUE CLUSTERED en la vista. Los resultados de la vista son almacenados en las pginas de nivel-hoja del ndice agrupado. Antes de crear un ndice UNIQUE CLUSTERED, se pueden crear otros ndices en la vista. Una vista indizada automticamente refleja las modificaciones hechas a los datos en las tablas base. Como los datos cambian, el ndice UNIQUE CLUSTERED se actualiza. Consideraciones Al usar el Asistente para optimizar ndices, se puede incrementar grandemente la habilidad para determinar la mejor combinacin de ndices y vistas indizadas para optimizar el rendimiento de la consulta. El mejor rendimiento de las vistas indizadas se obtiene cuando : Se actualizan los datos subyacentes con frecuencia. El mantenimiento de una vista indizada puede ser superior al costo de mantenimiento de un ndice de tabla. Si se actualizan frecuentemente los datos subyacentes, el costo de mantener la vista indizada puede no compensar las ventajas que se obtienen en el rendimiento al utilizarla. Restricciones Considerar las siguientes directrices al crear una vista indizada: El primer ndice que se cree en una vista debe ser un ndice agrupado nico. Se debe crear la vista con la opcin SCHEMABINDING. Una vista puede referenciar tablas base, pero no pude referenciar a otras vistas. Se debe utilizar nombres de dos partes para referir a una tabla y a funciones definidas por el usuario (ejemplo: dbo.tablaname, dbo.guardar). Las conexiones subsecuentes deben tener las mismas configuraciones para usar las vistas indizadas.

Nota: Se debe usar la propiedad IsIndexable de la funcin OBJECTPROPERTY para asegurarse que se puede indizar la vista.

111

Vistas

Particin de datos Una vista con particiones es una vista que se define mediante la instruccin UNION ALL, es decir, uniendo todas las tablas miembro estructuradas de la misma manera pero almacenadas en diferentes tablas del mismo servidor SQL Server o en un grupo de servidores SQL Server 2000 autnomos, denominado Servidores federados de SQL Server 2000. Si disea un esquema de particin, debe tener claro qu datos pertenecen a cada particin. Por ejemplo, si tiene los datos de la tabla Customers distribuidos en tres tablas miembro situadas en tres ubicaciones de servidor (Customers_33 en Server1, Customers_66 en Server2 y Customers_99 en Server3), una vista con particiones en Server1 se definira de esta manera: --Partitioned view as defined on Server1 CREATE VIEW Customers AS --Select from local member table SELECT * FROM CompanyData.dbo.Customers_33 UNION ALL --Select from member table on Server2 SELECT * FROM Server2.CompanyData.dbo.Customers_66 UNION ALL --Select from member table on Server3 SELECT * FROM Server3.CompanyData.dbo.Customers_99 En general, se dice que una vista tiene particiones si tiene la siguiente forma: SELECT <select_list1> FROM T1 UNION ALL SELECT <select_list2> FROM T2 UNION ALL ... SELECT <select_listn> FROM Tn

Nota: No se puede crear un ndice sobre una vista particionada. La definicin de la vista requerida para construir la vista indizada solamente permite nombres de dos partes; una vista particionada requiere el uso de 3 o ms partes de nombres, como nombreserver.NombreBD.Propietario.Objeto.

Enhorabuena! El participante ya ha aprendido a obtener datos predefinidos a travs del diseo de vistas. Desde cmo crear una vista, modificarla y optimizarla.

112

Vistas

Prctica

7.6

Propsito Despus de completar estas prcticas, se debe ser capaz de: Crear una vista usando el asistente. Alterar una vista para encriptar su definicin. Alterar una vista usando WITH CHECK OPTION. Utilizar el esquema de informacin para obtener informacin de vistas. Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\restore08.cmd Este archivo restaura la base de datos ClassNorthWind a un estado requerido para sta prctica. Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 40 min. De manera personal, sin utilizar el manual del participante y en el orden de aparicin realice las siguientes prcticas: 1. Crear y probar vistas 2. Encriptar una definicin de Vista 3. Localizar definiciones de vistas.

113

Procedimientos almacenados

8. Procedimientos almacenados

Contenido Introduccin a los procedimientos almacenados Crear, ejecutar, modificar y borrar procedimientos almacenados Prctica 1 Usar parmetros en procedimientos almacenados Ejecutar procedimientos almacenados extendidos Manejar mensajes de error Consideraciones de rendimiento Prctica2 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8

En este captulo se aprender a utilizar los diferentes tipos de procedimientos. Al crear una aplicacin con Microsoft SQL Server 2000 puede almacenar localmente los programas y crear aplicaciones que enven los comandos a SQL Server y procesen los resultados, o bien almacenar los programas como Procedimientos almacenados en SQL Server y crear aplicaciones que ejecuten los procedimientos almacenados y procesen los resultados. Al concluir este captulo el participante ser capaz de: Describir cmo se procesa un procedimiento almacenado. Crear, ejecutar, modificar y borrar procedimientos almacenados. Crear procedimientos almacenados que acepten parmetros. Ejecutar procedimientos almacenados extendidos. Crear mensajes de error personalizados.

114

Procedimientos almacenados

Introduccin a los procedimientos almacenados

8.1

Definir procedimientos almacenados Proceso inicial de los procedimientos almacenados Procesamiento subsiguiente de los procedimientos almacenados Ventajas de los procedimientos almacenados

En esta seccin ven los diferentes tipos de procedimientos almacenados de SQL Server 2000, se describe cmo son procesados los procedimientos almacenados ambos, proceso inicial y subsiguiente y se enlistan algunas ventajas de los procedimientos almacenados.

Definir procedimientos almacenados Un procedimiento almacenado es un grupo de instrucciones Transact-SQL compiladas en un nico plan de ejecucin. Los procedimientos almacenados de Microsoft SQL Server 2000 devuelven datos de cuatro formas distintas: Parmetros de salida, que pueden devolver datos (por ejemplo, un valor entero o de carcter) o una variable de cursor (los cursores son conjuntos de resultados que pueden devolver filas de una en una). Cdigos de retorno, que siempre son un valor entero. Un conjunto de resultados por cada instruccin SELECT contenida en el procedimiento almacenado o en cualquier otro procedimiento almacenado invocado por el procedimiento almacenado original. Un cursor global al que se puede hacer referencia desde fuera del procedimiento almacenado. SQL Soporta 5 tipos de procedimientos almacenados: de sistema (sp_) Almacenados en la base de datos master, los procedimientos almacenados de sistema(identificados por el prefijo sp_) proveen un mtodo efectivo para la recuperacin de informacin de las tablas de sistema. Estas permiten a los administradores del sistema ejecutar tareas de administracin de base de datos que actualicen las tablas de sistema aun cuando los administradores no tengan permiso de actualizar las tablas subyacentes directamente. Los procedimientos almacenados pueden ser ejecutados en cualquier base de datos. Locales Los procedimientos almacenados locales son creados en bases de datos individuales de usuario. Temporales Los procedimientos almacenados temporales se almacenan en tempdb y son tiles en las conexiones con versiones anteriores de SQL Server. Estos pueden ser locales, con nombres que empiecen con un signo de nmero (#) o globales con nombres que empiecen con doble signo numrico (##). Remotos Los procedimientos almacenados remotos son una caracterstica heredada de SQL Server 2000. Su funcionalidad en Transact-SQL se limita a ejecutar un procedimiento almacenado en una instalacin remota de SQL Server. Las consultas
115

Procedimientos almacenados

distribuidas que se introducen en la versin 7.0 de SQL Server admiten esta capacidad, as como la capacidad de tener acceso directamente a tablas de orgenes de datos OLE DB vinculados heterogneos desde las instrucciones Transact-SQL locales. En lugar de utilizar una llamada a un procedimiento remoto en SQL Server 2000, utilice consultas distribuidas y una instruccin EXECUTE para ejecutar un procedimiento almacenado en un servidor remoto. Extendidos(xp_) Los procedimientos almacenados extendidos permiten crear rutinas externas propias(DLL), en un lenguaje de programacin como C. Estos procedimientos se muestran ante los usuarios como procedimientos almacenados normales y se ejecutan del mismo modo. Es posible pasar parmetros procedimientos almacenados extendidos y pueden devolver resultados y estados. Los procedimientos almacenados extendidos pueden utilizarse para ampliar las posibilidades de SQL Server 2000. Los procedimientos almacenados de SQL Server son similares a los procedimientos de otros lenguajes de programacin en el sentido de que pueden: Aceptar parmetros de entrada y devolver varios valores en forma de parmetros de salida al lote o al procedimiento que realiza la llamada. Contener instrucciones de programacin que realicen operaciones en la base de datos, incluidas las llamadas a otros procedimientos. Devolver un valor de estado a un lote o a un procedimiento que realiza una llamada para indicar si la operacin se ha realizado correctamente o ha habido un error (y el motivo del mismo).

Proceso inicial del los procedimientos almacenados El proceso de un procedimiento almacenado incluye su creacin y su ejecucin desde la primera vez, la cual ubica su plan de ejecucin en el cach del procedimiento. El chach del procedimiento es un conjunto de memoria que contiene los planes de ejecucin para todas las sentencias de Transact-SQL actualmente ejecutndose. Microsoft SQL Server 2000 tiene un bfer de memoria que se utiliza para almacenar planes de ejecucin y bferes de datos. El porcentaje del bfer de memoria que se asigna a los planes de ejecucin o a los bferes de datos vara dinmicamente segn el estado del sistema. La parte del bfer de memoria que se utiliza para almacenar los planes de ejecucin se denomina cach de procedimientos. Creacin Cuando un procedimiento almacenado es creado, sus sentencias son analizadas una a una para verificar lo sintctico, luego, SQL Server almacena el nombre del procedimiento en sysobject y el texto del procedimiento en syscomments de la actual base de datos. Si existe un error el procedimiento no se crea. Resolucin diferida de nombres SQL Server permite que los procedimientos almacenados Transact-SQL hagan referencia a tablas que no existen en el momento de la creacin. Esta capacidad se denomina resolucin diferida de nombres. Si la tabla a la que se hace referencia no existe, se devuelve un mensaje de error en tiempo de ejecucin. Cuando se ejecuta un procedimiento almacenado por primera vez, el procesador de consultas lee el texto correspondiente en la tabla del sistema syscomments del procedimiento y comprueba si estn presentes los nombres de los objetos que ste utiliza.
116

Procedimientos almacenados

Este proceso se denomina resolucin diferida de nombres porque los objetos de tabla a los que hace referencia el procedimiento almacenado no tienen por qu existir cuando se crea ste, sino slo cuando se ejecuta.

Nota:La resolucin diferida de nombres slo se puede utilizar cuando se hace referencia a objetos de tabla no existentes. Todos los dems objetos deben existir en el momento en que se crea el procedimiento almacenado. Por ejemplo, cuando se hace referencia a una tabla existente en un procedimiento almacenado, no se pueden listar columnas no existentes para la misma. Ejecucin (Primera vez o recompilacin) Cuando una instruccin CREATE PROCEDURE se ejecuta correctamente, el nombre del procedimiento se almacena en la tabla del sistema sysobjects y el texto de la instruccin CREATE PROCEDURE se almacena en syscomments. Cuando se ejecuta por primera vez, el procedimiento se compila para determinar que dispone de un plan de acceso ptimo para recuperar los datos. Los cambios seguros en una base de datos pueden causar que un plan de ejecucin sea o ineficiente o no vlido por ms tiempo. SQL Server detecta estos cambios y automticamente recompila el plan de ejecucin cuando: Cualquier cambio estructural hecha a una tabla o a una vista referenciada por una consulta (ALTER TABLA y ALTER VIEW) Las nuevas estadsticas de distribucin son generadas ya sea desde una sentencia como UPDATE STATISTICS o ya sea automticamente. Un ndice un ndice utilizado por el plan de ejecucin es borrado. Cambios significativos son hechos a las llaves ( las sentencias INSERT o DELETE) para una tabla referenciada en una consulta. Optimizacin Si la ejecucin del procedimiento supera sin problemas la etapa de resolucin, el optimizador de consultas de SQL Server analiza las instrucciones de Transact-SQL del procedimiento almacenado y crea un plan de ejecucin. El plan de ejecucin describe el mtodo ms rpido para ejecutar el procedimiento, a partir de informacin como la siguiente: La cantidad de datos que hay en las tablas. La naturaleza y la presencia de ndices en las tablas, as como la distribucin de los datos en las columnas indizadas. Los operadores y los valores de comparacin utilizados en las condiciones de las clusulas WHERE. La presencia de combinaciones y de las palabras clave UNION, GROUP BY y ORDER BY. Despus de haber analizado estos factores en el procedimiento almacenado, el optimizador de consultas coloca el plan de ejecucin en la memoria. El proceso consistente en analizar el procedimiento almacenado y crear un plan de consultas se denomina compilacin. El plan de ejecucin en memoria optimizado se utiliza para ejecutar la consulta. Este plan permanece en memoria hasta que se reinicie SQL Server o hasta que se necesite espacio para el almacenamiento de otro objeto. Los factores que incrementan el valor de un plan incluyen los siguientes: Tiempo requerido para recompilar(alto costo de compilacin) Frecuencia de uso
117

Procedimientos almacenados

Procesamiento subsiguiente de los procedimientos almacenados El procesamiento subsiguiente de un procedimiento almacenado es ms rpido que un procesamiento inicial, ya que SQL Server utiliza el plan de ejecucin optimizado en el cach del procedimiento. Si las siguientes condiciones se aplican, SQL Server utiliza el plan en memoria para ejecutar la consulta subsiguiente: El entorno actual es el mismo que el entorno en el que fue compilado el plan. Los objetos a los que se refiere el procedimiento almacenado no requieren resolucin de nombre. Los objetos requieren resolucin de nombre cuando los objetos que son propiedad de diferentes usuarios tienen los mismos nombres. Por ejemplo, si el rol Ventas posee una tabla Productos y el rol Desarrollo posee una tabla Productos, SQL Server debe determinar la tabla sobre la cual operar cada vez que se hace referencia a la tabla Productos. Los planes de ejecucin de SQL Server tienen dos componentes principales: Plan de consultas La mayor parte del plan de ejecucin es una estructura de datos reentrante de slo lectura que cualquier nmero de usuarios puede utilizar. Esto se denomina plan de consultas. No se almacena ningn contexto de usuario en el plan de consultas. Nunca hay ms de una o dos copias del plan de consultas en memoria: una copia para todas las ejecuciones en serie y otra para las ejecuciones en paralelo. La copia en paralelo cubre todas las ejecuciones en paralelo, sin tener en cuenta el grado de paralelismo. Contexto de ejecucin Cada usuario que ejecuta la consulta tiene una estructura que alberga los datos especficos de dicha ejecucin, como los valores de los parmetros. Esta estructura de datos se denomina contexto de ejecucin. Las estructuras de datos del contexto de ejecucin se vuelven a utilizar. Si un usuario ejecuta una consulta y una de las estructuras no est en uso, sta se reinicializa con el contexto del nuevo usuario. Cuando se ejecuta una instruccin SQL en SQL Server 2000, el motor relacional mira primero en la cach de procedimientos para ver si existe un plan de ejecucin para la misma instruccin SQL. SQL Server 2000 vuelve a utilizar cualquier plan existente que encuentre, lo que evita la carga de trabajo que supone volver a compilar la instruccin SQL. Si no existe un plan actualmente, SQL Server 2000 genera un nuevo plan de ejecucin.

Plan de consulta
Select * FROM dbo.miembors WHERE NoMiembro=?

Contexto de
Conexin 1 8082 Conexin 2 24 Conexin 3 1003

El plan no usado queda

118

Procedimientos almacenados

Ventajas de los procedimientos almacenados Utilizar procedimientos almacenados en SQL Server en vez de programas Transact-SQL almacenados localmente en equipos clientes presenta las siguientes ventajas: Permiten una programacin modular. Puede crear el procedimiento una vez, almacenarlo en la base de datos y llamarlo desde el programa tantas veces como desee. Un especialista en programacin de bases de datos puede crear procedimientos almacenados, que luego ser posible modificar independientemente del cdigo fuente del programa. Permiten una ejecucin ms rpida. En los casos en que la operacin requiere una gran cantidad de cdigo Transact-SQL o se realiza repetidas veces, los procedimientos almacenados pueden ser ms rpidos que los lotes de cdigo Transact-SQL. Los procedimientos son analizados y optimizados despus de haberlos ejecutado una primera vez, y es posible utilizar una versin compilada del procedimiento que se encuentra en la memoria. Esto significa que no es necesario volver a analizar y optimizar el procedimiento almacenado para cada uso, lo que permite una ejecucin mucho ms rpida. Pueden reducir el trfico de red. Una operacin que necesite centenares de lneas de cdigo Transact-SQL puede realizarse mediante una sola instruccin que ejecute el cdigo en un procedimiento, en vez de enviar cientos de lneas de cdigo por la red. Pueden utilizarse como mecanismo de seguridad. Es posible conceder permisos a los usuarios para ejecutar un procedimiento almacenado, incluso si no cuentan con permiso para ejecutar directamente las instrucciones del procedimiento.

119

Procedimientos almacenados

Crear borrar, ejecutar, modificar y borrar procedimientos almacenados

8.2

Crear procedimientos almacenados Directrices para crear procedimientos almacenados Ejecutar procedimientos almacenados Alterar y borrar procedimientos almacenados

Crear procedimientos almacenados Se pueden crear procedimientos almacenados en la base de datos actual solamente excepto para los temporales que son creados en tempdb. CREATE PROCEDURE Puede crear procedimientos almacenados mediante la instruccin CREATE PROCEDURE de Transact-SQL. Pero antes de crear uno, tenga en cuenta lo siguiente: Las instrucciones CREATE PROCEDURE no se pueden combinar con otras instrucciones SQL en el mismo lote. De forma predeterminada, el permiso para crear procedimientos almacenados corresponde al propietario de la base de datos, que puede transferirlo a otros usuarios. Los procedimientos almacenados son objetos de base de datos y sus nombres deben ajustarse a las reglas para los identificadores. Slo puede crear un procedimiento almacenado en la base de datos actual. Esta sentencia no puede ser combinada con otra sentencia de Transact-SQL en un solo lote. El tamao mximo de un procedimiento almacenado es 128 MB. Cuando cree un procedimiento almacenado, deber especificar lo siguiente: Todos los parmetros de entrada y de salida del lote o del procedimiento que realiza la llamada. Las instrucciones de programacin que realicen operaciones en la base de datos, incluidas las llamadas a otros procedimientos. El valor de estado devuelto al lote o al procedimiento que realiza la llamada, a fin de indicar que la operacin se ha realizado correctamente o que se ha producido un error (y el motivo del mismo). Sintaxis: CREATE PROC [ EDURE ] [ owner. ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS sql_statement [ ...n ]

120

Procedimientos almacenados

Ejemplo: Este ejemplo crea un procedimiento almacenado que lista todas las rdenes vencidas en la base de datos Northwind. USE Northwind GO CREATE PROC dbo.OverdueOrders AS SELECT * FROM dbo.orders WHERE RequiredDate < GETDATE() AND Shippedate IS NULL GO Anidamiento de procedimientos almacenados Los procedimientos almacenados pueden anidarse, es decir, un procedimiento almacenado llama a otro. El nivel de anidamiento aumenta cuando el procedimiento llamado inicia la ejecucin y disminuye cuando el procedimiento llamado finaliza la ejecucin. Sobrepasar los niveles mximos de anidamiento hace que la cadena completa de los procedimientos de llamada cause un error. La funcin @@NESTLEVEL devuelve el nivel actual de anidamiento. Obtener informacin acerca de procedimientos almacenados Para mostrar el texto utilizado para crear el procedimiento, ejecute sp_helptext en la base de datos en que existe el procedimiento, con el nombre del procedimiento como parmetro.

Nota:Los procedimientos almacenados creados con la opcin ENCRYPTION no pueden verse con sp_helptext. Para obtener un informe de los objetos a los que hace referencia un procedimiento, utilice sp_depends. Para cambiar el nombre de un procedimiento, utilice sp_rename. Directrices para crear procedimientos almacenados De entre las reglas para programar procedimientos almacenados, cabe citar las siguientes: La propia definicin CREATE PROCEDURE puede incluir cualquier nmero y tipo de instrucciones SQL, excepto las siguientes instrucciones CREATE, que no pueden ser utilizadas nunca dentro de un procedimiento almacenado: CREATE DEFAULT,CREATE PROCEDURE,CREATE RULE,CREATE TRIGGER,CREATE VIEW. Puede crear otros objetos de base de datos dentro de un procedimiento almacenado. Puede hacer referencia a un objeto creado en el mismo procedimiento almacenado, siempre que se haya creado antes de hacer la referencia. Puede hacer referencia a tablas temporales dentro de un procedimiento almacenado. Si crea una tabla temporal local dentro de un procedimiento almacenado, sta existir nicamente para los fines del procedimiento y desaparecer en cuanto ste finalice. Si ejecuta un procedimiento almacenado que llama otro procedimiento almacenado, este ltimo puede tener acceso a todos los objetos creados por el primero, incluidas las tablas temporales.

121

Procedimientos almacenados

Si ejecuta un procedimiento almacenado remoto que realiza cambios en una instancia de Microsoft; SQL Server; 2000 remota, los cambios no se podrn deshacer. Los procedimientos almacenados remotos no intervienen en las transacciones. El nmero mximo de parmetros en un procedimiento almacenado es de 2100. El nmero mximo de variables locales en un procedimiento almacenado est limitado nicamente por la memoria disponible. En funcin de la memoria disponible, el tamao mximo de un procedimiento almacenado es de 128 megabytes (MB).

Ejecutar procedimientos almacenados Atrav de la sentencia EXEC se puede ejecutar una funcin definida por el usuario y que devuelve valores escalares, un procedimiento del sistema, un procedimiento almacenado definido por el usuario o un procedimiento almacenado extendido. Admite tambin la ejecucin de una cadena de caracteres en un proceso por lotes de Transact-SQL. Nota de seguridad: Valide todas las acciones de usuario. No concatene ninguna accin de usuario antes de validarla. Nunca ejecute un comando generado a partir de una accin de usuario no validada. Sintaxis: [ [ EXEC [ UTE ] ] { [ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ] [ ,...n ] [ WITH RECOMPILE ] Ejemplo1: La siguiente sentencia ejecuta un procedimiento almacenado que lista todas las rdenes vencidas en la base de datos Northwind. EXEC OverdueOrders Con la sentencia INSERT pueden poblar una tabla local con un conjunto de resultados que son retornados desde un procedimiento almacenado local o remoto. SQL Server carga la tabla con los datos que son retornados desde SELECT en el procedimiento almacenado. La tabla debe existir y los tipos de datos deben coincidir. Ejemplo2: La siguiente sentencia crea el procedimiento almacenado Empleadosclientes, el cual inserta empleados dentro de la tabla clientes de la base de datos Northwind. USE Northwind GO CREATE PROC dbo.EmpleadosClientes AS SELECT UPPER(SUBSTRING(Apellido,1,4)+SUBSTRING(Nombre,1,1)), 'Northwind Comercio', RTRIM(Nombre)+' ' + apellido, 'Empleado', Domicilio, ciudad, region,Codigopostal, ciudad, ('(206) 555-1234'+' x' + Extension), NULL FROM Empleadosclientes WHERE FechaContrato < GETDATE() GO Las siguientes lneas ejecutan el procedimiento creado: INSERT INTO Clientes EXEC Empleadocliente
122

Procedimientos almacenados

resultados:

(9 fila(s) afectadas)

Alterar y borrar procedimientos almacenados Los procedimientos almacenados a menudo son modificados en respuesta a la demanda de los usuarios o por cambios en las definiciones de las tablas subyacentes. Utilizar ALTER PROCEDURE para modificar un procedimiento creado anteriormente por la ejecucin de la instruccin CREATE PROCEDURE, sin cambiar los permisos y sin que afecte a ningn procedimiento almacenado ni desencadenador dependientes.

Precaucin: Es muy recomendable que no se modifiquen los procedimientos almacenados de sistema directamente. En su lugar, crear procedimiento almacenados de sistema definidos por el usuario copiando las sentencias desde uno existente y entonces modificarlo a las necesidades que convengan. Consideraciones al utilizar ALTER PROCEDURE Si anteriormente se cre una definicin de procedimiento mediante WITH ENCRYPTION o WITH RECOMPILE, estas opciones slo se activan si se incluyen en ALTER PROCEDURE. ALTER PROCEDURE altera solamente un solo procedimiento. Si el procedimiento llama a otros procedimientos almacenados, los procedimientos almacenados anidados no son afectados. De forma predeterminada, los permisos de ALTER PROCEDURE corresponden a los miembros de la funcin fija de servidor sysadmin y las funciones fijas de base de datos db_owner y db_ddladmin y al propietario del procedimiento y no se pueden transferir. Sintaxis: ALTER PROC [ EDURE ] procedure_name [ ; number ] [ { @parameter data_type } [ VARYING ] [ = default ] [ OUTPUT ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS _statement [ ...n ] Ejemplo: El siguiente ejemplo modifica el procedimiento almacenado OverdueOrders para seleccionar solamente columnas especficas en vez de todas, de la tabla Ordenes, asi como tambin ordenar el conjunto de resultados. USE Northwind GO ALTER PROC dbo.OverdueOrders AS SELECT Convert (char(8),RequiredDate,1) RequiredDate, Convert(char(8),OrderDate,1) OrderDate, IDOrden, IDCliente,IDEmpleado FROM Ordenes
123

Procedimientos almacenados

WHERE RequiredDate < GETDATE() AND Shippedate IS NULL ORDER BY RequiredDate GO Para ejecutar lo anteriormente modificado: EXEC OverdueOrders Resultados: RequiredDate 05/06/98 05/11/98 ... ... Orderdate 04/08/98 07/13/98 ... ... IDOrden 11008 11019 ... ... IDCliente ERNSH RANCH ... ... IDEmpleado 7 6 ... ...

( 21 fila(s) afectadas )

Para quitar un procedimiento almacenado definido por el usuario de la base de datos actual se puede utilizar la sentencia DROP PROCEDURE. Antes de borrar un procedimiento almacenado, ejecutar sp_depends para determinar las dependencias de los objetos. Sintaxis: DROP PROCEDURE { procedure } [ ,...n ] Ejemplo: El siguiente ejemplo borra el procedimiento almacenados OverdueOrders. USE Northwind GO DROP PROC dbo.OverdueOrders GO

Enhorabuena! Hasta este punto el participante ha aprendido a cmo crear los procedimientos almacenados, ejecutarlos,modificarlos y borrarlos. Adems, de sus ventajas.

124

Procedimientos almacenados

Prctica 1

8.3

Propsito Despus de completar esta prctica, se debe ser capaz de: Crear un procedimiento almacenado utilizando SQL Analizador de consultas. Desplegar informacin acerca de los procedimientos almacenados creados por el participante.

Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\restore09A.cmd Este archivo restaura la base de datos ClassNorthWind a un estado requerido para sta prctica. Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 20 min. De manera personal y utilizando la sintaxis de un procedimiento almacenado realizar los siguientes ejercicios: Ejercicio 1: Escribir y ejecutar un procedimiento almacenado. Ejercicio 2: Localizar informacin de procedimientos almacenados.

125

Procedimientos almacenados

Usar parmetros en procedimientos almacenados

8.4

* Parmetros de entrada * Ejecutar procedimientos almacenados usando parmetros de entrada. * Retornar valores utilizando parmetros de salida. * Recompilar explcitamente los procedimientos almacenados.

Los parmetros amplan la funcionalidad de los procedimientos almacenados. Se puede pasar informacin dentro y fuera de los procedimientos almacenados usando parmetros. Estos permiten utilizar el mismo procedimiento almacenado para buscar en una base de datos varias veces. Por ejemplo, se puede agregar un parmetro a un procedimiento almacenado que busque en la tabla empleados aquellos quienes fueron contratados en la misma fecha. As, se puede ejecutar este procedimiento almacenado las veces que se necesite obtener este dato. SQL Server soporta 2 tipos de parmetros: de entrada y de salida. Parmetros de entrada En una instruccin CREATE PROCEDURE se pueden declarar uno o ms parmetros. El usuario debe proporcionar el valor de cada parmetro declarado cuando se ejecuta el procedimiento, a menos que se haya definido un valor predeterminado para el parmetro o que el valor se establezca para igualar a otro parmetro. Sintaxis parcial: @parametro tipodedato[=default] Consideraciones Toda valor de parmetro entrante debe ser checado al principio del procedimiento para atrapar valores esperados e invlidos a tiempo. Se debe suministrar valores por defecto apropiados para un parmetro. Si un default es definido, un usuario puede ejecutar el procedimiento almacenado sin especificar una valor como parmetro. Nota: Los parmetros por defecto deben ser constantes o NULL. Un procedimiento almacenado puede tener un mximo de 1024 parmetros. Un procedimiento almacenado tiene tantas variables locales como lo permita la memoria disponible. Los parmetros son locales para un procedimiento almacenado. Los mismos nombres de parmetros pueden ser utilizados en otro procedimiento almacenado. Ejemplo: El siguiente ejemplo crea el procedimiento almacenado Venta por Fecha el cual retorna todas las ventas entre las fechas especificadas. CREATE PROCEDURE dbo.[Venta por fecha] @FechaInicio datetime, @FechaFin datetime AS IF @Fechainicio IS NULL OR @FechaFin IS NULL BEGIN RAISERROR('Escriba la fecha de inicio y de fin',14,1)
126

Procedimientos almacenados

RETURN END SELECT O.ShippedDate, O.IDOrden,OS.Subtotal, DATENAME(yy,ShippedDate) AS Ao FROM Ordenes O INNER JOIN OrdeneSubtotal OS ON O.IDOrden = OS.IDOrden WHERE O.ShippedDate BETWEEN @FechaInicio AND @FechaFin GO Ejemplo parcial: En el siguiente ejemplo se crea un procedimiento almacenado para agregar un cliente a la base de datos Northwind. Ntese que IDCliente y Compania no permiten un valor NULL al igual que el resto de las variables. USE Northwind GO CREATE PROCEDURE dbo.AddCliente @IDCliente nchar(5), @Compania nvarchar(40), @Contacto nvarchar(30)= NULL, @Domicilio nvarchar(60)= NULL, @Ciudad nvarchar(15) = NULL, @Telefono nvarchar(24) = NULL AS .... ... Al ejecutar el procedimiento almacenado anterior, no es necesario escribir los valores en el orden como estn escritos inicialmente y tambin pueden no escribirse algunos valores. EXEC AddCliente @IDCliente = 'AVJ1' @Compania = 'DDT' @Domicilio = 'tuxtla' @Contacto = 'Alex' ... El paso de solo valores es referido como paso de valores por posicin. Cuando se pasen valores por posicin, se pueden omitir los valores definidos por defecto, pero no se puede interrumpir la secuencia. Es decir, si por ejemplo, se tienen 5 parmetros definidos se pueden omitir el 4 y el 5, pero no se puede omitir el 4 y especificar el 5. Retornar valores usando parmetros de salida Los procedimientos almacenados pueden devolver informacin a otros procedimientos almacenados o a clientes con parmetros de salida. Usando estos parmetros, cualquier cambio al parmetro que resulte de la ejecucin del procedimiento almacenado puede ser utilizado de nuevo an despus de que el procedimiento almacenado complete su ejecucin. Utilizar OUTPUT en CREATE PROCEDURE y en EXECUTE. Si la esta OUTPUT es omitida en estas declaraciones, el procedimiento almacenado se ejecuta pero sin retornar valor alguno. Los parmetros de salida tienen las siguientes caractersticas: Las sentencias de llamada deben contener una nombre de variable para recibir y retornar valores. No es posible pasar constantes. Se pueden seguir utilizando las variables subsecuentemente en sentencias de TransactSQL o en otros procedimientos almacenados. El parmetro pude ser de cualquier tipo de datos, excepto text o image. Pueden ser marcadores de posicin de cursores.
127

Procedimientos almacenados

Ejemplo: Este ejemplo crea un procedimiento almacenado MathTutor que multiplica dos nmeros. Se utiliza SET, pero tambin se puede usar SELECT. SET requiere que se declare una variable para imprimir El resultado es: CREATE PROCEDURE dbo.MathTutor @m1 smallint, @m2 smallint, @resultado smallint OUTPUT AS SET @resultado = @m1 * @m2 GO Al ejecutar este cdigo: DECLARE @Respuesta smallint EXECUTE MathTutor 5,6, @respuesta OUTPUT SELECT 'El resultado es: ', @respuesta Resultado: El resultado es: 30

Recompilar explcitamente los procedimientos almacenados. Los procedimientos almacenados pueden ser recompilados explcitamente, pero no se debera realizar tan seguido y solamente cuando: Los valores de parmetros son pasados a un procedimiento que retorna variando extensamente el conjunto del resultado. Un nuevo ndice es agregado a una tabla subyacente y del cual un procedimiento almacenado quiz se beneficie. El valor del parmetro que se suministra es atpico. SQL Server provee de tres mtodos para recompilar un procedimiento almacenado: CREATE PROCEURE [WITH RECOMPILE] EXECUTE [WITH RECOMPILE] sp_recompile Ejemplo1: Procedimiento almacenado que se recompila cada vez que es ejecutado. USE Northwind GO CREATE PROC dbo.OrderCount @IDCliente nchar (10) WITH RECOMPILE AS SELECT count(*) FROM [QRY ordenes] WHERE IDCliente = @IDCliente GO Ejemplo2: Procedimiento almacenado que es recompilado a la vez que es ejecutado. EXEC InfoCliente WITH RECOMPILE Ejemplo3: Ejemplo que recompila todo procedimiento almacenado o desencadenante que haga referencia a la tabla Clientes en la base de datos Northwind. EXEC sp_recompile Clientes

Nota: Se puede usar DBCC FREEPROCCACHE para borrar todos los planes de procedimientos almacenados del cach.

128

Procedimientos almacenados

Ejecutar procedimientos almacenados extendidos

8.5

Los procedimientos almacenados extendidos son funciones dentro de una DLL que incrementa la funcionalidad de SQL Server. Estas son ejecutados de la misma forma como los procedimientos almacenados y soportan entrada de parmetros, retornan cdigos de estatus y parmetros de salida. Son programados usando API Pueden incluir caractersticas de C y C++ Pueden contener funciones mltiples Pueden ser invocadas desde un cliente o desde SQL Server Pueden se agregadas a la base de datos master solamente. Ejemplo1: Este ejemplo despliega una lista de archivos y subdirectorios de la unidad c. EXEC master...xp_cmdshell 'dir c:\ '

Nota: Solamente se pueden ejecutar desde la base de datos master o explcitamente especificando la ubicacin de master. Se puede crear un procedimiento almacenado de sistema definido por el usuario que invoque al procedimiento almacenado extendido. Este permite que se execute el procedimiento almacenado extendido desde cualquier base de datos.

La siguiente tabla incluye algunas de las ms comnmente usados Procedimiento Almacenado Extendido xp_cmdshell Descripcin

Ejecuta un comando cadena dada como un comando del sistema operativo y retorna la salida como filas de texto. Registra un mensage definido por el usuario en el archivo de registro de SQL Server o en el visor de eventos de Windows 2000.

xp_logevent

Ejemplo2: Este ejemplo despliega el nombre de la DLL que contiene al xp_cmdshell. EXEC master...sp_helptext xp_cmdshell Resultado: xplog70.dll

129

Procedimientos almacenados

Manejar mensajes de error

8.6

RETURN termina una consulta o un procedimiento Incondicionalmente. sp_addmessage crea mensajes de error personalizados. @@error contiene nmeros de error de la ltima sentencia ejecutada. RAISERROR

Para incrementar la efectividad de los procedimientos almacenados, se deben incluir los mensajes de error que comuniquen los estatus de transaccin (exitosos o fallos) al usuario. Se debe ejecutar la lgica de tarea , lgica de negocios y chequeo de errores antes de que se inicien las transacciones y se deben mantener las transacciones brevemente. Se pueden utilizar estrategias de codificacin, tales como el reconocimiento de errores. Cuando un error ocurre, se provee de tanta informacin como es posible al cliente. RETURN Termina, incondicionalmente, una consulta o un procedimiento almacenado. Tambin puede retornar un valor entero como estatus(cdigo de retorno). Un valor de retorno 0 indica xito. Los valores de retorno del 0 hasta -14 estn actualmente en uso y los valores de retorno del -15 hasta -99 estn reservados para uso futuro. Si un valor de retorno definido por el usuario no es proporcionado, el valor de SQL Server es usado. Ejemplo1: Retorna el total de filas de un SELECT hecha a otro procedimiento almacenado. USE Northwind GO CREATE PROCEDURE dbo.GetOrders @IDCliente nchar (10) AS SELECT IDOrden, IDCliente, IDEmpleado FROM [Ordenes QRY] WHERE IDCliente = @IDCliente RETURN )@@ROWCOUNT) GO sp_addmessage Este procedimiento almacenado permite a los desarrolladores crear mensajes de error personalizados. SQL Server trata los mensajes de error de sistema y personalizados de la misma manera. Todo mensaje es almacenado en sysmessages de la base de datos master. Ejemplo2: Mensaje definido por el usuario que requiere ser escrito al registro de Windows 2000 cuando ocurra. EXEC sp_addmessage @msgnum = 50010,
130

Procedimientos almacenados

@severity = 10, @msgtext = 'El cliente no puede ser borrado.' @with_log = 'True' @@error Esta funcin de sistema contiene el nmero de error de la ltima instruccin ejecutada de Transact-SQL. Limpiada y reanudada con cada sentencia ejecutada. Si un valor de 0 es retornado significa xito. Ejemplo3: Este ejemplo determina si ocurre un error al ejecutar cada vez INSERT. Si el error ocurre, la transaccin es cancelada(Rolled back). USE Northwind GO CREATE PROCEDURE dbo.addSupplierProduct @Compania nvarchar (40) = NULL, @Contacto nvarchar (40)= NULL, @Domicilio nvarchar (60) = NULL, ... ... AS BEGIN TRANSACTION INSERT Suppliers ( Compania, Contacto, Domicilio, ... ... VALUES ( @Compania, @Contacto, @Domicilio, ... ... ) if @error <>0 BEGIN ROLLBACK TRAN END DECLARE @InsertSupplierID int SELECT @InsertSupplierID = @@identity INSERT Products ( NombreProducto, IDSupp, IDCategoria, Descontinuado) VALUES (@NombreProducto,@IDSupp,IDCategoria,@Descontinuado) IF @@error <> 0 BEGIN ROLLBACK TRAN RETURN END COMMIT TRANSACTION

131

Procedimientos almacenados

RAISERROR Retorna un mensaje de error definido por el usuario y establece una bandera de sistema para registrar que un error ha ocurrido. Se debe especificar el nivel de gravedad y el estado del mensaje cuando se use esta sentencia. RAISERROR puede recuperar una entrada existente de sysmessages, o puede utilizar un mensaje no modificable (definido por el usuario). Cuando RAISERROR devuelve un mensaje de error definido por el usuario, establece tambin una variable del sistema para registrar que se ha producido un error. El mensaje puede incluir cadenas con formato del estilo de PRINTF de C, que se completan con los argumentos especificados con RAISERROR en tiempo de ejecucin. Una vez definido, el mensaje se devuelve al cliente como mensaje de error del servidor. Esta sentencia puede escribir mensajes de error al registro de errores de SQL Server y al registro de aplicacin de Windows 2000. Ejemplo4: Este ejemplo levanta un mensaje de error definido por el usuario y escribe el mensaje al registro de aplicacin de Windows 2000. RAISERROR (50010,16,1) WITH LOG

132

Procedimientos almacenados

Consideraciones de rendimiento

8.7

El Monitor del sistema de Windows 2000 SQL Profiler

Se pueden utilizar las siguientes herramientas para ayudar a encontrar la fuente de problemas de rendimiento que pueden ser relativos a la ejecucin de procedimientos almacenados. El Monitor de Sistema de Windows 2000 Monitorea el uso del cach de los procedimientos, en suma para muchas otras actividades relacionadas. Los siguientes objetos y contadores suministran informacin general acerca de los planes compilados en el cach de procedimientos y el nmero de recompilaciones. Tambin se pueden monitorear instancias especficas tales como un plan de procedimiento. Objeto SQL Server: Administrador de Cach Contador Cach de ndice de aciertos Cach Contador de objetos Cach de pginas Cach de uso Contador/seg SQL recompilaciones/seg SQL Profiler Es una herramienta grfica que permite monitorear eventos, tales como cuando el procedimiento almacenado ha iniciado o completado o cuando una sentencia de Transact-SQL dentro de un procedimiento almacenado ha empezado o concluido. En suma, se puede monitorear si un procedimiento almacenado se encuentra en el cach de procedimientos.

Enhorabuena! Hasta este punto y en continuacin del anterior el participante ha aprendido ms acerca los procedimientos almacenados como usar parmetros, ejecutar extendidos, manejo de errores y consideraciones de rendimiento.

133

Procedimientos almacenados

Prctica 2

8.8

Propsitos Despus de completar estas prcticas, se debe ser capaz de: Crear un procedimiento almacenado usando el Asistente para crear procedimientos almacenados. Probar un procedimiento almacenado que incluya tcnicas de manejo de errores. Crear mensajes de error personalizados. Crear procedimientos almacenados que retornen cdigos.

Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\restore09B.cmd Este archivo restaura la base de datos ClassNorthWind a un estado requerido para sta prctica. Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 30 min. De manera personal y disminuyendo el uso del manual del participante realizar los siguientes ejercicios: 1. 2. 3. 4. Usar el Asistente Create Stored Procedure. Usar el manejo de error en procedimientos almacenados. Personalizar mensajes de error. Usar cdigos de retorno.

134

Funciones definidas por el usuario

9. Funciones definidas por el usuario

Contenido Qu es una Funcin definida por el usuario? Definiendo funciones definidas por el usuario Ejemplos de Funciones definidas por el usuario Prctica 9.1 9.2 9.3 9.4

Este captulo proporciona una visin general de las funciones definidas por el usuario. Se explica por qu y cmo se utilizan, as como la sintaxis para crearlos. Al concluir este captulo el participante ser capaz de: Describir los tres tipos de funciones definidas por el usuario. Crear y alterar funciones definidas por el usuario. Crear cada una de las tres tipos de funciones definidas por el usuario.

135

Funciones definidas por el usuario

Qu es una funcin definida por el usuario?

9.1

Funciones escalares Funciones de valores de tabla de mltiples instrucciones Funciones de valores de tabla en lnea

En esta seccin se ven los diferentes tipos de funciones definidas por el usuario. Con SQL Server 2000 se pueden disear funciones propias. Las funciones son subrutinas formadas por una o varias instrucciones Transact-SQL que se pueden utilizar para encapsular un cdigo con el fin de utilizarlo posteriormente. SQL Server 2000 no limita a los usuarios a las funciones integradas que vienen definidas como parte del lenguaje Transact-SQL, sino que les permite crear sus propias funciones definidas por el usuario. Una funcin definida por el usuario toma 0 o ms parmetros y retorna cualquier valore escalar o una tabla. Los parmetros de entrada pueden ser de cualquier tipo de datos excepto timestamp, cursor o table. Las funciones definidas por el usuario no soportan parmetros de salida. SQL Server soporta tres tipos de funciones definidas por el usuario. Funciones escalares Una funcin escalar es similar a una funcin incorporada por SQL Server. Las funciones escalares devuelven un nico valor de datos del tipo definido en la clusula RETURNS. El cuerpo de la funcin, definido en un bloque BEGIN...END, contiene el conjunto de instrucciones Transact-SQL que devuelven el valor. Funciones de valores de tabla de mltiples instrucciones Retornan una tabla constituida por una o ms instrucciones de Transact-SQL y es similar a un procedimiento almacenado. Distintas a un procedimiento almacenado, estas funciones pueden ser referenciadas en la clusula FROM de un SELECT como si fuesen una vista. Funciones de valores de tabla en lnea Retornan una tabla que es el resultado de un simple SELECT. Similares a una vista pero que ofrecen mayor flexibilidad en el uso de los parmetros y extienden las caractersticas de las vistas indizadas. Las funciones de valores de tabla devuelven un tipo de datos table. Las funciones de valores de tabla en lnea no tienen cuerpo; la tabla es el conjunto de resultados de una sola instruccin SELECT. Para una funcin de valores de tabla de varias instrucciones, el cuerpo de la funcin, definido en un bloque BEGIN...END, contiene las instrucciones TRANSACT-SQL que generan e insertan filas en la tabla que se va a devolver.

136

Funciones definidas por el usuario

Definiendo funciones definidas por el usuario

9.2

Crear una funcin definida por el usuario Crear una funcin vinculada a un esquema Permisos Alterar y quitar funciones definidas por el usuario

En esta seccin se cubrir la creacin, alteracin y borrado de una funcin definida por el usuario, as como tambin, permisos. Crear una funcin definida por el usuario Para crear un funcin definida por el usuario se utiliza la instruccin CREATE FUNCTION. Las funciones definidas por el usuario no se pueden utilizar para realizar un conjunto de acciones que modifican el estado global de una base de datos. Las funciones definidas por el usuario, como las funciones de sistema, se pueden llamar desde una consulta. Tambin se pueden ejecutar mediante una instruccin EXECUTE como procedimientos almacenados. Sintaxis CREATE FUNCTION [ owner_name. ] function_name ( [ { @parameter_name [AS] scalar_parameter_data_type [ = default ] } [ ,...n ] ] ) RETURNS scalar_return_data_type [ WITH < function_option> [ [,] ...n] ] [ AS ] BEGIN function_body RETURN scalar_expression END Ejemplo Ejemplo que reemplaza un valor nulo con la palabra 'No aplicable', utilizando una funcin definida por el usuario. USE Northwind GO CREATE FUNCTION fn_NuevaRegion (@entrada nvarchar(30)) RETURNS nvarchar(30) BEGIN IF @entrada IS NULL SET @entrada='No aplicable' RETURN @entrada END Al hacer referencia a una funcin definida por el usuario, es necesario especificar al propietario de la funcin y el nombre de la funcin con la sintaxis de dos partes.

137

Funciones definidas por el usuario

SELECT apellido, ciudad, dbo.fn_Nuevaregion(region) As region, Pais FROM dbo.Empleados Resultado Apellido Davolio Fuller Leverling Peacock Suyana Restricciones Las funciones no determinsticas son funciones tales como GETDATE() que pueden retornar diferentes valores cada vez que son invocadas con los mismos parmetros de entrada. Las funciones no determinsticas integradas no estn permitidas en el cuerpo de las funciones definidas por el usuario. Ver la siguiente tabla de funciones integradas no determinsticas. @@ERROR @@IDENTITY @@ROWCOUNT @@TRANCOUNT @@CONNECTIONS @@CPU_BUSY @@TOTAL-ERRORS @@TOTAL_READ FORMATMESSAGE GETANSINULL GETDATE GETUTCDATE HOST_ID HOST_NAME IDENT_INCR IDENT_SEED IDENTITY NEWID PERMISSIONS SESSION_USER STATS_DATE SYSTEM_USER TEXTPTR TEXTVALID USER_NAME RAND APP_NAME CURRENT_TIMESTAMP CURRENT_USER DATENAME Ciudad Seattle Tacoma Kirkland London Londo Region WA WA WA No aplicable No aplicable Pas USA USA USA UK UK

Crear una funcin vinculada a un esquema CREATE FUNCTION admite una clusula SCHEMABINDING que vincula la funcin al esquema de cualquier objeto al que haga referencia, como tablas, vistas y otras funciones definidas por el usuario. Fallan los intentos de modificar o quitar (ALTER o DROP) cualquier objeto al que hace referencia una funcin vinculada a un esquema. Para poder especificar SCHEMABINDING en CREATE FUNCTION deben cumplirse estas condiciones: Todas las vistas y funciones definidas por el usuario a las que hace referencia la funcin deben estar vinculadas a un esquema. Todos los objetos a los que hace referencia la funcin deben encontrarse en la misma base de datos que la funcin. Se debe hacer referencia a los objetos mediante nombres de una o dos partes. Se debe disponer de permisos REFERENCES en todos los objetos (tablas, vistas y funciones definidas por el usuario) a los que hace referencia la funcin. Permisos
138

Funciones definidas por el usuario

Los usuarios deben tener el permiso CREATE FUNCTION para ejecutar la instruccin CREATE FUNCTION. De forma predeterminada, los permisos CREATE FUNCTION se conceden a los miembros de la funcin fija de servidor sysadmin y a las funciones fijas de base de datos db_owner y db_ddladmin. Los miembros de sysadmin y db_owner pueden conceder permisos CREATE FUNCTION a otros inicios de sesin mediante la instruccin GRANT. Los propietarios de funciones tienen permiso EXECUTE sobre sus funciones. Los dems usuarios no tienen permisos EXECUTE a menos que se les conceda permisos EXECUTE sobre la funcin especfica. Para poder crear o modificar tablas con referencias a funciones definidas por el usuario en las clusulas CONSTRAINT o DEFAULT, o en la definicin de la columna calculada, el usuario tambin debe tener permisos REFERENCES sobre las funciones. Alterar y quitar funciones definidas por el usuario ALTER FUNCTION modifica una funcin existente definida por el usuario, creada anteriormente por la ejecucin de la instruccin CREATE FUNCTION, sin cambiar los permisos y sin que afecte a ninguna otra funcin, procedimiento almacenado o desencadenador dependientes. Los beneficios de alterar una funcin en vez de quitarla y recrearla son los mismos que para las vistas y procedimientos. Ejemplo: ALTER FUNCTION dbo.fn_Nuevaregion <contenido de la nueva funcin>

Nota :No es posible utilizar ALTER FUNCTION para cambiar una funcin de valores escalares por una funcin de valores de tabla, ni viceversa. Tampoco es posible utilizar ALTER FUNCTION para cambiar una funcin en lnea por una funcin de mltiples instrucciones o viceversa. DROP FUNCTION quita una o ms funciones definidas por el usuario de la base de datos actual. Ejemplo: DROP FUNCTION dbo.fn_Nuevaregion

139

Funciones definidas por el usuario

Ejemplos de Funciones definidas por el usuario

9.3

Funciones escalares Funciones de valores de tabla de mltiples instrucciones Funciones de valores de tabla en lnea

En esta seccin se describen los tres tipos de funciones definidas por el usuario. Se describen sus propsitos y ejemplos de la sintaxis para crearlas e invocarlas. Funciones Escalares Las funciones escalares devuelven un nico valor de datos del tipo definido en la clusula RETURNS. Se pueden utilizar todos los tipos de datos escalares, incluidos bigint y sql_variant. Ejemplo: Funcin definida por el usuario que recibe separadores de fecha y columna como variables y reformatea la fecha como una cadena de caracteres. USE Northwind GO CREATE FUNCTION fn_DateFormat (@fechaIn datetime, @separador char(1)) RETURNS Nchar(20) AS BEGIN RETURN CONVERT(Nvarchar(20), datepart(mm,@fechaIn)) +@separador +CONVERT(Nvarchar(20),datepart(dd,@fechaIn)) +@separador +CONVERT(Nvarchar (20), datepart(yy,@fechaIn)) END Para invocar una funcin definida por el usuario se hace de la misma forma que como se invoca una funcin integrada. SELECT dbo.fn_DateFormat(GETDATE(),':')

Funciones de valores de tabla de mltiples instrucciones Son una combinacin de una vista y un procedimiento almacenado. Se pueden utilizar para que retornen una tabla para reemplazar procedimientos almacenados o vistas. Una funcin de valores de tabla (como un procedimiento almacenado) puede usar una lgica compleja e instrucciones mltiples de Transact-SQL para construir una tabla. Cuando se utilice una funcin de valores de tabla de mltiples instrucciones, considerar los siguientes factores:
140

Funciones definidas por el usuario

BEGIN y END delimitan la funcin. RETURNS especifica table como el tipo de dato retornado. RETURNS define un nombre para la tabla y define el formato de la tabla. El alcance de la variable de retorno es local a la funcin. Ejemplo: Funcin que retorna el apellido o nombre y apellidos de un empleado, dependiendo del parmetro suministrado. USE Northwind GO CREATE FUNCTION fn_Empleados (@largo nvarchar(9)) RETURNS @fn_Empleados TABLE (IDEmpleado int PRIMARY KEY NOT NULL, [nombre Empleado ] Nvarchar(61) NOT NULL) AS BEGIN IF @largo = 'nombrecorto' INSERT @fn_Empleados SELECT IDEmpleado,Apellido FROM Empleados ELSE IF @largo ='nombrelargo' INSERT @fn_Empleados SELECT IDEmpleado, (Nombre + ' '+ apellido) FROM Empleados RETURN END En vez de invocar la tabla o una vista: SELECT * FROM dbo.fn_Empleados('nombrelargo') o SELECT * FROM dbo.fn_Empleados('nombrecorto')

Funciones de valores de tabla en lnea Retornan una tabla y son referenciadas en la clusula FROM, tal como una vista. Cuando se usen este tipo de funciones, considerar los siguientes factores y directrices: La clusula RETURNS contiene slo la palabra clave table. No es necesario definir el formato de una variable de retorno, ya que est definida por el formato del conjunto de resultados de la instruccin SELECT en la clusula RETURN. La expresin function_body no est delimitada por BEGIN ni END. La clusula RETURN contiene una sola instruccin SELECT entre parntesis. El conjunto de resultados de la instruccin SELECT forma la tabla que devuelve la funcin. La instruccin SELECT utilizada en una funcin en lnea est sujeta a las mismas restricciones que las instrucciones SELECT utilizadas en las vistas. La funcin con valores de tabla slo acepta constantes o argumentos @local_variable. Se puede utilizar este tipo de funcin para lograr la funcionalidad de vistas parametrizadas. Las vistas no admiten parmetros en las condiciones de bsqueda especificadas en la clusula WHERE. Las funciones en lnea definidas por el usuario pueden utilizarse para admitir parmetros en las condiciones de bsqueda especificadas en la clusula WHERE.

141

Funciones definidas por el usuario

Ejemplo: Funcin que toma una valor de regin como parmetro. USE Northwind GO CREATE FUNCTION (fn_NombreclientexRegion) (@region nvarchar(30)) RETURNS table AS RETURN ( SELECT IDCliente,compania FROM Northwind.dbo.Clientes WHERE Region = @region) Para invocar esta funcin, hay que suministrar el nombre de la funcin para el FROM y regin como valor de parmetro. SELECT * FROM fn_NombreclientexRegion(N'WA')) Las funciones en lnea tambin pueden utilizarse para aumentar la eficacia de las vistas indizadas. Por s misma, la vista indizada no puede utilizar parmetros en las condiciones de bsqueda de su clusula WHERE para adaptar el conjunto de resultados almacenado a usuarios especficos. No obstante, se puede definir una vista indizada que almacene un conjunto completo de datos que coincida con la vista y, a continuacin, definir una funcin en lnea para la vista indizada con condiciones de bsqueda parametrizada que permitan a los usuarios personalizar los resultados.

Enhorabuena! El participante ha aprendido en este mdulo crear sus propias funciones y de qu tipo: Funciones escalares, funciones de valores de tabla de mltiples instrucciones y funciones de valores de tabla en lnea. A travs de la sintaxis, de conceptos y ejemplos, ahora ya puede crear sus propias funciones.

142

Funciones definidas por el usuario

Prctica

9.4

Propsitos Despus de completar estas prcticas, se debe ser capaz de: Crear funciones escalares definidas por el usuario. Crear funciones de valores de tabla de mltiples instrucciones definidas por el usuario. Crear funciones de valores de tabla en lnea definidas por el usuario.

Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\Restore10.cmd Este archivo restaura la base de datos ClassNorthWind a un estado requerido para sta prctica. Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 30 min. De manera personal y utilizando la sintaxis para crear la funcin del manual del participante realizar los siguientes ejercicios: 1. Crear una funcin escalar definida por el usuario. 2. Crear una funcin de valores de tabla de mltiples instrucciones definida por el usuario. 3. Crear una funcin de valores de tabla en lnea definida por el usuario.

143

Implementar desencadenantes

10. Implementar desencadenantes

Contenido Introduccin Definir desencadenantes Cmo trabajan los desencadenantes? Prctica 10.1 10.2 10.3 10.4

Un desencadenante es un procedimiento almacenado que se ejecuta cuando los datos en una tabla en especfico son modificados. A menudo se crean desencadenantes para exigir la integridad referencial o consistencia entre los datos relacionados lgicamente en tablas diferentes. Ya que los usuarios no pueden engaar a los desencadenantes, los desencadenantes se pueden utilizar para exigir reglas de negocio complejas que mantienen la integridad de datos. Al concluir este captulo el participante ser capaz de: Crear desencadenantes. Borrar desencadenantes. Alterar desencadenantes. Describir como trabajan los desencadenantes. Evaluar las consideraciones de rendimiento que afectan al utilizar desencadenantes.

144

Implementar desencadenantes

Introduccin

10.1

Qu es un desencadenante? Utilizar desencadenantes Consideraciones

Esta seccin introduce al participante a los desencadenantes y se describe cuando y cmo usarlos. Que es un desencadenante? Un desencadenante es un tipo especial de procedimiento almacenado que entra en vigor cuando se modifican datos en una tabla especificada utilizando una o ms operaciones de modificacin de datos: UPDATE (actualizacin), INSERT (insercin) o DELETE (eliminacin). Los desencadenantes pueden consultar otras tablas e incluir instrucciones SQL complejas. Son especialmente tiles para exigir reglas o requisitos complejos. Por ejemplo, se puede controlar que se permita insertar un pedido basndose en el estado de cuenta actual de un cliente. A diferencia de los procedimientos almacenados los desencadenantes no pueden ser invocados directamente y no pasan o aceptan parmetros. Considerar los siguientes factores y directrices al usar desencadenantes: Las definiciones de desencadenantes incluyen ROLLBACK TRANSACTION an cuando no existe BEGIN TRANSACTION. Si ROLLBACK TRANSACTION es encontrado, la transaccin completa se retracta. Si una instruccin en el desencadenante le sigue un ROLLBACK TRANSACTION, la instruccin es ejecutada. Esto puede ser necesario para usar una clusula RETURN en un IF..ENDIF para prevenir el proceso de otras instrucciones. Si un desencadenante que incluye ROLLBACK TRANSACTION es disparado dentro de una transaccin definido por el usuario, ROLLBACK TRANSACTION retroceder a toda la transaccin. Un desencadenante que es ejecutado dentro de un lote que ejecuta ROLLBACK TRANSACTION cancela el lote, las lneas subsecuentes no son ejecutadas. Se pueden minimizar o evitar el uso de ROLLBACK TRANSACTION en el cdigo de un desencadenante. Al quitar la transaccin se genera mayor trabajo ya que hay que quitar todo lo ya hecho y obviamente repercute en el rendimiento. El usuario que invoque un desencadenante debe de tener permiso para ejecutar todas las instrucciones de todas las tablas.

145

Implementar desencadenantes

Utilizar desencadenantes Los desencadenantes son mejor usados para mantener un bajo nivel de integridad de datos, no para retornar resultados de consulta. El primer beneficio de los desencadenantes es que pueden contener procesamiento lgico complejo. Los desencadenantes pueden realizar cambios en cascada a travs de tablas relacionadas en la base de datos. Pueden exigir restricciones ms complejas que las definidas con restricciones CHECK. Se pude utilizar un desencadenante para actualizar o borrar en cascada a travs de tablas relacionadas en una base de datos. Por ejemplo, un desencadenante que borre en la tabla Products de Northwind puede eliminar filas que concuerden en el valor del IDProduct en otras tablas. Un desencadenante realiza esto a travs de la llave fornea IDProduct como una forma de ubicar filas en la tabla Orderdetails. A diferencia de las restricciones CHECK, los desencadenadores pueden hacer referencia a columnas de otras tablas. Por ejemplo, un desencadenante puede deshacer actualizaciones que intenten aplicar descuentos (almacenados en la tabla discounts) a libros (almacenados en la tabla titles) con un precio inferior a $10. Definir mensajes de error personalizados Ocasionalmente, al utilizar los desencadenantes se pueden invocar mensajes de error predefinidos o dinmicos cuando ciertas condiciones ocurran. Comparar antes y despus de una modificacin La mayora de desencadenantes proporcionan la habilidad para referenciar los cambios hechos a los datos con INSERT, UPDATE O DELETE. Esto permite referenciar las filas que estn siendo afectadas por la modificacin dentro del desencadenante.

Nota: Las restricciones, reglas y defaults pueden avisar errores solamente a travs de los mensajes estndares del sistema. Si una aplicacin requiere (o puede beneficiarse) mensajes personalizados y un manejo ms complejo de errores, se deben utilizar los desencadenantes. Consideraciones La mayora de los desencadenantes son reactivos; las restricciones y el desencadenante INSTEAD OF son proactivos. Las restricciones son chequeadas antes que los desencadenante. Las tablas pueden tener mltiples desencadenantes para cualquier accin. Los propietarios de las tablas pueden designar el primer y el ltimo desencadenante para disparase. Cuando en una tabla existen ms de un desencadenante, el propietario de la tabla puede usar sp_settriggerorder para especificar el lanzamiento del primero y el ltimo desencadenante. El orden de lanzamiento de los desencadenantes restantes no se puede establecer. Se debe tener permiso para ejecutar todas las sentencias del desencadenante.

146

Implementar desencadenantes

Los propietarios de las tablas no pueden desencadenantes AFTER sobre vistas o tablas temporales. Pueden, sin embargo, hacer referencia a vistas y a tablas temporales. Los propietarios de las tablas pueden crear desencadenantes INSTEAD OF sobre vistas y tablas en el que INSTEAD OF extiende ampliamente los tipos de actualizacin que la vista puede soportar. Los desencadenantes no deben retornar conjuntos de resultados. Los desencadenantes pueden manejar acciones multi-fila. Un INSERT, UPDATE O DELETE que invocan a un desencadenante pueden afectar mltiples filas. Se puede elegir: Procesar todas filas juntas, en cuyo caso todas las filas afectadas deben conocer el criterio del desencadenante para cualquier accin a ocurrir. Permitir acciones condicionales Por ejemplo, si se desea borrar tres clientes desde Clientes, los cuales no deban de tener ninguna orden activa. Si uno de ellos no cumple con esta condicin, no es borrado, pero los que la cumplan, s. Para determinar si existen mltiples filas afectadas, utilizar @@ROWCOUNT.

147

Implementar desencadenantes

Definir Desencadenantes

10.2

Crear desencadenantes Alterar y borrar desencadenantes

En esta seccin se ver cmo crear, alterar y borrar un desencadenante. Crear desencadenantes CREATE TRIGGER crea un desencadenador, que es una clase especial de procedimiento almacenado que se ejecuta automticamente cuando un usuario intenta la instruccin especificada de modificacin de datos en la tabla indicada. SQL Server permite crear varios desencadenadores para cualquier instruccin INSERT, UPDATE o DELETE. Sintaxis CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] }] sql_statement [ ...n ] } } Cuando FOR UPDATE es especificada, la clusula IF UPDATE(column) puede ser utilizada para enfocar la accin a un columna especfica que es actualizada. INSTEAD OF cancelan el desencadenante y ejecutan una nueva funcin en su lugar. Cuando se crear un desencadenante, la informacin acerca de ste est dentro de sysobject y syscomments. Si un desencadenante es creado con el mismo nombre de uno ya existente, el nuevo desencadenante sobrescribir al original. Permisos De forma predeterminada, los permisos CREATE TRIGGER son del propietario de la tabla en la que se ha definido el desencadenador, de la funcin de servidor fija sysadmin y de los miembros de funciones fijas de base de datos db_owner y db_ddladmin, y no se pueden transferir.
148

Implementar desencadenantes

SQL Server no permite las siguientes instrucciones en la definicin de un desencadenante: ALTER DATABASE CREATE DATABASE DISK INIT DISK RESIZE DROP DATABASE LOAD DATABASE LOAD LOG RECONFIGURE RESTORE DATABASE} RESTORE LOG

Ejemplo: Desencadenante que previene al usuario de borrar ms de un registro a la vez. Si se trata de borrar ms de uno, el desencadenante retorna un mensaje de error personalizado y retracta la transaccin. USE Northwind GO CREATE TRIGGER Emp_Delete ON NuevoEmpleado FOR DELETE AS IF (SELECT COUNT(*) FROM deleted) > 1 BEGIN RAISERROR('No se puede borrar ms de un registro a la vez',16,1) ROLLBACK TRANSACTION END La siguiente sentencia lanza el desencadenante y se evita la transaccin. DELETE FROM Empleados WHERE IDEmpleado > 6 La siguiente sentencia lanza el desencadenante y permite la transaccin. DELETE FROM Empleados WHERE IDEmpleado = 6

Nota: Dado que SQL Server no admite que se agreguen a las tablas del sistema desencadenadores definidos por el usuario, se recomienda no crear desencadenadores definidos por el usuario en las tablas del sistema. Alterar y borrar desencadenantes Si se debe cambiar la definicin de un desencadenante, se puede alterar sin tener que borrarlo. La definicin alterada reemplaza la ya existente. La accin del desencadenante tambin puede ser alterada. Por ejemplo, si se crea un desencadenante para INSERT y luego cambia la accin a UPDATE, la alteracin del desencadenante se ejecutar cuantas veces la tabla sea actualizada.

149

Implementar desencadenantes

Sintaxis ALTER TRIGGER trigger_name ON ( table | view ) [ WITH ENCRYPTION ] { { ( FOR | AFTER | INSTEAD OF ) { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } [ NOT FOR REPLICATION ] AS sql_statement [ ...n ] } | { ( FOR | AFTER | INSTEAD OF ) { [ INSERT ] [ , ] [ UPDATE ] } [ NOT FOR REPLICATION ] AS { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } sql_statement [ ...n ] } } Ejemplo: Ejemplo que modifica el desencadenante del ejemplo anterior. El nuevo desencadenante modifica el lmite de borrado de 1 a 6 registros. USE Northwind GO CREATE TRIGGER Emp_Delete ON empleados FOR DELETE AS IF (SELECT COUNT(*) FROM Deleted)> 6 BEGIN RAISERROR('No se pueden borrar ms de 6 registros a la vez',16,1) ROLLBACK TRANSACTION END

Desactivar o activar un desencadenante. Se puede desactivar o activar un desencadenante en especfico o todos en una tabla. Cuando un desencadenante es desactivado, se define todava para la tabla; sin embargo, cuando un INSERT, UPDATE o DELETE es ejecutado contra la tabla, las acciones en los desencadenantes no son ejecutadas hasta que el desencadenante es reactivado. Para desactivar o activar un desencadenante utilizar lo siguiente: ALTER TABLE nombreTabla {ENABLE|DISABLE} TRIGGER {ALL | nombretrigger[,...n]}

150

Implementar desencadenantes

Borrar un desencadenante Se puede quitar un desencadenante borrndolo. Los desencadenantes son quitados automticamente en el momento que sus tablas asociadas son quitadas. Sintaxis: DROP TRIGGER { trigger } [ ,...n ] Permisos Los permisos para utilizar DROP TRIGGER pertenecen de manera predeterminada al propietario de la tabla del desencadenador y no se pueden transferir. Sin embargo, los miembros de las funciones fijas de base de datos db_owner y db_dlladmin, o de la funcin fija de servidor sysadmin pueden quitar cualquier objeto si especifican explcitamente el propietario en la instruccin DROP TRIGGER. Ejemplo: Este ejemplo quita el desencadenador employee_insupd. USE pubs IF EXISTS (SELECT name FROM sysobjects WHERE name = 'employee_insupd' AND type = 'TR') DROP TRIGGER employee_insupd GO

151

Implementar desencadenantes

Cmo trabajan los desencadenantes

10.3

Cmo trabaja un desencadenante INSERT Cmo trabaja un desencadenante DELETE Cmo trabaja un desencadenante UPDATE Cmo trabaja un desencadenante INSTEAD OF Cmo trabajan los desencadenantes anidados Desencadenantes recursivos

Es importante entender cmo trabajan los desencadenantes. En esta seccin se aborda desencadenantes INSERT, DELETE, UPDATE INSTEAD OF, anidados y recursivos. En las instrucciones de desencadenadores se utilizan dos tablas especiales: la tabla deleted y la tabla inserted. SQL Server 2000 crea y administra automticamente estas tablas. Puede utilizar estas tablas temporales residentes en la memoria para probar los efectos de algunas modificaciones de datos y para establecer condiciones para acciones de desencadenador; sin embargo, no puede modificar directamente los datos de la tabla. Las tablas inserted y deleted se utilizan principalmente en desencadenadores para: Ampliar la integridad referencial entre tablas. Insertar o actualizar datos de tablas base subyacentes a una vista. Comprobar errores y realizar acciones en funcin del error. Diferenciar entre el estado de una tabla antes y despus de realizar una modificacin en los datos para actuar en funcin de esa diferencia. La tabla deleted almacena copias de las filas afectadas por las instrucciones DELETE y UPDATE. Durante la ejecucin de una instruccin DELETE o UPDATE, las filas se eliminan de la tabla del desencadenador y se transfieren a la tabla deleted. La tabla deleted y la tabla del desencadenador no suelen tener filas en comn. La tabla inserted almacena copias de las filas afectadas durante las instrucciones INSERT y UPDATE. Durante una transaccin de insercin o actualizacin, se agregan nuevas filas a la tabla inserted y a la tabla del desencadenador de forma simultnea. Las filas de la tabla inserted son copias de las nuevas filas de la tabla del desencadenador. Cmo trabaja un desencadenante INSERT Se puede definir un desencadenante para ejecutar cuantas veces un INSERT inserte datos en una tabla. Cuando un desencadenante INSERT es lanzado, nuevas filas son agregadas en la tabla del desencadenante y en la tabla inserted. Toda actividad de modificacin de datos (INSERT, UPDATE y DELETE) es registrada, pero la informacin en el registro de transacciones es ilegible. Sin embargo, la tabla inserted permite referenciar los cambios registrados que caus INSERT. Ejemplo: En este ejemplo se crea un desencadenante que actualiza una columna en Productos cada vez que un producto es ordenado.
152

Implementar desencadenantes

USER Northwind GO CREATE TRIGGER OrdDet_Insert ON Ordenesdetalles FOR INSERT AS UPDATE P SET UnitInstock = (P.UnitInstock I.Cantidad) FROM Productos AS P INNER JOIN Inserted AS I ON P.IDProducto = I.IDProducto

Cmo trabaja un desencadenante DELETE Cuando un desencadenante DELETE es lanzado, las filas eliminadas de la tabla afectada son ubicadas en un tabla especial deleted. Considerar lo siguiente al utilizar un desencadenante DELETE: Cuando una fila es aadida a la tabla deleted, no se alarga en la tabla de la base de datos; por tanto, esta tabla y las tablas de la base de datos no tienen filas en comn. El espacio es asignado de la memoria para crear la tabla deleted. Esta tabla est siempre en cach. Un desencadenante que est definido por una accin DELETE no ejecuta TRUNCATE TABLE ya que no esta sentencia no es registrada. Ejemplo: Desencadenante que actualiza la columna descontinuado cada vez que una categora es borrada. USER Northwind GO CREATE TRIGGER DelCategoria ON Categorias FOR DELETE AS UPDATE P SET Descontinuado = 1 FROM Productos AS P INNER JOIN deleted AS d ON P.IDCategoria = d.IDCategoria

Cmo trabaja un desencadenante UPDATE Cuando una sentencia UPDATE es ejecutada sobre una tabla que tiene un desencadenante definido, las filas originales (antes de) son movidas a la tabla deleted y las filas actualizadas (despus de) son insertadas en la tabla inserted. El desencadenante puede examinar las tablas deleted e inserted, as como la tabla actualizada, para determinar si las mltiples filas han sido actualizadas y cmo las acciones de los desencadenantes lo llevaron a cabo. Se puede definir un desencadenante para monitorear actualizaciones de datos en una columna especfica usando IF UPDATE. Esto permite al desencadenante aislar la actividad
153

Implementar desencadenantes

fcilmente para una columna en especfico. Cuando detecte algn cambio, se puede tomar acciones propias como el de lanzar un mensaje de error o procesar una serie de instrucciones basadas en los nuevos valores de la columna. Sintaxis: IF UPDATE (<nombrecolumna>) Ejemplo: Este desencadenante previene al usuario modificar la columna IDEmpleado en la tabla Empleados. USE Northwind GO CREATE TRIGGER ActualizaEmp ON Empleados FOR UPDATE AS IF UPDATE (IDEmpleado) BEGIN TRANSACTION RAISERROR ('La operacin no puede ser ejecutada. \ *** El ID del empleado no debe modificarse', 10, 1) ROLLBACK TRANSACTION END Cmo trabaja un desencadenante INSTEAD OF Se puede especificar un desencadenante INSTEAD OF en una tabla o en una vista. INSTEAD OF incrementa la variedad de tipos de actualizaciones que se pueden ejecutar sobre una vista. Cada tabla o vista es delimitada a un INSTEAD OF por cada accin de un desencadenante (INSERT, UPDATE o DELETE). No se puede crear un desencadenante INSTEAD OF en vistas que tiene la opcin CHECK OPTION definida. Ejemplo: Este ejemplo crear una tabla con clientes en Alemania y otra con clientes en Mxico. Un desencadenante INSTEAD OF colocado en la vista redirecciona las actualizaciones a la tabla subyacente apropiada. La adicin a la tabla CustAlemania ocurre en vez de la adicin a la vista. Crear las tablas con los datos de clientes de Alemania y Mxico SELECT * INTO CustAlemania FROM Clientes WHERE Clientes.Pais='Alemania' SELECT * INTO CustMexico FROM Clientes WHERE Clientes.pais = 'Mexico' GO Crear una vista de esos datos CREATE VIEW vwClientes AS SELECT * FROM CustAlemania UNION SELECT * FROM CustMexico GO Crear un desencadenante INSTEAD OF en la vista

154

Implementar desencadenantes

CRETE TRIGGER Clientes_update2 ON vwClientes INSTEAD OF UPDATE AS DECLARE @Pais nvarchar(15) SET @Pais= (SELECT pais FROM Inserted) IF @Pais = 'Alemania' BEGIN UPDATE CustAlemania SET CustAlemania.tel = Inserted.tel FROM CustAlemania JOIN Inserted ON CustAlemania.IDCliente = Inserted.IDCliente END ELSE IF @Pais = 'Mexico' BEGIN UPDATE Custmexico SET CustMexico.tel = inserted.tel FROM CustMexico JOIN Inserted ON CustMexico.IDCliente = Inserted.IDCliente END

Probar el desencadenante actualizando la vista UPDATE vwClientes SET Tel = '030-007xxx' WHERE IDCliente = 'ALFKI' SELECT IDCliente, tel FROM vwClientes WHERE IDCliente = 'ALFKI' SELECT IDCliente, Tel FROM CustAlemania WHERE IDCliente = 'ALFKI'

Utilice la opcin nested triggers para controlar si los desencadenantes pueden actuar en cascada (realizar una accin que inicia otro desencadenantes que, a su vez, inicia otro desencadenantes, etc.). Si establece el valor 0 para esta opcin, los desencadenantes no podrn actuar en cascada. En cambio, si el valor de la opcin nested triggers es 1 (el valor predeterminado), los desencadenantes podrn actuar en cascada hasta un mximo de 32 niveles. El valor surte efecto inmediatamente (sin necesidad de detener y reiniciar el servidor). Puede utilizar desencadenantes anidados para realizar funciones de mantenimiento, tales como almacenar una copia de seguridad de las filas que han sido afectadas por un desencadenador anterior. Considerar los siguientes factores cuando se usen los desencadenantes anidados: Por defecto, la opcin de configuracin est en ON. Un desencadenante anidado no se lanza dos veces en la misma transaccin de desencadenante; un desencadenante no se llama a s misma en respuesta a una segunda actualizacin a la misma tabla dentro del desencadenante. Por ejemplo, si un
155

Implementar desencadenantes

desencadenante modifica una tabla que, a su vez, modifica la tabla original del desencadenante, el desencadenante no se lanza de nuevo. Ya que un desencadenante es una transaccin, un fallo en cualquier nivel de un conjunto de desencadenantes anidados cancela la transaccin completa y todos los datos modificados son cancelados. Por tanto, se recomienda incluir PRINT cuando se prueben los desencadenante anidados para determinar donde ocurre un fallo. Checar el nivel de anidamiento Cada vez que un desencadenante anidado se lanza, el nivel de anidamiento incrementa. SQL Server soporta 32 niveles, pero es posible limitar los niveles de anidamiento para evitar exceder el mximo nivel. Utilcese la funcin @@NESTLEVEL para ver el actual nivel de anidamiento. Determinar si utilizar anidamiento El anidamiento es una poderosa caracterstica que se puede usar para mantener la integridad de datos en toda la base de datos. Ocasionalmente, sin embargo, se puede querer desactivar el anidamiento. Si el anidamiento es desactivado, un desencadenante que modifica otra tabla no invoca ninguno de los desencadenantes en la segunda tabla. Para desactivar un desencadenante: sp_configure 'nested triggers',0 Se puede crear la misma funcionalidad sin utilizar anidamiento; sin embargo, el diseo del desencadenante diferir substancialmente. En el diseo de un desencadenante anidado, cada desencadenante debe iniciar solamente en la prxima modificacin de datos el diseo debe ser modular. En el diseo de desencadenantes no anidados, cada desencadenante debe iniciar todas las modificaciones de datos que se desean hacer.

Ejemplo: El siguiente ejemplo muestra como al depositar una orden causa que el desencadenante Orden_update se ejecute. USE Northwind GO CREATE TRIGGER Prods_update ON Productos FOR UPDATE AS IF UPDATE (UnitInstock) IF ( Productos.UnitInStock + Productos.UnitsOnOrder) < Productos.ReorderLevel BEGIN -Enviar mensaje al departamento de compras que ya no hay stock END

Desencadenantes recursivos Un desencadenante no se llama a s mismo de forma recursiva a menos que se active la opcin RECURSIVE_TRIGGERS de la base de datos. Hay dos tipos de recursividad: Repeticin directa
156

Implementar desencadenantes

Se produce cuando un desencadenante se activa y realiza una accin que provoca que el mismo desencadenante se vuelva a activar. Por ejemplo, una aplicacin actualiza la tabla T3, que provoca la activacin del desencadenante Trig3. Trig3 vuelve a actualizar T3, lo que provoca una nueva activacin del mismo desencadenante Trig3. Repeticin indirecta Se produce cuando un desencadenante se activa y realiza una accin que provoca la activacin de otro desencadenante (en la misma tabla o en otra). Este segundo desencadenante realiza una accin que provoca que se vuelva a activar el primer desencadenante. Por ejemplo, una aplicacin actualiza la tabla T1, lo que provoca la activacin del desencadenante Trig1. Trig1 actualiza la tabla T2, con lo que se activa el desencadenante Trig2. A su vez, Trig2 actualiza la tabla T1, que provoca que se vuelva a activar Trig1. Slo se impide la se impide la repeticin directa cuando la opcin RECURSIVE_TRIGGERS de la base de datos est establecida a OFF. Para deshabilitar la recursin indirecta, establezca la opcin nested triggers del servidor a 0 tambin. Sintaxis: ALTER DATABASE ClassNorthwind SET RECURSIVE_TRIGGERS ON sp_dboption databaseName, 'recursive triggers', TRUE Si la opcin del desencadenante anidado es OFF, la opcin del desencadenante recursivo tambin es deshabilitado, Independientemente del desencadenante recursivo puesto en la base de datos. Determinar si utilizar desencadenantes recursivos Es posible utilizar los desencadenantes recursivos en una tabla caracterizada por una relacin de referencia a s misma (tambin conocida como de cierre transitivo). Por ejemplo, la tabla emp_mgr define: A un empleado (emp) de una empresa. El director de cada empleado (mgr). El nmero total de empleados en la estructura de la organizacin que dependen de cada empleado (NoOfReports). Un desencadenante de actualizacin recursivo puede servir para mantener actualizada la columna NoOfReports a medida que se insertan nuevos registros. El desencadenante de insercin actualiza la columna NoOfReports del registro de responsables, que actualiza de modo recursivo la columna NoOfReports de otros registros de la jerarqua de administracin. Considerar las siguientes directrices antes de utilizar los desencadenantes recursivos: Los desencadenantes recursivos son complejos y deben ser bien diseados y probados a conciencia. Requieren un controlado cdigo lgico de bucle (comprobar su terminacin). De otra manera, se pude exceder el nivel lmite. Una modificacin de datos en cualquier punto puede provocar una serie de desencadenantes. Aunque este proporcione la habilidad de procesar relaciones complejas, esto puede ser un problema si las tablas deben ser actualizadas en un determinado orden.
157

Implementar desencadenantes

Enhorabuena! El participante ha aprendido acerca de los desencadenantes, qu son, como se definen, cmo trabajan y tambin cmo quitarlos. Tambin ha aprendido a distinguir entre los variados tipos que tiene el MS SQL Server 2000.

158

Implementar desencadenantes

Prctica

10.4

Propsitos Crear desencadenantes para mantener la integridad de datos. Crear desencadenantes para exigir reglas de negocio complejas. Configuracin para la prctica Completar la prctica anterior o Ejecutar el archivo c:\Moc\2073A\Batches\Restore11.cmd Este archivo restaura la base de datos ClassNorthWind a un estado requerido para sta prctica. Ejercicios Usar la siguiente informacin para entrar a la PC del saln de prcticas: Opcin Valor usuario Administrador Contrasea password Tiempo estimado: 45 min. De manera personal y sin utilizar el manual del participante realizar los siguientes ejercicios: 1. 2. 3. 4. Crear uno o ms desencadenantes. Crear un desencadenante para actualizar datos derivados. Crear un desencadenante que mantenga una regla de negocio compleja. Probar el orden de lanzamiento de Restricciones y Desencadenantes.

159

Conclusin

Conclusin
Cuando el participante haya llegado a esta parte de su manual y desarrollado cada tema, entonces ya es capaz de realizar lo que se le propuso aprender al inicio de la capacitacin. Se ha visto, a travs de los variados temas de este material, que Ms SQL Server 2000 es una herramienta poderosa para administrar bases de datos. Es importante que el participante tenga la misin de aprender cada vez ms con sus propias experiencias para poder agrandar sus conocimientos ya que, como se mencion en la introduccin, este manual no pretende ser un instrumento de referencia sino un de apoyo a la introduccin de este programa de administracin.

160

Bibliografa

Bibliografa
Microsoft Training and Certification: Programming a Microsoft SQL Server 2000 Database Microsoft Corp., USA Editor: Wendy Cleary Septiembre/2000 Traduccin hecha en Mxico por Ing. Rodrigo Jimnez Ruiz y Alejandro Vzquez

Libros en pantalla de Microsoft SQL Server 2000 Microsoft Corp., USA Septiembre/2000 Traduccin hecha en Mxico por Microsoft Corp.

161