Microsoft SQL Server 2008 Español - Mike Hotek

514

Transcript of Microsoft SQL Server 2008 Español - Mike Hotek

Page 1: Microsoft SQL Server 2008 Español - Mike Hotek
Page 2: Microsoft SQL Server 2008 Español - Mike Hotek

Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y más … Gratis para el Conocimiento...!

www.detodoprogramas.com

Visítanos y compruébalo

Material para los amantes de la Programación Java, C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos,

CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas…

www.detodoprogramacion.com

Visitanos

Libros Universitarios, Contabilidad, Matemáticas, obras literarias, Administración, ingeniería y mas…

Page 3: Microsoft SQL Server 2008 Español - Mike Hotek

PUBLICADO POR Microsoft Press Una división de Microsoft Corporation Una manera Microsoft Redmond, Washington 98052-6399

Copyright © 2009 por Mike Hotek

Todos los derechos reservados. Ninguna parte del contenido de este libro puede ser reproducida o transmitida en cualquier forma o por

cualquier medio sin el permiso por escrito del editor.

Biblioteca del Congreso Número de control: 2008935428

Impreso y encuadernado en los Estados Unidos de América.

1 2 3 4 5 6 7 8 9 QWT 3 2 1 0 9 8

Distribuido en Canadá por H.B. Fenn y Company Ltd.

Un registro de catálogo CIP para este libro está disponible en la Biblioteca Británica.

Los libros de Microsoft Press están disponibles a través de librerías y distribuidores en todo el mundo. Para más información sobre ediciones

internacionales, póngase en contacto con su oficina Microsoft Corporación local, o contáctese con Microsoft Press International directamente

por fax al (425) 936-7329. Visite nuestro sitio Web en www.microsoft.com / MSPRESS. Envíe sus comentarios a [email protected].

Microsoft, Microsoft Press, Active Directory, ActiveX, Excel, Internet Explorer, MSDN, PowerPoint, SQL Server, Visio, Visual Basic, Visual

C #, Visual Studio, Windows, Windows Server y Windows Vista son marcas comerciales registradas o marcas comerciales del grupo de

compañías Microsoft. Otros nombres de productos y compañías mencionados aquí pueden ser las marcas comerciales de sus respectivos

propietarios.

Los ejemplos de compañías, organizaciones, productos, nombres de dominio, direcciones de correo electrónico, logotipos, personas, lugares y

eventos mencionados son ficticios. No se pretendió y no se debería deducir asociación con ninguna compañía, organización, producto, nombre

de dominio, dirección de correo electrónico, logotipo, persona, lugar o evento real.

Este libro expresa las visiones y opiniones del autor. La información contenida en este libro se proporciona sin ninguna garantía expresa,

estatutaria o implícita. Ni los autores, Microsoft Corporation, ni sus revendedores o distribuidores se hacen responsable de los daños y

perjuicios causados o presuntamente causados directa o indirectamente por este libro.

Adquisiciones Editor: Ken Jones Editor de desarrollo: De Sally Stickney Editor del proyecto: Denise Bankaitis Producción editorial: S4Carlisle Publishing Services Revisor técnico: Randall Galloway, los servicios de revisión técnicos fueron prestados por “Content Master”, un miembro del CM

Group, Ltd. Cubierta: Tom Diseño Draper

Body Part No. X15-12274

www.detodoprogramacion.com

Page 4: Microsoft SQL Server 2008 Español - Mike Hotek

Para Genilyn,

Haces que todo valga la pena.

www.detodoprogramacion.com

Page 5: Microsoft SQL Server 2008 Español - Mike Hotek

Mapa de contenidos

Parte I Introducción a Microsoft SQL Server 2008

Descripción general de Microsoft SQL Server. . . . . . . . . . . . . . . . . . . . . . . . .. . 3

Instalación y configuración de SQL Server 2008. . . . . . . . . . . . . . . . ……...…. 15

Uso de las herramientas de SQL Server 2008. . . . . . . . . . . . . . . . . . . . . . . . . 31

1

2

3

Parte II Diseñar bases de datos

Creación de bases de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 51

Diseñar tablas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 63

Índices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Particiones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..103

4

5

6

7

Parte III Recuperar y manipular datos

Recuperación de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Recuperación de datos avanzada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .137

Manipulación de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .153

8

9

10

Parte IV Diseñar avanzado de objetos de base de datos

Vistas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . Procedimientos almacenados. . . . . . . . . . . . . . . . . . . . . . . . . . . . ... . . . . . . . Funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . Triggers. (Desencadenadores). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Instantáneas de base de datos. . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . Service Broker (Intermediario) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Indexado de Full-Text (texto completo). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

179

185

199

213

219

225

247

11

12

13

14

15

16

17

Parte V Base de Datos

18 Seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . ... . . . . . . . . . . . 259

19 Administración basada en directivas. . . . . . . . . . .. . . . . . . . .. . . . . . . . . . . . 289

20 Recuperación de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . .. .. . . . . . . . . . . . 301

v

www.detodoprogramacion.com

Page 6: Microsoft SQL Server 2008 Español - Mike Hotek

vi Mapa de contenidos

21 Agente SQL Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . 319

22 Vistas de administración dinámica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333

Parte VI Visión general de alta disponibilidad

23 Alta disponibilidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 345

Parte VII Inteligencia de Negocios

24 SQL Server Integration Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377

25 SQL Server Reporting Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413

26 SQL Server Analysis Services. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 451

www.detodoprogramacion.com

Page 7: Microsoft SQL Server 2008 Español - Mike Hotek

Tabla de contenidos

Agradecimientos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii

Introducción. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Xix

Parte I Introducción a Microsoft SQL Server 2008

Descripción general de Microsoft SQL Server. . . . . . . . . . . . . . . . . . . . . . . .. . . 3

Motor de base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Motor de almacenamiento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Subsistema de seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Interfaces de programación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Service Broker. (intermediario) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Agente SQL Server. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . ... . . . . . 6

Replicación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . 6

Alta disponibilidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . 7

El motor relacional de SQL Server 2008. . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 8

Business Intelligence (Inteligencia de negocios) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Servicios de integración (Integration Services) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Servicios de Reporte (Reporting Services) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Servicios de Análisis (Analysis Services). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Capítulo 1 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1

2 Instalación y configuración de SQL Server 2008. . . . . . . . . . . . . .. . . . . . . . . . 15

Ediciones de SQL Server 2008. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

Requisitos de infraestructura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Cuentas de servicio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Secuencias de intercalación. (Collation Sequences) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Modos de autenticación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . 19

Instancias de servidor SQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Actualización a SQL Server 2008. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . …… ….20

Actualización “En el lugar” (in-place) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Actualización “Al lado del otro” (Side-by-Side). . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

¿Qué piensa usted de este libro? Queremos escucharlo!

Microsoft está interesado en escuchar sus comentarios así podemos mejorar continuamente nuestros libros y los recursos de aprendizaje para usted. Para participar en una breve encuesta en línea, por favor visite:

www.microsoft.com/learning/booksurvey/ vii

www.detodoprogramacion.com

Page 8: Microsoft SQL Server 2008 Español - Mike Hotek

viii Tabla de contenidos

Instalación de SQL Server 2008. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Instalar bases de datos de ejemplo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Capítulo 2 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

3 Uso de las herramientas de SQL Server 2008. . . . . . . . . .. . . . . . . . . . . . 31

Documentación de SQL Server. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 31

Herramientas de administración de SQL Server 2008. . . . . . . . . . . . . . . . . . . . . . . . 34

Gestor de configuración de SQL Server (Configuration Manager) . . . . . . . . . . 35

SQL Server Management Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Correo de Base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

Herramientas de gestión del rendimiento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Analizador (Profiler) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44

Asistente de puesta a punto (tuning) del motor de base de datos.. . . . . . . . . . . 44

Estudio de rendimiento. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Herramientas de Business Intelligence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

Business Intelligence Development Studio. (BIDS).. . . . . . . . . . . . . . . . . . . . . . 46

Capítulo 3 Referencia Rápida. . . . . . . . . . . . .. . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 47

Parte II Diseño de bases de datos

Creación de bases de datos. . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Bases de datos del sistema SQL Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Estructura de bases de datos de SQL Server . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 53

Los archivos de base de datos. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 53

Los grupos de archivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 56

Creación de una base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Mover bases de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ... .. . . . 59

Separar (detach) una base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

Adjuntar (attach) una base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . 60

Capítulo 4 Referencia Rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

4

5 Diseñar tablas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Nombrar objetos. . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Esquemas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Tipos de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 67

Los datos numéricos. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Los datos “carácter”. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

Datos Fecha y hora. . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 71

Datos del tipo binario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 72

XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

www.detodoprogramacion.com

Page 9: Microsoft SQL Server 2008 Español - Mike Hotek

Tabla de contenidos ix

Los datos FILESTREAM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Tipo de datos espaciales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Tipo de datos “hierarchyID” (jerarquía) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Propiedades de columna. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

Creación de tablas. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76

Columnas calculadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 77

Columnas “sparse” (espacio escaso). . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 78

Restricciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Claves principales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Restricciones UNIQUE. (valor único) . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 81

Restricciones CHECK. (de verificación).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Restricciones predeterminadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Las claves externas o foráneas .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Diagramas de bases de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

Capítulo 5 Referencia Rápida. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

6 Índices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 87

Estructura de índice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Los árboles balanceados (B-trees). . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 88

Niveles de indexación. . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 89

Índices agrupados. (cluster). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

Los índices no agrupados. . (nonCluster). . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 93

Mantenimiento de Índices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 93

Columnas incluidas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . 95

Cobertura de los índices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . 95

Índices filtrados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97

Creación de índices en línea. . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

Gestión y Mantenimiento de Índices. . . . . . . . . . . . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Fragmentación de índices. . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Factor de llenado. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Desfragmentación de un índice. . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Deshabilitar un índice. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Índices XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Índices espaciales. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

Capítulo 6 Referencia Rápida. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

7 Particiones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 103

Funciones de partición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 103

Esquemas de partición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

Los grupos de archivos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

www.detodoprogramacion.com

Page 10: Microsoft SQL Server 2008 Español - Mike Hotek

x

Tabla de contenidos

Particionar tablas e índices. . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

Copia de seguridad y restauración parcial. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Creación de un índice con particiones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Gestión de particiones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 110

Operadores Dividir y combinar. (SPLIT y MERGE). . . . . . . . . . . . . . . . . . . . . . . . . . 110

Modificación de un esquema de partición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

Alineación de Índice. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

Operador Conmutar (SWITCH). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 111

Capítulo 7 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . 117

Parte III Recuperar y manipular datos

Recuperación de datos. . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . 121

Declaración General de SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . 121

Ordenar Resultados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . 126

Filtrar datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 127

Recuperación de más de una tabla. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . 131

Recuperación de resultados únicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Capítulo 8 Referencia Rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 135

8

9 Recuperación de datos avanzada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Declaración General de SELECT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Agregación de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

Agregación de permutaciones múltiples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

Filtrado de Agregados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 143

Ejecución de Agregados. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 144

Cálculo de tablas dinámicas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

Clasificación de datos. (ranking). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Agregación de conjuntos de resultados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

Expresiones de tabla comunes. . . . . . . . . . . . . .. . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 149

Consulta de datos XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

Capítulo 9 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

10 Manipulación de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

Inserción de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

INSERT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

SELECT INTO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

Actualización de los datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

Eliminación de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . 161

TRUNCATE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

www.detodoprogramacion.com

Page 11: Microsoft SQL Server 2008 Español - Mike Hotek

Tabla de contenidos xi

Sentencia “combinar” (MERGE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

Cláusula “salida” (OUTPUT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

Manejo de transacciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Seguimiento de cambios. . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

Seguimiento de cambios. .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

Captura de datos modificados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

Capítulo 10 Referencia Rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

Parte IV Diseñar objetos avanzados de base de datos

Vistas. . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

Creación de una vista. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

Sustitución de consultas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

Modificar datos mediante una vista. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

Creación de una vista indexada. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

Sustitución de consultas. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

Capítulo 11 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

11

12 Procedimientos almacenados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

Crear procedimientos almacenados. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 185

Comentando Código. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 186

Variables, parámetros y códigos de retorno. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 186

Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

Parámetros. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

Códigos de retorno. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

Ejecutar procedimientos almacenados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

Construcciones de flujo de control. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .189

Manejo de errores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

Ejecución dinámica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193

Cursores. . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194

Procedimientos CLR. . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

Construyendo un procedimiento administrativo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

Capítulo 12 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

13 Funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 199

Funciones del sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 199

Crear una función. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . .. . . . 200

Recuperando datos desde una función. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . 204

Capítulo 13 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . 212

www.detodoprogramacion.com

Page 12: Microsoft SQL Server 2008 Español - Mike Hotek

xii Tabla de contenidos

14 Triggers.(Desencadenadores) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Desencadenadores DML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Desencadenadores DDL. . . . . . . . . . . . . . . . . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

Capítulo 14 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

15 Instantáneas de base de datos. . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 219

Creación de una instantánea de base de datos. . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 219

Tecnología “copiar al escribir” (Copy-on-Write). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Revertir datos utilizando una instantánea de base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . 222

Capítulo 15 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 223

16 Servicio Broker (Intermediario).. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 225

Arquitectura de servicio Broker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

Descripción de mensajería. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

Componentes de Service Broker. . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . 227

Interacción de aplicación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . 228

Tipos de mensajes y Contratos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 229

Tipos de mensajes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229

Contratos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 232

Colas y Servicios. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Colas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Servicios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 234

Conversaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

Enviar y recibir mensajes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . .. . . 236

Envío de mensajes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236

Recepción de mensajes. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . .. . . 237

Cola de activación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . 242

Priorización. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

Capítulo 16 Referencia rápida. . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

17 Indexación de texto completo.(full-text) . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . 247

Catálogos de full-text. . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

Índices de texto completo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249

Consulta de datos de texto completo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

FREETEXT (texto libre).. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . 252

CONTAINS (contiene). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

Capítulo 17 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

www.detodoprogramacion.com

Page 13: Microsoft SQL Server 2008 Español - Mike Hotek

Tabla de contenidos xiii

Parte V Base de Datos

Configuración de la superficie de ataque. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

Puntos finales (Endpoints) . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

Tipos de endpoints y cargas útiles (payloads).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

Acceso de Endpoint. . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

Endpoints TCP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262

Principales (Principals), elementos que pueden protegerse (Securables) y permisos. . . . . 264

Principales. . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

Suplantación de identidad (Impersonation).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273

Elementos que pueden protegerse (Securables).. . . . . . . . . . . . . . . . .. . . . . . . . . . . . 273

Permisos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

Cadenas de propiedad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

Seguridad CLR. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

Cifrado de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . 280

Llaves maestras. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 281

Algoritmos hash. . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

Claves simétricas. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

Certificados y claves asimétricas. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . 285

Encriptación de datos transparente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

Administración de claves de encriptación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

Capítulo 18 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

18 Seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 259

19 Administración basada en directivas. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . 289

Descripción general de administración basada en directivas. . . . . . . . . . . . . . . . . . . . . . . . . 289

Facetas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

Condiciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

Objetivos de la política. . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293

Políticas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

Categorías de políticas. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

Política de cumplimiento (compliance).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

Capítulo 19 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300

20 Recuperación de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

Copias de seguridad de las bases de datos. . . . . . . . . .. . . . . .. .. . . . . . . . . . . . . . . . . . . . . . 301

Tipos de copia de seguridad. . . . . . . . . . . . . . . . . .. . . . . . . . .. . . . . . . . . . . . . . . . . . . 302

Corrupción de página. . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 308

Modelos de recuperación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

Restauración de la base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311

www.detodoprogramacion.com

Page 14: Microsoft SQL Server 2008 Español - Mike Hotek

xiv Tabla de contenidos

Restaurar una copia de seguridad completa. . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . 311

Restaurar una copia de seguridad diferencial. . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . 314

Restaurar una copia de seguridad del registro de transaccioness. . . . .. . . . . . . . . . 315

Capítulo 20 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

21 Agente SQL Server. . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

Crear trabajos. (jobs) . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

Pasos de los jobs. . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

Programación de jobs. (Schedules) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320

Operadores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . .. . . . 321

Creación de planes de mantenimiento. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .. . . 325

Creación de alertas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 329

Capítulo 21 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332

22 Vistas de administración dinámica. . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 333

Listado de “vistas de gestión dinámica” DMV (Dynamic Management Views)... . . . . . . . . . . 333

Recuperar metadatos de objetos. . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . 334

Diagnóstico de base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

Tamaño del objeto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . 336

Índices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . .. . . 337

Estadísticas de ejecución de consultas. . . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . . .. . . 339

Capítulo 22 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341

Parte VI Visión general de alta disponibilidad

Alta disponibilidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345

Failover Clustering.( Agrupamiento a prueba de fallos) . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 345

Componentes de la instancia Cluster a prueba de fallos. . . . . . . . . . . . . .. . . . . .. . . . . 345

Configuración de la red. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . 346

Configuración de disco. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346

Configuración de seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346

Controles “de salud”. (Health) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347

Clúster a prueba de fallos . . . . . . .. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 348

Espejado de la base de datos (Database Mirroring). . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348

Roles del espejado de base de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349

Endpoints del espejado de base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350

Modos de operar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351

Almacenamiento en caché. . . . .. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 353

Redirección transparente de Cliente (Transparent Client Redirect) . .. . . . . . . . . . . . . . 354

Páginas corruptas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 354

23

www.detodoprogramacion.com

Page 15: Microsoft SQL Server 2008 Español - Mike Hotek

Tabla de contenidos xv

Instantáneas de base de datos. . . . . . . . . . . . . . . . . . . . . . .. . . . . . .. . . . . . . . . . . 354

Inicialización de Database Mirroring. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355

Envío de registros (log shipping).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

Componentes de log shipping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

Inicio de log shipping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357

Replicación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 363

Componentes de replicación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364

Roles de replicación. . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 365

Agentes de replicación. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 365

Métodos de replicación. . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 366

Capítulo 23 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373

Parte VII Inteligencia de Negocios

24 SQL Server Integration Services. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . 377

Descripción del BIDS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 378

Tareas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380

Transforma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 382

Construcción de un paquete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385

Conexiones. . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386

Flujo de control. . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390

Flujo de datos. . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394

Conversión de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401

Manejo de excepciones. . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . 403

Configuración. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . 406

Implementación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409

Capítulo 24 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411

25 SQL Server Reporting Services. . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 413

Configuración de Reporting Services. . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . 413

Sitio web de Reporting Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . 417

Creación de informes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418

Creación de un informe. . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 418

Formato. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423

Cálculos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429

Elementos interactivos. . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431

Parámetros. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434

Implementar informes. . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 439

Suscripciones a informes. . .. . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441

Informes vinculados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443

www.detodoprogramacion.com

Page 16: Microsoft SQL Server 2008 Español - Mike Hotek

xvi Tabla de contenidos

Cache de Informes e instantáneas. . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . .444

Capítulo 25 Referencia rápida. . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . 449

26 SQL Server Analysis Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451

Data Warehousing Visión general. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . 451

Procesamiento analítico en línea (OLAP). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452

Modelo Dimensional. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453

Cubos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . .. . . . 454

Dimensiones, medidas y cálculos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . 462

Jerarquías. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 467

KPIs, Particiones, perspectivas y traducciones. . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 470

Los indicadores clave de rendimiento (KPI). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470

Particiones. . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

Perspectivas. . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

Traducciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

Data Mining. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472

Algoritmos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473

Modelos y estructuras de minería. . . . . .. . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . 474

Minería de Datos desmitificada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483

Capítulo 26 Referencia rápida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485

Indice (en inglés).. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487

¿Qué piensa usted de este libro? Queremos saber de usted!

Microsoft está interesado en escuchar sus comentarios así podemos mejorar continuamente nuestros libros y los recursos de aprendizaje para usted. Para participar en una breve encuesta en línea, por favor visite:

www.microsoft.com/learning/booksurvey/

www.detodoprogramacion.com

Page 17: Microsoft SQL Server 2008 Español - Mike Hotek

Agradecimientos

Gracias a todos mis lectores de más o menos la última década, es difícil creer que este será el octavo libro que he escrito y no sería posible sin ustedes. Me gustaría dar las gracias al talentoso e increíblemente paciente equipo editorial de Microsoft Press - Denise Bankaitis y Sally Stickney. Especialmente me gustaría agradecer a Ken Jones, que ha pasado por cuatro libros conmigo y tiene un talento excepcional para mantener las cosas en movimiento sin problemas, a través de todas las diversas pruebas que se presentan durante los procesos de creación y edición. Mis palabras y pensamientos, probablemente serían un caos ininteligible sin la ayuda de Randall y Cristian, que no sólo suaviza las asperezas, sino que además le da sentido a muchas de mis misivas de las 3 A.M., que seguramente habrían cuestionando mi cordura.

xvii

www.detodoprogramacion.com

Page 18: Microsoft SQL Server 2008 Español - Mike Hotek

Introducción

Microsoft SQL Server ha sido la base de datos insignia de Microsoft durante más de 15 años. Antes de que se lance la próxima versión de SQL Server, SQL Server 2008 estará celebrando el cumpleaños número 20 de SQL Server. En este momento, SQL Server ha crecido desde manejar pequeñas tareas departamentales hasta dar servicio a las mayores bases de datos en el planeta. El lanzamiento de SQL Server 2000 produjo una evolución dramática de Microsoft SQL Server. Ya no es una simple "base de datos", Microsoft SQL Server es ahora una completa solución de arquitectura de datos, capaz de gestionar el almacenamiento de datos y las necesidades de cualquier organización.

SQL Server 2005 amplió la plataforma de datos con nuevas e impresionantes capacidades en programación, Integración con . NET, alta disponibilidad, la instrumentación de administración e inteligencia de negocios. Tan dramáticas fueron las mejoras en las funciones, que al tiempo que conserva el mismo "look and feel" de Microsoft SQL Server, Microsoft puso en producción una plataforma de datos completamente nueva.

SQL Server 2008 recoge la rápida innovación mediante la mejora de cientos de características existentes, mientras que al mismo tiempo agrega cientos de más. SQL Server 2008 también presenta una altamente escalable y adaptable plataforma de arquitectura de datos contra la que se puede construir cualquier aplicación imaginable. Sin embargo, con estas características nuevas y mejoradas vienen los desafíos para Los profesionales de TI. Sé por casi dos décadas de experiencia trabajando con y enseñando Microsoft SQL Server en organizaciones de todos los tamaños y abarcando todas las industrias, que si los usuarios no entienden cómo usar el producto de manera eficaz, ellos y su organización no serán capaz de obtener los beneficios completos de este producto de gran alcance. Al mismo tiempo, el rol y el conjunto de habilidades de un DBA están cambiando rápidamente. Aunque puede ser aceptable para un consultor enfocarse en un área muy específica, como en el ajuste del rendimiento (tuning), en el motor de almacenamiento, o la creación de informes; la mayoría de las empresas están empezando a insistir, en que sus DBAs sepan cómo diseñar, codificar y administrar soluciones que utilicen todas las características que se incluyen en SQL Server - desde la construcción de una tabla a hasta la construcción de un modelo de minería de datos.

Escribí este libro porque quería proporcionar, el primer tour completo de las características enteras disponibles en Microsoft SQL Server, a partir de las bases de datos relacionales que están en el núcleo de toda organización, a través de las capacidades únicas de gestión, y terminando con un conjunto de plataformas de análisis extraordinariamente poderosas que comprenden el núcleo de la Plataforma Microsoft Business Intelligence. Armado con esta información, usted será capaz de:

 

 

 

 

 

 

Ser Arquitecto, proteger y administrar bases de datos relacionales

Recuperar y manipular datos.

Expandir las capacidades de su aplicación con objetos programables

Asegurar y recuperar los datos de su empresa

Asegurarse que la plataforma de base de datos funcione bien y sea resistente.

Transformar sus datos de negocio en inteligencia de negocios

xix

www.detodoprogramacion.com

Page 19: Microsoft SQL Server 2008 Español - Mike Hotek

xx Introducción

¿Para quién es este libro?

El objetivo de este libro es enseñar los fundamentos de la plataforma de datos SQL Server 2008. SQL Server contiene características que atraen a cualquier persona involucrada con el almacenamiento o manipulación de datos dentro de una organización.

Este libro está dirigido a los profesionales de TI, quienes pueden ser nuevos en SQL Server o nuevos en SQL Server 2008. Los profesionales experimentados en SQL Server van a encontrar una gran cantidad de

información que es aplicable a sus puestos de trabajo.

Ningún libro puede posiblemente incluir todas las complejidades de SQL Server 2008. En su lugar, el foco está en proporcionar una visión general de cada función con la suficiente profundidad para que pueda construir aplicaciones SQL Server. A medida que avance a través de este libro, usted aprenderá cómo instalar cada uno de los componentes, configurar y gestionar instancias, y construir bases de datos. Se le guiará a través de cada una de las “herramientas cliente” que se suministran con SQL Server, y voy a explicar cómo cada herramienta le permite desarrollar y administrar su entorno de base de datos. Usted aprenderá a manipular datos, asegurar sus bases de datos, gestionar y proteger sus datos, y distribuir su plataforma de datos para que sea más escalable, redundante y tolerable a fallos. Usted aprenderá a integrar sus datos de SQL Server con una variedad de fuentes, elaborar informes para servir a sus líneas de negocio, y, finalmente, alimentar todos estos datos dentro de un poderoso sistema de análisis y minería de datos para ofrecer información “para la acción” a las líneas de negocio, en tiempo casi real.

¿Cómo está organizado este libro?

Este libro está organizado en siete partes, junto con tres artículos en línea que le permiten centrarse en porciones específicas dentro de la plataforma del servidor SQL, así como funciones específicas de trabajo, de la siguiente manera:

  La primera parte describe los componentes básicos disponibles en SQL Server junto con las instrucciones sobre la instalación de cada componente. También obtendrá una visión general de cada herramienta que se incluye en SQL Server y que se van a utilizar durante todo el libro.

La segunda parte muestra cómo crear y configurar bases de datos para proporcionar la base para las estructuras de tablas e índices que forman la columna vertebral de cada aplicación de base de que se va a crear.

La tercera parte le enseña a manipular y recuperar datos.

La cuarta parte es una introducción a las estructuras fundamentales de programación disponibles: procedimientos almacenados, vistas, funciones y disparadores.

La quinta parte explica cómo asegurar, gestionar, realizar copias de seguridad y recuperar bases de datos.

La sexta parte proporcionará una introducción a las tecnologías de alta disponibilidad que se incluyen con SQL Server, como agrupación (clustering), copia de base de datos y traspaso de registros (log shipping).

La séptima parte abarca las tres tecnologías de inteligencia de negocios - Servicios de integración (SSIS), Servicios de Reportes (SSRS) y Servicios de Análisis (SSAS).

 

 

 

 

 

 

www.detodoprogramacion.com

Page 20: Microsoft SQL Server 2008 Español - Mike Hotek

Introducción

 

xxi

El material extra está disponible en línea en tres artículos, “Performance Analysis and Tuning”, ("Análisis de rendimiento y Afinación"), “Performance and Data Capture Tools” ("Herramientas para rendimiento y captura de datos ") y “Performance Analysis Tools” ("Herramientas de análisis de rendimiento"); en el sitio web de la “Prensa online de Microsoft Windows Server y Cliente”: www.microsoft.com/aprendizaje/books/online/ ServerClient

¿Cómo encontrar su mejor punto de partida en este libro?

Este libro está diseñado para ayudar a desarrollar habilidades en varias áreas esenciales. Puede utilizar este

libro, tanto si usted es nuevo en SQL Server como si está cambiando desde otro sistema de base de datos. Utilice la siguiente tabla para encontrar el mejor punto de partida.

Si usted es un (a) Siga estos pasos

1. Instale los archivos de prácticas que se describen en la siguiente sección, "Instalación y uso de los archivos de práctica. "

2. Trabaje con los capítulos de las partes uno a la cuatro secuencialmente.

3. Complete las partes cinco a siete, junto con los tres artículos en línea, según lo dicte su nivel de experiencia e interés.

1. Instale los archivos de prácticas que se describen en la siguiente sección, "Instalación de y uso de los archivos de práctica. "

2. Repase (sin entrar demasiado en detalle) los capítulos de la primera parte para tener una visión general de la instalación SQL Server y las herramientas disponibles, y luego concéntrese en los capítulos de las Partes dos a cuatro.

3. Complete las Partes cinco a siete, junto con los 3 artículos en línea según lo marque su nivel de experiencia e interés.

DBA, arquitecto de base de datos, desarrollador de bases de datos, ingeniero de base de datos, o analista de datos

Application Developer (Desarrollador de aplicaciones)

Administrador de sistemas, Administrador de red, o

administrador de seguridad

1. Instale los archivos de prácticas que se describen en la siguiente sección, "Instalación y uso de los archivos de práctica. "

2. Trabaje con los capítulos de la primera parte.

3. Repase (sin entrar demasiado en detalle) los capítulos de las Partes 2 a 4.

4. Trabaje con los capítulos de la quinta parte.

5. Complete con las Partes Seis y Siete, junto con los tres artículos en línea, según lo marque su nivel de experiencia e interés.

Analista de negocios (B.A.)

1. Instale los archivos de práctica que se describen en la siguiente sección, "Instalación de y uso de los archivos de práctica. "

2. Repase (sin entrar demasiado en detalle) los capítulos de las partes 1a 6.

3. Trabaje con los capítulos de la Parte 7 según lo dicte su nivel de experiencia e interés.

4. Complete con los tres artículos en línea según lo dicte su nivel de experiencia e interés.

IT Management (Gerente TI)

1. Trabaje con el Capítulo 1.

2. Repase el resto de los capítulos y artículos en línea según su nivel de experiencia y de interés.

Hace referencia al libro después de trabajar a través de los ejercicios

1. Utilice el índice o tabla de contenidos para encontrar información acerca de

temas particulares.

2. Lea las secciones de referencia rápida al final de cada capítulo para encontrar una breve revisión de la sintaxis y técnicas presentadas en el capítulo.

www.detodoprogramacion.com

Page 21: Microsoft SQL Server 2008 Español - Mike Hotek

xxii Introducción

Convenciones y características en este libro

Este libro presenta la información utilizando las convenciones diseñadas para hacer que la información sea legible y fácil de seguir. Antes de comenzar, lea la siguiente lista, que explica las convenciones que verá a través de todo el libro y que señala características útiles que es posible que desee utilizar.

Convenciones

  Cada ejercicio es una serie de tareas. Cada tarea se presenta como una serie de pasos numerados

(1, 2, y así sucesivamente). Una viñeta redonda (•) indica un ejercicio que tiene un solo paso.

Notas etiquetadas como "Tip" (consejo), proporcionan información adicional o métodos alternativos para completar satisfactoriamente un paso.

Notas etiquetadas con "importante" lo alertan sobre información que usted necesita comprobar antes de continuar.

El texto que usted “escribe” aparecerá en negrita.

Un signo más (+) entre dos nombres de teclas significa que debe pulsar las teclas al mismo tiempo. Por ejemplo, "Pulse Alt + Tab" significa que usted mantenga pulsada la tecla Alt mientras se presiona la tecla Tab.

 

 

 

 

Otras características

  Las barras laterales en todo el libro, proporcionan información con mayor profundidad sobre el ejercicio. Las barras laterales pueden contener información de referencia, consejos de diseño o características relacionadas con la información que se discute.

Cada capítulo termina con una sección de referencia rápida. La sección de referencia rápida

contiene recordatorios rápidos sobre cómo realizar las tareas que aprendió en el capítulo.  

Requisitos del sistema

Usted necesitará el siguiente hardware y software para realizar los ejercicios de práctica en este libro:

  Microsoft Windows Vista Home Basic Edition o superior, Windows Server 2008 Standard

edition o superior, Windows Server 2003 SP2 o superior, o Windows XP Professional SP2 o superior.

Nota SQL Server 2008 no se admite en Windows Server 2008 Server Core edition.

www.detodoprogramacion.com

Page 22: Microsoft SQL Server 2008 Español - Mike Hotek

Introducción

 

xxiii

Microsoft SQL Server 2008 Evaluation Edition, SQL Server 2008 Developer Edition, o

SQL Server Enterprise Edition 208.

Nota Puede utilizar otras ediciones de SQL Server 2008, sin embargo, estará limitado al conjunto de características soportadas por la edición de SQL Server que tenga instalada.

 

 

 

 

 

 

Procesador Pentium III 2,0 GHz o más rápido

1 GB de RAM física disponible

2 GB de espacio disponible en disco

Videos (800 × 600 o mayor resolución) monitor con 256 colores como mínimo

CD-ROM o DVD-ROM

Ratón Microsoft o dispositivo compatible

También tendrá que tener acceso de administrador en el equipo para configurar SQL Server 2008.

Bases de datos de ejemplo

Todos los ejemplos en este libro utilizan las bases de datos de muestra AdventureWorks y AdventureWorksDW. Dichas bases de datos de ejemplo ya no se incluyen con SQL Server sino que deben ser descargadas desde el sitio web de CodePlex en http://www.codeplex.com/SQLServerSamples

Consejo: Además de las bases de datos de muestra, el sitio de CodePlex contiene decenas de jemplos, muestras de aplicaciones y add-ons (complementos) que en gran medida pueden mejorar su experiencia en SQL Server.

Ejemplos de código

El CD que acompaña el interior de este libro contiene los ejemplos de código que utilizará mientras realiza los ejercicios. Mediante el uso de los ejemplos de código, no perderá tiempo creando ficheros ya que no es relevante para el ejercicio. Los archivos y las instrucciones paso a paso en las lecciones le permiten aprender haciendo, que es una forma fácil y eficaz para adquirir y recordar las nuevas habilidades.

Contenidos Digitales para lectores de libros digitales: Si usted compró una edición exclusivamente digital de este libro, puede disfrutar de los contenidos de selección de CD que acompaña la edición de impresión Visite http://go.microsoft.com/fwlink/?LinkId=129790 para obtener su contenido descargable. Este contenido está siempre actualizado y disponible para todos los lectores.

www.detodoprogramacion.com

Page 23: Microsoft SQL Server 2008 Español - Mike Hotek

xxiv Introducción

Instalación de los ejemplos de código

Siga estos pasos para instalar los ejemplos de código y el software requerido en el equipo para utilizarlo con los ejercicios.

1. Retire el CD que acompaña el paquete dentro de este libro e insértelo en su lectora de CD-ROM o DVD.

Nota Un acuerdo de licencia de usuario final se abrirá automáticamente. Si este acuerdo no aparece, abra Mi PC en el escritorio o en el menú Inicio, haga doble clic en el icono de la lectora de CD-ROM y, a continuación, haga doble clic en StartCD.exe.

2. Revise el contrato de licencia de usuario final. Si acepta los términos, seleccione “aceptar” y luego haga clic en Siguiente.

Aparecerá un menú con las opciones relacionadas con el libro.

3. Haga clic en Instalar ejemplos de código.

4. Siga las instrucciones que aparecen.

Los ejemplos de código se instalan en la siguiente ubicación en el equipo:

Documents\Microsoft Press\SQL Server 2008 Step by Step.

Usando los ejemplos de código

Cada capítulo de este libro explica cuándo y cómo utilizar las muestras de código para ese capítulo. Cuando llega el momento de utilizar un ejemplo de código, el libro listará las instrucciones sobre cómo abrir los archivos.

Desinstalación de los ejemplos de código

Siga estos pasos para eliminar los ejemplos de código de la computadora.

1. En el Panel de control, abra Agregar o quitar programas si se ejecuta Windows XP o “Programas\Desinstalar un programa” si se ejecuta Windows Vista.

2. En la lista de programas instalados actualmente en Windows XP, o de la lista de “desinstalación

o cambiar un programa” en Windows Vista, seleccione <Microsoft SQL Server 2008 Paso a

Paso>.

3. Haga clic en “Quitar” en Windows XP o haga clic en “Desinstalar/Cambiar” en Windows Vista.

4. Siga las instrucciones que aparecen para quitar los ejemplos de código.

www.detodoprogramacion.com

Page 24: Microsoft SQL Server 2008 Español - Mike Hotek

Introducción xxv

Buscar contenido adicional en línea

A medida que surja nuevo material o se actualice el existente, que complementa este libro, se publicarán en línea en el sitio de “Microsoft Press Online Web Developer Tools”. El tipo de material que se puede encontrar incluye actualizaciones de contenido de libros, artículos, enlaces a contenido complementario, erratas, capítulos de ejemplo, y más. Este sitio Web está disponible en www.microsoft.com/learning/books/online/ServerClient, y se actualiza periódicamente.

Soporte para este libro

Cada esfuerzo, se ha hecho para asegurar la exactitud de este libro y del contenido del CD complementario. A medida que se realicen correcciones o cambios, se añadirán en artículos de la base de conocimientos de Microsoft.

Microsoft Press proporciona soporte para libros y CDs en el siguiente Sitio web:

http://www.microsoft.com/learning/support/books/default.mspx.

Preguntas y comentarios

Si tiene comentarios, preguntas o ideas sobre el libro o el CD que acompaña, o bien preguntas que no son contestadas al visitar los lugares web arriba mencionados, por favor envíe un e-mail a Microsoft Press:

[email protected]

O por correo postal a:

Microsoft Press

Atención: Editor de la serie “Programación de Microsoft SQL Server 2008 paso a paso”. Redmond, WA 98052-6399.

Por favor tenga en cuenta que el soporte del producto de software de Microsoft no se ofrece a través de las direcciones arriba mencionadas.

www.detodoprogramacion.com

Page 25: Microsoft SQL Server 2008 Español - Mike Hotek

Parte I

Introducción a Microsoft

SQL Server 2008

En esta parte: Capítulo 1: Descripción general de Microsoft SQL Server. . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Capítulo 2: Instalación y configuración de SQL Server 2008. . . . . . . . . . . . . . . . . . . . . . . . 15

Capítulo 3: Uso de las herramientas de SQL Server 2008. . . . . . . . . . . . . . . . . . . . . . . . . . 31

1

www.detodoprogramacion.com

Page 26: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 1

Descripción general de MS SQL Server

Después de completar este capítulo, usted será capaz de:

 

 

Elegir los componentes de SQL Server apropiados para las necesidades de su negocio.

Conocer el alcance de la instalación y la arquitectura de componentes.

En un pasado no muy lejano, muchas personas que trabajaban dentro de los departamentos de TI tuvieron que luchar interminables batallas dentro de sus organizaciones para obtener financiación para los sistemas, implementación de proyectos y contratación del personal para gestionar toda la tecnología. El primer punto del siempre presente “hacha” al presupuesto era todo el departamento de TI. Esta precaria situación era el resultado de ejecutivos miopes viendo la infraestructura de TI estrictamente como un centro de costo que drena fondos de las operaciones de negocios "más importantes".

Mientras que los departamentos de TI se encuentran todavía en una continua batalla para su financiación, al menos se torció su imagen, y así es que las organizaciones consideran ahora su infraestructura de TI como un factor necesario en la conducción de sus ventajas competitivas. Con las "recién descubiertas" ventajas en la Infraestructura de TI, ha llegado una proliferación de aplicaciones y sistemas que necesitan almacenar grandes cantidades de datos a la vez que requieren un acceso rápido a los datos con el fin de dar servicio a los requerimientos del negocio. Las demandas de las aplicaciones de negocio han impulsado una explosión de tecnología SQL Server.

SQL Server solía ser un producto razonablemente sencillo que consistía en un motor de base de datos para el procesamiento de transacciones en línea (OLTP), junto con los componentes de réplica para distribuir los datos. Durante varios ciclos de producción, SQL Server se ha convertido en una plataforma de largo alcance de datos, capaz de dar servicio de almacenamiento de datos, manipulación y presentación de las necesidades de una empresa.

En este capítulo, usted aprenderá acerca de los componentes principales de la plataforma de datos SQL Server. Usted también aprenderá cómo cada componente entra en un plan de arquitectura de datos general para satisfacer necesidades de su negocio.

Motor de base de datos

El motor de base de datos es el servicio principal que proporciona el servidor SQL, el cual le permite almacenar, recuperar, procesar y proteger los datos. Los servicios del Motor de base le permiten crear aplicaciones de alto rendimiento de base de datos para el procesamiento de transacciones en línea (OLTP) y el soporte en línea de procesamiento analítico (OLAP).

3

www.detodoprogramacion.com

Page 27: Microsoft SQL Server 2008 Español - Mike Hotek

4 Parte I Introducción a Microsoft SQL Server 2008

Motor de Almacenamiento

El motor de almacenamiento se encuentra en el corazón de SQL Server, controlando cómo se almacenan los datos en el disco y estando a disposición de las aplicaciones. A pesar que el motor de almacenamiento es un componente interno con el que usted no interactúa directamente, contiene componentes vitales para el almacenamiento y la gestión de sus datos.

El motor de almacenamiento administra el almacenamiento de datos basado en las definiciones los tipos de datos de tabla y columna. Para mejorar el rendimiento de las consultas, puede crear y mantener índices. Puede dividir grandes tablas e índices a través de múltiples estructuras de almacenamiento, aprovechando el particionamiento. Las instantáneas de bases de datos le permiten generar rápidamente una copia de la base de datos en un punto en el tiempo y de sólo lectura. El acceso multiusuario a los datos es arbitrado a través de las capacidades de bloqueo y gestión de transacciones, para garantizar el acceso consistente de datos. Para proteger los datos contra pérdidas catastróficas, puede realizar una copia de seguridad de toda o parte de una base de datos y tener la capacidad para restaurar los datos que han sido dañados.

Aunque no es una lista exhaustiva, algunos de los elementos del motor de almacenamiento que se explican

en este libro se muestran en la Tabla 1-1.

TABLA 1-1 Características del motor de almacenamiento

Capítulo referencia

4

5

6

7

7

10

15

20

Descripción de características

Bases de datos, grupos de archivos y archivos.

Tablas, tipos de datos y propiedades de almacenamiento de datos

Índices

Particionamiento

Arquitectura interna de datos

Bloqueo y gestión de transacciones

Instantáneas de base de datos

Copia de seguridad de datos y recuperación

Subsistema de seguridad

SQL Server 2008 incluye una infraestructura de seguridad muy potente y flexible que asegura que sus datos e instancias estén protegidos de intrusión.

SQL Server puede controlar la manera que a los clientes se les permite autenticar, mediante la aplicación de las credenciales de Windows o permitir inicios de sesión de SQL Server internos. Puede activar o desactivar varias funciones del motor de SQL Server para garantizar que sólo el subconjunto de características necesario para soportar sus aplicaciones, esté disponible. Puede establecer permisos en múltiples niveles para controlar la capacidad de lectura/escritura de datos, así como manipular los objetos dentro de una instancia de SQL.

www.detodoprogramacion.com

Page 28: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 1 Descripción general de Microsoft SQL Server 5

Puede proteger los datos almacenados en sus bases de datos mediante el cifrado a través de una variedad de mecanismos incluyendo soporte integrado de cifrado de clave, para productos de terceros. Un sistema completo de auditoría se encuentra disponible para realizar el seguimiento del uso de los permisos elevados, así como cualquier cambio de permisos que pueda asignar. Por último, puede implementar políticas dentro de su entorno, no sólo para estandarizar las instalaciones y configuraciones, sino también para hacer cumplir los elementos de sus políticas de seguridad.

Usted va a interactuar con el subsistema de seguridad desde el momento en que comience la instalación y configuración de instancias de SQL Server en el Capítulo 2, "Instalación y configuración de SQL Server 2008". Va a separar objetos en grupos lógicos de seguridad en el capítulo 5, "Diseño de tablas". Una vez que usted ha conseguido estar cómodo con muchas de las funciones de programación y almacenamiento de SQL Server, estará listo para tomar el tour de punta a punta de las capacidades de seguridad restantes que se describen en el Capítulo 18, "Seguridad" y en el Capítulo 19, "Administración basada en directiva".

Algunos de los elementos del subsistema de seguridad que se explican en este libro se enumeran en la Tabla 1-2.

TABLA 1-2 Características de la seguridad

Capítulo de referencia

2

2

2

5

18

18

18

18

19

Descripción de características

Métodos de autenticación

Cuentas de servicio

Activación y desactivación de funciones (Configuración de superficie)

Esquemas

Principios, elementos que pueden protegerse y permisos

Cifrado de datos

Firmas de código

Auditoría

Configuración de política, gestión y aplicación

Interfaces de programación

A través de Transact-SQL (T-SQL), usted tiene acceso a una programación rica, simple y potente. Si el lenguaje T-SQL no satisface sus necesidades, puede ampliar las características del servidor mediante el aprovechamiento de las capacidades de los lenguajes de programación dentro del “common language runtime” (CLR) tales como Microsoft Visual Basic o Microsoft Visual C #.

Las capacidades del lenguaje XML se integran directamente en el motor, lo que le permite almacenar y consultar datos XML, así como devolver conjuntos de resultados en una variedad de formatos XML. El código puede ser modularizado, almacenado en el servidor, y accedido desde sus aplicaciones mediante el aprovechamiento de vistas, procedimientos almacenados, funciones y desencadenadores. Las capacidades de búsqueda de texto-completo le permiten construir interfaces de consulta a través de grandes volúmenes de datos de texto no estructurados.

www.detodoprogramacion.com

Page 29: Microsoft SQL Server 2008 Español - Mike Hotek

6 Parte I Introducción a Microsoft SQL Server 2008

La Tabla 1-3 enumera algunos de los elementos de programación que se utilizan en este libro.

TABLA 1-3 Características de programación del servidor SQL.

Capítulos de Referencia

10

10

8 y 9

9

9

9

11

12

13

14

15

17

Descripción de características

INSERT / UPDATE / DELETE / MERGE

Seguimiento de cambio de datos

SELECT / JOINS / Criterios de QUERY / SORTING / Subconsultas

Funciones del sistema / Agregados / expresiones de tabla comunes

Datos espaciales

CUBE / ROLLUP / EXCEPT / INTERSECT / XML

Vistas

Procedimientos almacenados

Funciones

Disparadores

Instantáneas de base de datos

Texto completo

Service Broker (Servicio “agente o intermediario”)

Service Broker se introdujo en SQL Server 2005 para proporcionar un sistema de cola de mensajes integrado en la plataforma de datos SQL Server. Basado en los mensajes definidos por el usuario y las acciones de procesamiento, se puede aprovechar Service Broker para proporcionar capacidades de procesamiento de datos asíncronos. Service Broker se trata en detalle en el Capítulo 16, "Service Broker".

Agente de SQL Server

El Agente de SQL Server es el motor de programación y alertas. Uno de los componentes básicos del Agente SQL Server es la capacidad de crear “Jobs” flexibles que pueden tener varios pasos y dependencias entre los pasos del job que se puede ejecutar en varios “schedules” (programaciones). Puede configurar alertas basadas en una variedad de condiciones que pueden llevar a cabo acciones automatizadas o enviar mensajes a los registros (logs) de errores u operadores configurados. En el capítulo 21, "Agente SQL Server" aprenderá mucho más sobre él.

Replicación

Casi desde su inicio, SQL Server ha sido capaz de distribuir copias de datos, así como mantener todas las copias sincronizadas con el conjunto de datos maestros. A través de los años, la capacidades de distribución de SQL Server se han expandido desde el mantenimiento de múltiples copias de sólo lectura a ser capaz de hacer los cambios de datos en toda la red de bases de datos al tiempo que el motor de replicación sincroniza todos los cambios en el ambiente.

www.detodoprogramacion.com

Page 30: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 1 Descripción general de Microsoft SQL Server 7

A través de la replicación de “instantáneas”, el motor de replicación incluye soporte para hacer periódicamente instantáneas de un conjunto de datos que se aplican a múltiples máquinas. Después de la aplicación de una instantánea inicial, la replicación transaccional transfiere los cambios incrementales de datos desde el publicador hacia cada suscriptor. La replicación transaccional también tiene capacidades adicionales: permitir que los cambios sean hechos a un suscriptor y sincronizado de nuevo a un publicador (editor), y dejar que una arquitectura peer-to-peer sea implementada por medio de muchas instancias de SQL Server se pueden replicar entre sí como iguales. La replicación de mezcla (merge) permite a los usuarios móviles, desconectados, tomar conjuntos locales de datos, realizar cambios a nivel local, y luego sincronizar todos los cambios con el servidor.

Libros enteros se pueden hacer y se han escrito sobre el motor de replicación de SQL Server, y mientras que la cobertura completa de este tema va más allá del alcance de este libro, aquí recibirá una introducción a sus características en el Capítulo 23, "Alta disponibilidad".

Alta disponibilidad

Para satisfacer las necesidades de la mayoría de los exigentes requisitos de tiempo de actividad de las aplicaciones, SQL Server proporciona varias tecnologías para garantizar la disponibilidad de los datos: la conmutación por error, la copia de base de datos, el envío de registros, y la replicación.

  Las instancias de SQL Server en clúster por conmutación por error, las cuales se construyen en la parte superior de los servicios de clústeres de Windows (y aprovecha sus capacidades), proporcionan capacidades de falla de hardware automatizado. Con la conmutación por error, la instancia está protegida en caso de una falla de hardware.

El espejado (Mirroring) de base de datos se basa en los procesos internos de gestión de registro (logs) en el motor de almacenamiento, para mantener una segunda copia de una base de datos con una latencia extremadamente baja. La base de datos espejada se puede ejecutar en un modo sincrónico, lo que garantiza que las transacciones no se pierden nunca si ocurre un fallo en la base de datos primaria.

El traspaso de registros se basa en la “copia de seguridad/restauración” del motor junto con el Agente SQL Server, para programar aplicaciones automatizadas de copias de seguridad del registro de transacciones en un servidor secundario.

La replicación aprovecha las capacidades compatibles con el motor de replicación, descriptos anteriormente, que le permite mantener una copia de la totalidad o una parte de una base de datos.

 

 

 

En una instancia, se puede aplicar el espejado de base, el traspaso de registros (logs), y la réplica para proporcionar copias redundantes de bases de datos completas o subconjuntos de bases de datos, que pueden ser utilizadas en el caso de una falla en la plataforma de base de datos primaria.

Las características de alta disponibilidad disponibles en SQL Server 2008 se explican con más detalle en el capítulo 23.

www.detodoprogramacion.com

Page 31: Microsoft SQL Server 2008 Español - Mike Hotek

8 Parte I Introducción a Microsoft SQL Server 2008

El motor relacional de SQL Server 2008

En la tabla 1-4 se enumeran algunos de los cambios en SQL Server 2008, junto con los capítulos en los que estas características se tratan en mayor detalle.

TABLA 1-4 Nuevas características en el motor relacional

Capítulos

Referenciado

5

5

5

5 y 9

6

6

7 y 23

10

10

10

9

12 y 13

16

17

18

Descripción de características

Tipo de datos “Jerarquía” (Hierarchy) para permitir el almacenamiento de datos jerárquicos

Tipo de datos FILESTREAM para almacenar datos de gran tamaño, no estructurados en el sistema operativo, mientras que permanecen bajo el control transaccional de SQL Server

Tipos de datos DATE y TIME para almacenar sólo los componentes necesarios para una aplicación, en lugar de ambos.

Los tipos de datos espaciales GEOMETRY y GEOGRAPHY permiten el almacenamiento de datos basados en Geometría euclidiana y en un sistema de coordenadas GPS, respectivamente. Las columnas SPARSE y los conjuntos de columnas, permiten la optimización en el almacenamiento de columnas que aceptan valores NULL.

Se pueden crear índices filtrados en un subconjunto de filas de una tabla

SWITCH permite particiones en una tabla que está participando en replicación transaccional para ser “conmutada” (switched)

El seguimiento de cambios proporciona un mecanismo asíncrono para capturar un registro de los cambios. Y consultarse más tarde por las aplicaciones interesadas sólo en lo que ha cambiado

Los constructores de registros (Row constructors) permiten valores múltiples en una sola instrucción de inserción

La sentencia MERGE permite llevar a cabo operaciones INSERT, UPDATE, y DELETE en una sola sentencia.

Los conjuntos de agrupación permiten la agregación de datos en múltiples niveles dentro de una sola declaración S ELECT.

Los parámetros de valores de tabla permiten que las tablas sean pasadas como parámetros de entrada a las funciones y procedimientos almacenados.

Las conversaciones pueden ser priorizados, para permitir que mensajes de mayor prioridad sean distribuidos antes que los de menor prioridad.

El motor de “texto completo” que permite consultas en texto no estructurado, ha sido

completamente reconstruido.

La administración de claves extensibles permite a otros proveedores registrar sus dispositivos de gestión de claves dentro de SQL Server para que se puede así acceder directamente a través de T-SQL.

El cifrado de datos transparente permite a los administradores de bases de datos (DBAs) cifrar los datos en el disco y dentro de copias de seguridad automáticamente, sin impacto a las aplicaciones

Un subsistema de auditoría configurable por el usuario tiene todas las capacidades necesarias para almacenar, administrar y revisar los rastros de la auditoría.

La gestión basada en políticas permite a los DBA’s configurar un conjunto de mejores prácticas y configuraciones que se comprueban, aplican, controlan, e informan.

Los servidores de configuración se pueden crear para simplificar la gestión de los grupos de instancias de SQL Server.

18

18

19

19

www.detodoprogramacion.com

Page 32: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 1 Descripción general de Microsoft SQL Server

TABLA 1-4

9

Nuevas características en el motor relacional

Capítulos

Referenciado

20

22

Artículo Online

Artículo Online

Descripción de características

Las copias de seguridad pueden ser comprimidas así como encriptadas.

Nuevas vistas de administración dinámica (DMV) ayudan en la solución de problemas y en el monitoreo del sistema.

El filtrado optimizado de mapas de bits permite que los filtros de mapas de bits sean dinámicamente colocados dentro de planes de consultas en paralelo.

Las “guías de planificación” fueron introducidas en SQL Server 2005 para permitir a los administradores especificar un plan para ser usado por el optimizador. SQL Server 2008 mejora la función “guías de planificación” con un mejor seguimiento, eventos de perfil, contadores del sistema y la validación. SQL Server Extended Events le permitirá configurar puntos de seguimiento dentro de un proceso de host de servidor para diagnosticar problemas

El regulador de recursos le permite restringir la cantidad de recursos, como por ejemplo

memoria o CPU, que las peticiones entrantes pueden utilizar.

Mirroring de base de datos tiene varias mejoras en el rendimiento del buffer de registro de envío y recepción, junto con la capacidad de recuperar automáticamente las páginas dañadas en el espejo

La replicación Peer-to-peer (punto a punto) ahora incluye capacidades de detección de conflictos.

Para las plataformas de hardware compatibles con el agregado de un procesador “en caliente”, SQL Server 2008 puede dinámicamente reconocer los nuevos procesadores que están disponibles

Las características designados como “artículos en línea” están disponibles para su descarga gratuita desde Microsoft Press On line Windows Server y el sitio Web cliente en www.microsoft.com/learning/books/online/ServerClient.

N / A indica que una característica que está más allá del alcance de este libro

Artículo Online

Artículo Online

23

23

N / A

Inteligencia de negocios

La lista de los servicios de inteligencia de negocios (BI) es relativamente nueva en el servidor SQL Server. A medida que el papel de las TI se ha disparado en las empresas, también lo han hecho el número y el alcance de aplicaciones de almacenamiento de datos. El desafío para cada organización es que cada línea de aplicación de negocio generalmente tenga sistemas de almacenamiento de datos diseñado específicamente para una aplicación. Si bien la especificidad de la línea de diseños de negocio permite a las aplicaciones un servicio rápido para necesidades específicas, se crea un problema a nivel de organización.

Es posible que haya información de clientes repartidos en decenas o cientos de bases de datos en diversas plataformas de sistema de gestión de base de datos (DBMS). También puede haber información de apoyo de ventas almacenada en una variedad de hojas de cálculo y la comunicación con el cliente podría extenderse a través de varios sistemas de correo electrónico y aplicaciones de gestión de contactos. Los programas de fabricación podrían existir dentro de varios sistemas de gestión de proyectos y de planificación de recursos empresariales (ERP).

Para utilizar todos los datos operativos producidos dentro de cualquier organización, hay una necesidad de traer grandes cantidades de información (que está distribuida a través de sistemas dispares), en un único y coherente, conjunto de datos.

www.detodoprogramacion.com

Page 33: Microsoft SQL Server 2008 Español - Mike Hotek

10 Parte I Introducción a Microsoft SQL Server 2008

El objetivo de los servicios prestados por la plataforma de inteligencia de negocios es permitir a los departamentos de TI, crear potentes aplicaciones de análisis de datos al tiempo que consolida la información corporativa en un sistema único análisis.

Las capacidades de BI abarcan tres componentes que permiten a las empresas:

 

 

 

 

Integrar, depurar y transformar datos de múltiples fuentes

Construir reportes ad hoc o automatizados

Proporcionar exploración y análisis de datos de gran alcance

Búsqueda para patrones de optimización de negocio dentro de grandes volúmenes de datos

Servicios de integración

Con SQL Server 2005 se incluye la primera versión de Microsoft de la próxima generación en la plataforma de integración de datos: “SQL Server Integration Services” (SSIS). Mientras que su predecesor, Data Transformation Services (DTS), fue usado ampliamente en muchas organizaciones para mover la información, SSIS tomó esta utilidad a un nuevo nivel, permitiendo a las organizaciones construir plataformas potentes y flexibles de integración de datos y aplicaciones que iban mucho más allá de las simples tareas de movimiento de datos que se hacían con DTS.

SSIS incluye todas las capacidades de clase empresarial que se pueden encontrar en aplicaciones de extracción, transformación y carga (ETL), al tiempo que permite a las organizaciones construir aplicaciones que puedan gestionar bases de datos, recursos del sistema, responder a los eventos de la base de datos y del sistema, e incluso interactuar con los usuarios.

SSIS tiene una variedad de tareas para permitir a los paquetes cargar o descargar archivos mediante el protocolo (FTP), manipular archivos en directorios, archivos de importación entre bases de datos o bien exportación de datos hacia los archivos. SSIS también puede ejecutar aplicaciones, interactuar con servicios web, enviar/recibir mensajes de Microsoft Message Queue (MSMQ), y responder a eventos de Windows Management Instrumentation (WMI). Los “contenedores” le permiten a SSIS ejecutar tareas enteras (flujos de trabajo) dentro de un bucle con una variedad de entradas (inputs) a partir de un simple contador de archivos en un directorio o a través del resultado de una consulta (query). Se incluyen además tareas especializadas para copiar objetos de SQL Server en un determinado entorno, así como gestionar las copias de seguridad de la bases de datos, re-indexación y otros tipos de operaciones de mantenimiento. Si SSIS no viene con una tarea ya diseñada para satisfacer sus necesidades, usted puede escribir sus propios procesos mediante “Visual Studio Tools for Applications” (VSTA), o incluso diseñar sus propias tareas personalizadas que se pueden registrar y utilizar dentro de SSIS.

Las restricciones de precedencia permiten configurar flujos de trabajo más complicados donde el procesamiento se puede dirigir en base a si un componente tiene éxito, falla, o simplemente finaliza su ejecución. Además de la ruta estática basada en el estado de finalización de una tarea, puede también combinar expresiones para hacer rutas de flujo de trabajo condicional. Los controladores de eventos le permiten ejecutar flujos de trabajo completos en respuesta a los acontecimientos que ocurren a nivel de paquete o de tarea, como también ejecutar automáticamente un flujo de trabajo que mueve un archivo a un directorio cuando no se puede procesar, registrar los detalles del error y enviar un correo electrónico a un administrador.

www.detodoprogramacion.com

Page 34: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 1 Descripción general de Microsoft SQL Server 11

Las configuraciones de paquetes le permiten a los desarrolladores mostrar las propiedades internas que pueden ser modificadas para los diversos ambientes en los que un paquete será ejecutado. Al exponer propiedades en una configuración, los administradores tienen una forma sencilla de re-configurar un paquete, como en el caso de un cambio de los nombres de las bases de datos o directorios del servidor, sin necesidad de modificar el paquete.

Más allá de las tareas de flujo de trabajo, SSIS viene con amplia cantidad de componentes para el movimiento y manipulación de datos. Si bien es posible que usted pueda simplemente mover los datos de un lugar a otro dentro de una tarea de flujo de datos, también se pueden aplicar una amplia variedad de operaciones a los datos a medida que mueven a través del motor. Usted puede depurar datos no válidos, realizar cálculos extensos, y convertir los tipos de datos cuando los datos se mueven a través del flujo. Puede dividir los flujos de datos entrantes a múltiples destinos en base a una condición. La tarea de flujo de datos tiene la capacidad de realizar búsquedas (lookups) de datos contra las fuentes, ya sea para validar los datos entrantes, incluir información adicional o validar los datos que se envían a un destino. La aplicación de búsquedas difusas (fuzzy lookups) y agrupación difusa (fuzzy grouping) le permite usar las capacidades flexibles de "coincidencia" (matching) y agrupación más allá de los simples “caracteres comodín” (wildcards). También puede combinar varios flujos de datos entrantes y enviarlos a un solo destino. Así como múltiples flujos entrantes se pueden combinar, también se puede tomar un flujo de datos único y difundirlo a múltiples destinos. Dentro de una tarea de flujo de datos SSIS, también puede: reasignar caracteres (remap), conjuntos de datos “pivote/un-pivote”, calcular los agregados, ordenar datos, obtener datos de muestra y realizar minería de texto. Si SSIS no tiene un adaptador de datos capaz de manejar el formato de los datos origen o destino o no tiene una transformación adaptable a la lógica que necesita llevar a cabo, existe un componente de script que se incluye y que le permite obtener las capacidades completas de Visual Studio Tools para Aplicaciones para aplicar en sus datos.

Usted aprenderá acerca de las diversas capacidades de SSIS en el capítulo 24.

Integration Services en SQL Server 2008

Tan poderoso y amplio como SSIS fue en SQL Server 2005, SQL Server 2008 expande todas las capacidades de esta plataforma de integración de datos de clase mundial. Algunas de las nuevas características de SQL Server 2008 aparecen en la Tabla 1-5.

TABLA 1-5 Nuevas características de Integration Services

Descripción de las características

VTSA admite secuencias de comandos para que pueda utilizar Visual Basic.NET o C #. NET para crear scripts

El mecanismo de captura de datos modificados del motor de almacenamiento se integra directamente en SSIS para permitir a los paquetes extraer y manipular sólo los datos que han cambiado.

Nuevos tipos de datos fecha y hora te permiten aplicar precisión definida por el usuario, o desplazamientos de zona horaria

El componente de origen y destino ADO.NET le permite enviar/recibir desde cualquier proveedor ADO.NET compatible

Las transformaciones de búsqueda (Lookup transform) aprovechan las caches de datos para mejorar el rendimiento de las operaciones de búsqueda.

Se pueden generar archivos de volcado (dump) a partir de los paquetes

www.detodoprogramacion.com

Page 35: Microsoft SQL Server 2008 Español - Mike Hotek

12 Parte I Introducción a Microsoft SQL Server 2008

Reporting Services

Las organizaciones de todos los tamaños necesitan tener acceso a las grandes cantidades de datos almacenados en toda la empresa de una manera coherente y estandarizada. Aunque sería bueno esperar a que todos sepan cómo escribir consultas a fuentes de datos para obtener los datos necesarios o tener desarrolladores a disposición para escribir interfaces de usuario para los datos que la compañía necesita, la mayoría de las organizaciones no cuentan con los recursos disponibles. Por lo tanto, los usuarios finales necesitan herramientas que estén disponibles para que puedan crear informes estandarizados que estén disponibles en toda la organización, así como proporcionar la capacidad para que los usuarios finales creen informes sobre una base ad hoc.

SQL Server Reporting Services (SSRS) llena el vacío en la entrega de datos al proporcionar una plataforma flexible para el diseño de informes, así como la distribución de los datos en toda la organización. El departamento de TI puede rápidamente crear informes complejos que se implementan en uno o más portales y se pueden acceder según reglas de seguridad flexibles. El departamento de TI también puede diseñar y publicar modelos de reportes que permiten a los usuarios finales crear sus propios informes sin necesidad de entender las complejidades subyacentes en una base de datos. Los reportes construidos por el departamento de IT, así como los construidos por los usuarios finales, se pueden implementar en un portal centralizado de informes que permite a los miembros de la organización acceder a la información que necesitan para hacer sus trabajos.

Los usuarios pueden acceder a los informes, los cuales son generados ya sea sobre la marcha o a partir de datos almacenados en caché, que se actualizan en un horario. Los usuarios también pueden configurar las suscripciones de un informe que permiten a SSRS configurar una programación para ejecutar el informe (formateado para su especificación) y luego enviarlo a un usuario en su canal de distribución preferido. Por ejemplo, un gerente de ventas puede crear una suscripción a un informe de ventas diarias de tal manera que se genere el informe a la medianoche después que toda la actividad de venta se cerró, lo tenga en formato PDF, y le llegue en su buzón de correo electrónico para su revisión por la mañana.

SSRS viene con dos componentes principales, el Servidor de informes y el Diseñador de informes.

El servidor de informes es responsable de alojar todos los informes y la aplicación de la seguridad. Cuando los informes se solicitan, el servidor de informes se encarga de conectar a las fuentes de datos subyacentes, recopilar los datos y representar el informe en la salida final. La presentación (rendering)” de un informe se lleva a cabo ya sea a petición de un usuario o a través de una tarea programada que permita que el informe se ejecute durante las horas no pico.

Para que el servidor de informes tenga algo como para dar servicio a los usuarios, los reportes primero deben haber sido creados. El diseñador de informes es responsable de todas las actividades involucradas en la creación y depuración de informes. Los componentes incluidos le permiten a los usuarios crear una amplia gama de informes desde cuadros sencillos reportes de matriz, hasta informes con varios niveles de subinformes, reportes anidados, gráficos, informes vinculados, y enlaces a recursos externos. En sus informes, puede incrustar cálculos y funciones, tablas combinadas, e incluso variar el resultado del informe basado en el el usuario que accedió al reporte. El diseñador de informes es también responsable del diseño de modelos de reportes que proporcionan una potente capa semántica para ocultar las complejidades de una fuente de datos a los usuarios finales, para que puedan centrarse en la construcción de informes.

Usted aprenderá acerca de las diversas capacidades de SSRS en el Capítulo 25.

www.detodoprogramacion.com

Page 36: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 1 Descripción general de Microsoft SQL Server 13

Reporting Services en SQL Server 2008

Tan extensa como la plataforma de reportes en SQL Server 2005, SQL Server 2008 incluye muchas mejoras más importantes que le permiten desarrollar una gama más amplia de aplicaciones de informes utilizando componentes “listos para usar” (out-of-the-box). Algunas de las nuevas características de SSRS en SQL Server 2008 que usted aprenderá en el capítulo 25, se listan en la Tabla 1-6.

TABLA 1-6 Nuevas características de Reporting Services

Descripciones de las características

Los administradores pueden establecer umbrales de memoria en el servidor de informes

El servidor de informes ya no requiere IIS y de forma nativa puede alojar el entorno y aprovechar la biblioteca HTTP.SYS, al tiempo que permite el acceso URL a los informes y capacidades de gestión del servidor de reportes.

Con la eliminación de IIS en la configuración, el servidor de informes se ocupa de todas las solicitudes de autenticación

Los subinformes y las regiones de datos anidadas se pueden convertir a Excel.

Puede convertir los informes a formatos Windows Forms, Web Forms, CSV, PDF, imágenes, Excel, Word y XML

Los elementos de informe personalizados “Dundas”, son soportados por SSRS.

Las variables pueden ser declaradas como globales o con alcance a grupos específicos.

La tabla, la matriz, y las regiones de datos de lista, se han sustituido por una sola región Tablix con las capacidades de las tres.

Los gráficos han sido mejorados para ofrecer más tipos de gráficos y un mayor control sobre los elementos del gráfico.

Usted puede diseñar informes en el “Business Intelligence Development Studio” (BIDS) o con el nuevo Diseñador de informes independiente (stand-alone).

Una nueva región de datos “medibles” está disponible con una funcionalidad similar a los indicadores clave de rendimiento (KPIs) que se utilizan en SQL Server Analysis Services en los cubos.

Las capacidades de integración de SharePoint se amplían con la mejora de interfaces de programación.

Analysis Services

Como el volumen de datos dentro de una organización explota, los usuarios necesitan herramientas que les permitan tomar decisiones de negocios en base a un tiempo casi real. Los usuarios no pueden esperar a que el sector de TI diseñe informes para los cientos de preguntas que pueden ser formuladas por un único usuario. Al mismo tiempo, TI no tiene los recursos para proveer a los cientos de informes que son necesarios para que las personas administren un negocio.

SQL Server Analysis Services (SSAS) fue creado para llenar la brecha entre las necesidades de información de los usuarios de negocio y la capacidad de TI para proporcionar datos. SSAS engloba dos componentes: OLAP y Data Mining.

El motor OLAP le permite implementar, consultar y administrar cubos que han sido diseñados en el BIDS

“Business Intelligence Development Studio”. Puede incluir múltiples dimensiones, jerarquías múltiples dentro de una dimensión, y elegir una variedad de opciones tales como cuales atributos están disponibles para su visualización y cómo son ordenados los miembros. Usted puede diseñar medidas como elementos aditivos simples, así como emplear elementos complejos, y esquemas de agregaciones definidos por el usuario.

www.detodoprogramacion.com

Page 37: Microsoft SQL Server 2008 Español - Mike Hotek

14 Parte I Introducción a Microsoft SQL Server 2008

Mediante la adición de indicadores clave de rendimiento (KPI’s), puede proporcionar indicadores visuales para los usuarios finales, para que vean el estado de una entidad de negocio. Los cubos pueden contener perspectivas que definen un subconjunto de datos dentro de un único cubo, para simplificar así su visualización. La capa de meta datos incorporada le permite especificar traducciones de idioma en cualquier nivel dentro de un cubo, de modo que los usuarios puedan navegar por los datos en su idioma nativo.

El motor de minería de datos extiende el análisis de negocios, para permitirles a los usuarios encontrar patrones y hacer predicciones. Usando cualquiera de los varios algoritmos de minería que vienen con SQL Server 2008, las empresas pueden ver la tendencia de los datos a través del tiempo, determinar qué factores influyen en las decisiones de compra, o incluso reconfigurar una experiencia de compra basada en patrones de compra, para maximizar el potencial de una venta.

Usted aprenderá acerca de las diversas capacidades de SSAS en el Capítulo 26.

Analysis Services de SQL Server 2008

SQL Server 2008 ofrece importantes mejoras y nuevas capacidades para el motor de SSAS. Algunas de las nuevas características de SQL Server 2008 Analysis Services se enumeran en la Tabla 1-7.

TABLA 1-7 Nuevas características de Analysis Services

Descripciones de las características

Las extensiones de personalización le permiten añadir métricas a un cubo después de que se ha implementado, las cuales pueden ser compartidas con otros usuarios del cubo.

El diseñador de agregación ayuda a diseñar y navegar nuevas agregaciones.

El algoritmo de serie temporal de Microsoft puede ser configurado para utilizar ya sea el ARTxp por defecto o los nuevos Algoritmos ARIMA

Puede consultar los datos en caché en un modelo de minería de la misma manera que puede consultar los datos “case” en las versiones anteriores.

Puede realizar una validación cruzada de varios modelos de minería para determinar una mejor exactitud del modelo

Es posible dividir los datos entre pruebas permanentes y conjuntos de entrenamiento.

Capítulo 1 Referencia rápida

Si usted está interesado en

Instalación de SQL Server 2008

Diseño de bases de datos, tablas e índices

Recuperar o manipular datos

Diseñar procedimientos almacenados y otros objetos de código, Service Broker, o trabajar con texto completo

Configuración de la seguridad o la gestión del motor de base de datos

Tuning del rendimiento del Motor relacional

La alta disponibilidad

Business intelligence

Referencia a esta sección del libro

Parte 1

Parte 2

Parte 3

Parte 4

Parte 5

Parte 8

Parte 6

Parte 7

www.detodoprogramacion.com

Page 38: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2

Instalar y Configurar SQL Server 2008

Después de completar este capítulo, usted será capaz de ■

Elegir la edición correspondiente de Microsoft SQL Server 2008 para sus

necesidades de negocio.

Seleccionar el sistema operativo apropiado y el hardware para apoyar su instalación.

Configurar cuentas de servicio con el nivel apropiado de autoridad.

Configurar el modo en que los usuarios se autentican en una

instancia. Configurar el idioma por defecto.

Configurar los servicios de SQL Server.

Entender las opciones para actualizar SQL Server.

En el capítulo 1 de Microsoft SQL Server, "Visión general de Microsoft SQL Server," usted

aprendió acerca de los componentes que están disponibles en SQL Server 2008. En este capítulo,

usted aprenderá sobre las ediciones que están disponibles y los requisitos de hardware

correspondientes. Usted instalará todos los componentes que se incluyen con SQL Server 2008

de acuerdo con las mejores prácticas de configuración. Una vez instalado, usted aprenderá acerca

de los pasos que se deben tomar, posteriores a la instalación.

Nota: para completar los pasos de este capítulo necesitará autorización de administrador en el equipo donde SQL Server será instalado.

Ediciones de SQL Server 2008 SQL Server 2008 está disponible en una variedad de ediciones. Cada edición está diseñada para

satisfacer un conjunto de necesidades en función de las características requeridas para diversas

aplicaciones dentro de una organización. La Tabla 2-1 en la página 16 enumera las ediciones disponibles de SQL Server.

15

www.detodoprogramacion.com

Page 39: Microsoft SQL Server 2008 Español - Mike Hotek

16 Parte I Introducción a Microsoft SQL Server 2008

TABLA 2-1 Ediciones de SQL Server 2008

Características

Diseñadas para las organizaciones más grandes, para satisfacer la mayor parte de aplicaciones exigentes. SQL Server Developer y SQL Evaluation contienen todas las características de la versión SQL Server Enterprise, pero tienen restricciones sobre cómo se pueden implementar. La edición Developer se puede utilizar sólo para desarrollar aplicaciones de SQL Server y no se pueden usar para producción. La edición de evaluación tiene una duración limitada a 180 días y se puede utilizar para evaluar las capacidades de SQL Server, pero no se pueden utilizar en producción o para desarrollar aplicaciones.

Contiene la mayoría de las características de SQL Server que necesitan las pequeñas y medianas empresas.

Adecuado para uso departamental o pequeñas organizaciones que necesitan la funcionalidad básica de una plataforma de gestión de datos.

Libre y redistribuible con aplicaciones para proporcionar almacenamiento local de datos. También puede ser utilizado como una plataforma de almacenamiento de datos básicos basado en servidor.

Tiene todas las capacidades de la edición Express + capacidades limitadas de Reporting Services junto con una versión Express de Management Studio.

Libre, con Base de datos redistribuible integrada, construida principalmente para aplicaciones autónomas (stand-alone).

SQL Server Edition

Enterprise, Developer, Evaluation

Estándar

Grupo de trabajo

Express

Express con Servicios avanzados

Compacta

Nota Dado que las ediciones Developer y Evaluation de SQL Server contienen el mismo soporte que las funciones de la edición Enterprise, a menos que se indique específicamente, cualquier discusión en este libro que hace referencia a la edición Enterprise también aplican para las ediciones Developer y Evaluación.

Debido a que cada edición está dirigida a clases específicas de aplicaciones, así como las necesidades de organizaciones de distintos tamaños, la principal diferencia entre las ediciones de SQL Server es el conjunto de características y funcionalidades que soportan.

Por ejemplo, la edición Enterprise es la única edición que soporta la minería de datos, el particionamiento, las instantáneas de bases de datos, las operaciones de mantenimiento en línea o en paralelo, la compresión, el regulador de recursos, replicación peer-to-peer, respaldo “en caliente” para agregar hardware, CPUs ilimitada, y hasta 16 nodos para el clúster de conmutación por error (failover). La edición Express contiene soporte para SQL Server Integration Services, SQL Server Analysis Services, más de una CPU, bases de datos superiores a 4 GB, y más de 1 GB de RAM sólo para nombrar algunas características.

Nota Los detalles completos de la compatibilidad de características / funcionalidad de cada edición de SQL Server pueden encontrarse en el sitio Web de Microsoft en http://www.microsoft.com/sql.

www.detodoprogramacion.com

Page 40: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2 Instalación y configuración de SQL Server 2008 17

Requisitos de infraestructura

SQL Server 2008 es compatible con varias versiones de Windows junto con arquitecturas de procesador Intel y AMD.

La edición Developer y Evaluation de SQL Server son soportadas por las siguientes versiones de windows:

 

 

 

 

Windows Vista Home Basic o superior

Windows 2008 Server Standard Edition o superior

Windows Server 2003 Standard Edition SP2 o superior

Windows XP Professional SP2 o superior

SQL Server 2008 Enterprise Edition sólo es soportado por las siguientes versiones de Windows:

 

 

Windows 2008 Server Standard Edition o superior

Windows Server 2003 Standard Edition SP2 o superior

Nota La versión de 32 bits de SQL Server 2008 se puede instalar tanto en versiones de 32-bits como de 64-bits de los sistemas operativos soportados. La versión de 64-bit sólo se puede instalar en las versiones de 64-bit de Windows.

Además de instalar un sistema operativo compatible, usted tendrá que asegurarse de que el Framework . NET 2.0 ha sido instalado. SQL Server 2008 también requiere 1,6 GB de espacio libre en disco.

Cuentas de servicio

Todos los componentes Core de SQL Server se ejecutan como servicios. Para configurar correctamente cada componente, tendrá que crear varias cuentas de servicio antes de la instalación. Usted necesitará cuentas de servicio dedicadas para los siguientes componentes:

 

 

 

 

 

 

Motor de base de datos

SQL Server Agent

Búsqueda de texto completo

Integration Services

Reporting Services

Analysis Services

En su primer ejercicio, creará cuentas de servicio que se utilizarán durante el proceso de instalación.

www.detodoprogramacion.com

Page 41: Microsoft SQL Server 2008 Español - Mike Hotek

18 Parte I Introducción a Microsoft SQL Server 2008

Crear cuentas de servicio

1. Haga clic en Inicio, haga clic en Mi PC y seleccione Administrar.

2. Expanda Usuarios y grupos locales y seleccione Usuarios.

3. Haga clic en el panel de la derecha, y seleccione Nuevo usuario.

4. Especificar SQL2008SBSDE en el campo Nombre de usuario, proporcionar una contraseña segura, desactive “El usuario debe cambiar la contraseña en el siguiente inicio de sesión” y seleccione “La contraseña nunca caduca”.

5. Repita los pasos 3 y 4 para crear las cuentas de servicio que figuran en la Tabla 2-2.

TABLA 2-2 Cuentas de servicio

Componente

Database Engine

SQL Server Agent

Integration Services

Búsqueda de texto completo

Reporting Services

Analysis Services

Nombre de la cuenta

SQL2008SBSDE

SQL2008SBSSQLAgent

SQL2008SBSIS

SQL2008SBSFullText

SQL2008SBSRS

SQL2008SBSAS

Cuando se haya completado, la pantalla debe ser similar a esta:

www.detodoprogramacion.com

Page 42: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2 Instalación y configuración de SQL Server 2008 19

Nota Utilizaré Windows XP Professional SP2 para todos los ejercicios de este libro. Usted tendrá que realizar los ajustes adecuados para la versión de Windows que esté utilizando. Además, si su máquina es un miembro de un dominio, sus cuentas de servicios deben ser cuentas de dominio, en lugar de cuentas locales, al instalar SQL Server 2008 en un entorno operativo.

Secuencias de intercalación (collation)

Las secuencias de intercalación controlan la forma en que SQL Server trata los datos de caracteres para el almacenamiento, la recuperación, la clasificación y las operaciones de comparación. SQL Server 2008 le permite especificar una secuencia de intercalación para soportar cualquier idioma utilizado actualmente en todo el mundo.

Las secuencias de intercalación se pueden especificar a nivel instancia, base de datos, tabla y columna. La única secuencia de intercalación obligatoria se define a nivel de instancia, que por defecto aplica a todos los demás niveles a menos que sea específicamente desbloqueada.

Una secuencia de intercalación define el conjunto de caracteres que se soportan junto con mayúsculas y minúsculas, distinción de acentos, y la sensibilidad kana (silabarios japoneses). Por ejemplo, si utiliza la secuencia de intercalación de SQL_Latin1_General_CP1_CI_AI, obtendrá soporte para un conjunto de caracteres de Europa occidental que es insensible a mayúsculas, minúsculas y acento. SQL_Latin1_General_CP1_CI_AI tratará los caracteres e, E, è, é, ê, y ë, como el mismo carácter para la clasificación y operaciones de comparación, mientras que una secuencia de intercalación francesa con “sensibilidad a mayúsculas” (case-sensitive) (CS) y acentos sensible (AS), tratará cada uno como un carácter diferente.

Modos de autenticación

Una de las opciones de configuración de instancia que deberá establecer durante la instalación es el modo de autenticación que SQL Server utilizará para controlar los tipos de conexiones permitidas. El modo de autenticación de SQL Server se puede configurar como:

 

 

Sólo para Windows (seguridad integrada)

Windows y SQL Server (modo mixto)

Cuando SQL Server está configurado con autenticación de Windows, sólo podrá utilizar las cuentas de Windows para acceder a la instancia de SQL Server. Cuando SQL Server se configura en modo mixto, puede utilizar cualquiera de las cuentas de Windows o cuentas de SQL Server creadas para ingresar a la instancia de SQL Server.

Nota El capítulo 18, "Seguridad", trata sobre los inicios de sesión en más detalle.

www.detodoprogramacion.com

Page 43: Microsoft SQL Server 2008 Español - Mike Hotek

20 Parte I Introducción a Microsoft SQL Server 2008

Instancias SQL Server

La instancia define el contenedor para todas las operaciones que se realizarán en SQL Server. Cada instancia tiene su propio conjunto de bases de datos, credenciales de seguridad, ajustes de configuración, servicios de Windows, y otros objetos de SQL Server.

SQL Server 2008 admite la instalación de hasta 50 instancias de SQL Server en una sola máquina. Usted puede instalar una instancia como la predeterminada junto con hasta 49 instancias con nombre adicionales o puede instalar 50 instancias con nombre (o sea que se tiene que escribir el nombre explícito de cada instancia cuando se hace referencia a cada una de ellas).

Cuando se conecta a una instancia predeterminada de SQL Server, se utiliza el nombre de la máquina en la que la instancia está instalada. Al conectarse a una instancia con nombre, se utiliza la combinación del nombre del equipo y el nombre de la instancia (por ejemplo <machinename> \ <instancename>).

Las razones principales para la instalación de más de una instancia de SQL Server en un solo equipo son:

 

 

 

Necesita instancias para pruebas de control de calidad o desarrollo.

Necesita soportar paquetes de servicios múltiples o niveles de parches.

Hay diferentes grupos de administradores a los que sólo se les permite acceder a un subconjunto de bases de datos dentro de la organización.

Debe soportar múltiples conjuntos de opciones de configuración de SQL Server.  

Nota Sólo la edición Enterprise de SQL Server 2008 admite la instalación de múltiples instancias en un solo equipo.

Actualización a SQL Server 2008

Puede actualizar desde SQL Server 2000 o SQL Server 2005 a SQL Server 2008 utilizando ya sea una actualización "en el lugar” (in-place) o bien “en paralelo” (side-by-side).

Consejo Antes de actualizar, ejecute el Asesor de actualizaciones, disponible en http://www.microsoft.com/sql, contra su instancia de servidor SQL Server 2000 y 2005 y el código base, para determinar posibles incompatibilidades.

Actualización “en el lugar“ (in-place)

Una actualización “in-place” permite instalar SQL Server 2008 encima de una instancia ya existente de SQL Server 2000 o 2005. SQL Server realizará las siguientes acciones durante una actualización “in-place”:

 

 

Instala los binarios de SQL Server 2008

Actualiza las bases de datos de SQL Server 2000 o 2005.

www.detodoprogramacion.com

Page 44: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2 Instalación y configuración de SQL Server 2008

 

 

21

Quita los binarios de SQL Server 2000 o 2005, los servicios y las entradas del registro.

Inicia la instancia de SQL Server 2008

Al finalizar una actualización “in-place”, la instancia SQL Server 2000 o 2005 será reemplazada por la instancia SQL Server 2008. Sus bases de datos, la configuración de seguridad y las opciones de configuración se migrarán a la nueva instancia de servidor de SQL Server 2008. La anterior instancia de SQL Server 2000 o 2005 dejará de existir en la máquina.

Actualización “en paralelo” (Side-by-Side)

Una actualización “side-by-side” le permite instalar una instancia de SQL Server 2008 sin afectar la instancia existente de SQL Server 2000 o 2005. Una vez instalada, usted tendrá que mover todas las bases de datos, los objetos y las configuraciones de SQL Server 2000 o 2005 a la instancia de SQL Server 2008.

Nota Revise los documentos técnicos de actualización en http://www.microsoft.com/sql, así como la documentación que se incluye con el Asesor de actualizaciones de SQL Server, para obtener información detallada sobre la actualización de SQL Server 2000 y

Si bien una actualización “side-by-side” implica muchos más pasos que tienen que llevarse a cabo manualmente, tiene la ventaja de dejar la instancia intacta de SQL Server 2000 o 2005. Además le permite mover bases de datos de SQL Server 2008 de una manera organizada “por etapas”.

Nota No es posible actualizar las “bases de datos del sistema” utilizando el método de actualización side-by-side. Aprenderá acerca de las “bases de datos del sistema” en el Capítulo 4, "Creación de bases de datos."

Métodos de la actualización

Cuando se realiza una actualización side-by-side, usted tiene tres métodos diferentes para elegir:

1. Copia de seguridad y restauración

2. Separar y adjuntar (Detach and attach)

3. Asistente para copiar objetos

Cuando se actualiza utilizando el método “copia de seguridad y restauración”, usted tomará una copia de seguridad de su base de datos de SQL Server 2000 o 2005 y la restaurará en SQL Server 2008.

Nota Usted aprenderá sobre “copia de seguridad y restaurar bases de datos” en el Capítulo 20, "Recuperación de datos".

www.detodoprogramacion.com

Page 45: Microsoft SQL Server 2008 Español - Mike Hotek

22 Parte I Introducción a Microsoft SQL Server 2008

Cuando se actualiza utilizando el método de “separar y adjuntar”, separará las bases de datos de SQL Server 2000 o 2005, copiará los archivos de base de datos a una nueva ubicación, y adjuntará la base de datos a la instancia de SQL Server 2008.

Nota Usted aprenderá acerca de “separar y adjuntar bases de datos” en el capítulo 4, "Creación de bases de datos. "

Al Asistente para copiar objetos, que es una tarea disponible dentro de SQL Server Integration Services (SSIS), se puede acceder en una variedad de maneras. El Asistente para copiar objetos permite especificar los objetos de la base de datos junto con la configuración de migración que se utiliza.

Consejo Si necesita actualizar sólo una porción de base de datos SQL Server 2000 o 2005, el Asistente de copia de Objetos proporciona un directorio (path) para mover sólo el conjunto de objetos que se desea actualizar. Si está actualizando la base de datos entera SQL Server 2000 o 2005, el Asistente para copiar objetos proporciona un método menos eficaz de actualización.

Instalación de SQL Server 2008

Ahora que hemos cubierto la formación básica para las instancias de SQL Server, instalará su primera instancia del motor SQL Server, junto con Analysis Services, Reporting Services, Integration Services y todas las herramientas que se incluyen con SQL Server.

Instalación de SQL Server 2008

Consejo Reinicie el equipo antes de iniciar el proceso de instalación de SQL Server paraasegurarse de que usted no tiene ninguna solicitud de reinicio pendiente que bloquee el proceso de instalación de SQL Server.

1. Inicie la rutina de instalación de SQL Server.

2. Si aún no ha instalado el Framework . NET 3.5, la primera rutina de instalación iniciará la instalación del Framework . NET 3.5, como se muestra aquí.

3. Una vez que el Framework NET 3.5 ha sido instalado, se lanzará la pantalla “Términos de licencia”. Seleccione “He leído y acepto las condiciones del Contrato de licencia” y haga clic en Siguiente.

4. Cuando aparezca la pantalla Requisitos previos de Instalación, haga clic en Instalar.

www.detodoprogramacion.com

Page 46: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2 Instalación y configuración de SQL Server 2008 23

5. Una vez que se han instalado los requisitos previos, verá la pantalla principal de instalación, quese muestra aquí.

www.detodoprogramacion.com

Page 47: Microsoft SQL Server 2008 Español - Mike Hotek

24 Parte I Introducción a Microsoft SQL Server 2008

6. Haga clic en el link “Nueva instalación stand-alone de SQL Server” para iniciar la instalación deSQL Server.

7. La instalación ejecutará una comprobación de la configuración del sistema. Una vez que la verificación se complete con éxito, la pantalla que se muestra deberá ser similar a la siguiente:

Nota Si alguno de los controles de configuración del sistema no funciona, tendrá que tomar las medidas apropiadas a la falla, con el fin de continuar con el proceso de instalación.

8. Una vez que haya revisado las reglas de soporte de instalación, haga clic en Aceptar.

9. Seleccione todas las características de SQL Server que mostramos en la siguiente imagen y haga clic en Siguiente.

10. Seleccione la opción “Instancia predeterminada” y haga clic en Siguiente.

11. Compruebe los requisitos de espacio en disco y haga clic en Siguiente.

www.detodoprogramacion.com

Page 48: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2 Instalación y configuración de SQL Server 2008 25

12. Ingrese para cada servicio correspondiente, las cuentas de servicio que creó anteriormente (en este capítulo). Cuando esto se haya completado, la pantalla debe ser similar a la siguiente:

www.detodoprogramacion.com

Page 49: Microsoft SQL Server 2008 Español - Mike Hotek

26 Parte I Introducción a Microsoft SQL Server 2008

13. Haga clic en la ficha Intercalación (Collation) para revisar el conjunto de secuencia de intercalación para el motor de base de datos y Analysis Services. Realice los ajustes que considere necesarios de acuerdo con el idioma soportado que usted necesita y haga clic en Siguiente.

14. Especifique el modo mixto y establezca una contraseña. Haga clic en el botón Agregar “current-user” para agregar la Cuenta de Windows que está ejecutando la instalación, como administrador dentro SQL Server. Haga clic en el botón Agregar para agregar otras cuentas de Windows que desea como administradores dentro de SQL Server. Cuando se haya completado, la pantalla debe ser similar a la siguiente:

Nota La contraseña que especifique será asignada al usuario “sa” que ya viene incorporado al servidor SQL.

Importante Se recomienda que ejecute instancias de SQL Server en modo de autenticación de Windows en lugar de modo mixto. La razón por la que estamos especificando Modo mixto durante la instalación de ejemplo, es demostrar los inicios de sesión de SQL Server en el Capítulo 19, "Administración basada en directivas".

15. Haga clic en la ficha Directorios de Datos para revisar las configuraciones.

www.detodoprogramacion.com

Page 50: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2 Instalación y configuración de SQL Server 2008 27

Nota Usted aprenderá acerca de “directorios de datos y log” en el Capítulo 4, "Creación de bases de datos."

16. Haga clic en la pestaña FILESTREAM, seleccione “Habilitar FILESTREAM para acceso Transact-SQL”, así como “Habilitar FILESTREAM para el acceso al flujo de archivos E/S”. Deje el conjunto de nombres de recurso compartido de Windows como el default “MSSQLSERVER “ y haga clic en Siguiente.

Nota Usted aprenderá sobre el tipo de datos FILESTREAM en el capítulo 5, "Diseño de tablas".

17. Haga clic en “Agregar usuario actual” (current-user) para agregar la cuenta que está ejecutando la instalación como un administrador dentro de Analysis Services. Añada cualquier otra cuenta de Windows que desee para tener acceso de administrador en Analysis Services. Revise la información de la ficha “Directorios de Datos” y haga clic en Siguiente.

18. Seleccione la opción “Instalar la configuración predeterminada del modo nativo” en la página “Configuración de Reporting Services” y haga clic en Siguiente.

19. Seleccione las opciones que desee en la “Página de reporte de uso y error” y haga clic en Siguiente.

20. Revise la información de la página “Listo para instalar” y haga clic en Instalar.

21. SQL Server iniciará la rutina de instalación para las diferentes opciones que especificó y mostrará el reporte de progreso. Durante la fase de instalación, la pantalla tendrá un aspecto similar al siguiente gráfico:

www.detodoprogramacion.com

Page 51: Microsoft SQL Server 2008 Español - Mike Hotek

28 Parte I Introducción a Microsoft SQL Server 2008

Instalar bases de datos de ejemplo

SQL Server 2008 no viene con ninguna base de datos de ejemplo. Usted tendrá que descargar las bases de datos AdventureWorks2008 y AdventureWorksDW2008 desde el sitio web de CodePlex.

1. Abra Internet Explorer y vaya a http://www.codeplex.com/MSFTDBProdSamples . Haga clic en

la ficha “Versiones”.

Nota Las ubicaciones de los sitios web son exactas a la redacción de este libro. Sin embargo, los lugares pueden cambiar en el futuro. Si usted no puede encontrar la dirección de arriba, utilice el cuadro de búsqueda dentro del sitio web de CodePlex para encontrar la nueva ubicación.

2. Desplácese hasta la parte inferior de la página y descargue en el equipo local los archivos AdventureWorks2008*.msi y AdventureWorksDW2008 *.msi.

Importante El sitio web de CodePlex contiene rutinas de instalación para plataformas 32 bits, x64 y IA64 Descargue el archivo “.msi” que sea apropiado para su sistema operativo.

3. Ejecute las rutinas de instalación, para ambas descargas y use la ubicación de extracción predeterminada.

4. Haga clic en Inicio | Todos los programas | Microsoft SQL Server 2008 | SQL Server Management Studio. 5. Si no ha entrado, especifique el nombre de la máquina donde ha instalado la instancia de SQL Server en el ejercicio anterior y haga clic en Conectar. Su pantalla debería ser similar al siguiente:

www.detodoprogramacion.com

Page 52: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 2 Instalación y configuración de SQL Server 2008 29

6. Haga clic en el botón “Nueva consulta”, escriba el código siguiente y haga clic en el botón Ejecutar.

EXEC sp_configure 'filestream_access_level', 2; GO

RESTORE DATABASE AdventureWorks FROM DISK = 'C: \ Archivos de programa \ Microsoft SQL Server \ 100 \ Tools \ Samples \ AdventureWorks2008.bak 'WITH RECOVERY; GO

RESTORE DATABASE AdventureWorksDW FROM DISK='C:\Program Files\ Microsoft SQL Server\100\Tools\Samples\AdventureWorksDW2008.bak' WITH RECOVERY;

GO

7. Cuando expanda el nodo de base de datos, la pantalla debe ser similar a la siguiente:

Capítulo 2 Referencia rápida

Para

Crear cuentas de servicio

Realizar una actualización del tipo side-by-side.

Haga esto

Utilice la consola de administración de equipos (Computer Management) o la consola de Activación Usuarios y Computadoras.

Instale una instancia de SQL Server y luego o bien aplique el método de “copias de seguridad y restaurar” o bien el de “detach and attach” usando las bases de datos existentes en el servidor SQL 2000 o 2005. Si necesita actualizar selectivamente objetos dentro de una base de datos, utilice el Asistente para copiar objetos.

www.detodoprogramacion.com

Page 53: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3

Uso de las herramientas de SQL Server 2008

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

Seleccionar la herramienta del Servidor SQL 2008 adecuada para una tarea determinada

Administrar servicios de SQL Server 2008

Iniciar, navegar y utilizar SQL Server Management Studio

Utilizar varios accesos directos para una mejor productividad

Configurar el Correo electrónico de base de datos

SQL Server 2008 incluye ocho herramientas independientes que se utilizan para configurar, administrar y supervisar Servicios de SQL Server. Dentro de este grupo de ocho herramientas básicas, también se puedendiseñar objetos de SQL Server y ejecutar código. La herramienta de mayor alcance, SQL Server Management Studio (SSMS), contiene cuatro herramientas adicionales diseñadas para la gestión y el seguimiento.

Nota Puede instalar las instancias de SQL Server Integration Services, Reporting Services, Analysis Services, y el motor de base de datos. Para simplificar la terminología, simplemente nos referiremos a una instancia de motor de base de datos como una “instancia de SQL Server”. Todos los otros casos serán referidos como una instancia SSIS, SSAS o SSRS.

Documentación SQL Server

SQL Server 2008 incluye unos Libros en pantalla muy completos. Mientras que muchos no tienen en cuenta la documentación como una "herramienta", la frase "la información es poder" de inmediato nos viene a la mente. Hay una razón por la que se oye a alguien decir: "Lea el manual". Inmerecidamente, los “Libros Online” han recibido una muy mala reputación.

Los “Libros en pantalla” deberían ser su principal fuente de información acerca de SQL Server 2008, después de este libro, por supuesto. Los Libros en pantalla contienen explicaciones detalladas de cada función dentro de SQL Server, la sintaxis de cada comando, y miles de ejemplos de código que puede aplicar. Además, los Libros en pantalla de SQL Server integran una amplia gama de contenido en línea en la documentación local, con el fin de proporcionar una amplia información, constantemente actualizada que se puede aplicar dentro de su entorno. Si bien no vamos a gastar una significativa cantidad de tiempo pasando por los Libros en pantalla, vamos a explicar un par de características muy útiles y que a menudo se pasan por alto.

31

www.detodoprogramacion.com

Page 54: Microsoft SQL Server 2008 Español - Mike Hotek

32 Parte I Introducción a Microsoft SQL Server 2008

Escondido en los Libros en pantalla, debajo del botón ¿Cómo puedo vincular?, se esconde un conjunto de varias docenas de tutoriales que le guiarán a través de importantes conjuntos de características tales como

gestión basada en políticas, tipos de datos hierarchyID, diseño de cubos OLAP, implementación de Modelos de minería de datos, implementación de replicación y la construcción de paquetes SSIS o informes de SSRS, como se muestra en la Figura 3-1.

FIGURA 3-1 SQL Server 2008 tutoriales

También puede ver un grupo de tres enlaces en el extremo derecho de la barra de herramientas en la Figura 3-1. El primero de estos tres enlaces, “Haz una pregunta”, abrirá una ventana del explorador en el panel de la derecha y lo llevará al foro de “Microsoft Developer Network (MSDN)”. El foro MSDN le permite hacer cualquier pregunta acerca de SQL Server para la que no pueda identificar una respuesta o solución. Las preguntas son respondidas por voluntarios que incluyen miles de profesionales de SQL Server de todo el mundo, así como cientos de miembros del equipo de desarrollo de SQL Server.

El penúltimo enlace lo llevará otra vez a los foros de MSDN, pero se aplicará automáticamente un filtro para mostrar sólo aquellas preguntas que están involucradas, donde se puede hacer un fácil seguimiento del estado de sus preguntas.

El último enlace abrirá una ventana del explorador en el panel de la derecha y lo llevará a Microsoft Connect donde se pueden enviar comentarios sobre SQL Server o una característica particular así como publicar informes de error.

www.detodoprogramacion.com

Page 55: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3 Uso de las herramientas de SQL Server 2008 33

Los informes de error enviados se revisan constantemente por el equipo de desarrollo de SQL Server para que de manera proactiva puedan proporcionar parches para la funcionalidad. La información del producto juega un papel importante en la planificación de la próxima versión de SQL Server.

Puede marcar los temas a los que hace referencia a menudo usando la función Favoritos de Ayuda. La función de Favoritos de Ayuda le permite guardar búsquedas frecuentemente ejecutadas, para su posterior reutilización.

Nota Dado que los libros Online de SQL Server contienen características para integrar la versión local de la ayuda con varios sitios Web, puede experimentar algunos problemas de rendimiento. Para mitigar cualquier problema de rendimiento, debería configurar como consulta default a los Libros en pantalla de la ayuda local antes de intentar consultar los recursos en línea.

En este procedimiento, configurará los Libros en pantalla para obtener un rendimiento óptimo.

Configurar los Libros en pantalla

1. Inicie los Libros en pantalla, seleccionando: Inicio | Todos los programas | Microsoft SQL Server 2008 | Documentación y tutoriales | SQL Server Books Online.

2. Seleccione Herramientas | Opciones.

3. Seleccione Online y configure como se muestra aquí.

www.detodoprogramacion.com

Page 56: Microsoft SQL Server 2008 Español - Mike Hotek

34 Parte I Introducción a Microsoft SQL Server 2008

Herramientas de administración de SQL Server 2008

SQL Server 2008 incluye un conjunto de nueve herramientas para administrar instancias de SQL Server e interactuar con los datos: OSQL, SQLCMD, Tablediff, Bulk Copy Program (BCP), SQLDiag, Regulador de recursos (Resource Governor), SQL Server Configuration Manager, SSMS, y Correo electrónico de base de datos.

OSQL es una utilidad de línea de comandos que se añadió a SQL Server 2000 como un reemplazo para ISQL. OSQL le permite conectarse y ejecutar consultas en una instancia de SQL Server sin requerir la sobrecarga de una interfaz gráfica.

Importante OSQL ha quedado en desuso a partir de SQL Server 2005. Mientras OSQL está aun disponible en SQL Server 2008, usted debería volver a escribir las rutinas de OSQL para utilizar SQLCMD.

SQL Server 2005 introdujo SQLCMD como la interfaz de línea de comando de consulta que reemplazó OSQL. Mientras OSQL permite enviar consultas interactivas desde una línea de comandos junto con capacidades de automatización muy limitados, SQLCMD proporciona una interfaz de automatización rica y completa con sustitución de variables y creación de código dinámico/ejecución.

Nota Una discusión de las características específicas de SQLCMD está más allá del alcance de este libro. Para más detalles acerca SQLCMD, vea el tema de libros en línea "utilidad sqlcmd."

Puede utilizar Tablediff.exe para comparar los datos entre dos tablas. Tablediff se puede ejecutar para que le avise si los datos o la estructura de dos tablas es diferente. Además, puede generar un archivo script que contiene las instrucciones necesarias para que la tabla de destino sincronice con la tabla de origen. Tablediff se utiliza principalmente dentro de las arquitecturas de replicación.

La utilidad BCP es la utilidad más antigua dentro del producto de SQL Server, que data desde la primera versión de SQL Server. BCP se ha mejorado con cada versión sucesiva, para manejar nuevos tipos de datos e instancias con nombre, pero la velocidad y la funcionalidad no ha cambiado. BCP se utiliza para exportar datos de una tabla a un archivo, así como importar datos de un archivo a una tabla. Si sus necesidades de importación y exportación son razonablemente simples y directas, BCP debe ser la única utilidad que usted necesita. Para obtener capacidades más avanzadas de importación y exportación, debe utilizar SQL Server Integration Services (SSIS).

Nota Usted aprenderá acerca de BCP y su primo de importación, BULK INSERT en el Capítulo 10, "Manipulación de Datos”. Usted aprenderá acerca de SSIS en el Capítulo 24," Business Intelligence ".

SQLDiag es una utilidad que recopila información de diagnóstico acerca de una instancia de SQL Server. SQLDiag está diseñado para capturar los contadores de rendimiento de Windows, registros de eventos, rastros del analizador de SQL Server (SQL Server Profiler traces), bloqueos de SQL Server y la información de configuración de SQL Server. Se utiliza principalmente como un motor de recopilación de datos para Microsoft Customer Service and Support (CSS) para resolver temas (issues), los datos recolectados pueden ser usados por un DBA para analizar temas de rendimiento y estabilidad.

www.detodoprogramacion.com

Page 57: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3 Uso de las herramientas de SQL Server 2008 35

Nota Los detalles de SQLDiag están más allá del alcance de este libro. Por favor, consulte el artículo "SQLdiag Utility" de los Libros Online, para más información.

El “regulador de recursos” (Resource Governor) es una característica nueva en SQL Server 2005 que se encuentra dentro de SSMS. El propósito del regulador de recursos es permitir que un DBA configure las reglas relacionadas a la asignación de recursos, tales como procesador o memoria aplicada a las consultas específicas, usuarios o grupos de usuarios. El objetivo del regulador de recursos es permitir que las cargas de trabajo de alta prioridad tengan prioridad sobre otras cargas de trabajo, con el fin de proporcionar la mejor respuesta en base a las expectativas del usuario.

Nota Usted aprenderá sobre el regulador de recursos en el artículo, "Herramientas de Rendimiento y captura de datos", que se pueden encontrar en el sitio web “Prensa online de Microsoft Windows Server y Cliente” en www.microsoft.com/learning/books/online/ServerClient.

SQL Server Configuration Manager

Mostrado en la Figura 3-2 de la página 36, SQL Server Configuration Manager es responsable de manejar servicios y protocolos de SQL Server. Las principales tareas que realizará con SQL Server Configuration Manager son las siguientes:

 

 

 

 

Iniciar / Detener / Pausar / Reiniciar un servicio

Cambiar las cuentas de servicio y contraseñas

Gestionar el modo de inicio de un servicio

Configurar parámetros de inicio del servicio

Una vez que haya completado la instalación y configuración inicial de sus servicios SQL Server, la acción principal que se llevará a cabo con el Administrador de configuración de SQL Server es cambiar periódicamente las contraseñas de cuenta de servicio. Cuando se cambian las contraseñas de las cuentas de servicio, no es necesario reiniciar la instancia de SQL Server para que la nueva credencial de configuración tenga efecto.

Importante: los subprogramas (applets) de control de servicios de Windows también tienen entradas para servicios de SQLServer y le permiten cambiar las cuentas de servicio y las contraseñas. Nunca debería cambiar las cuentas de servicio o contraseñas de cuentas de servicio usando “Windows Service Control Applet”. Debe ser usado el SQL Server Configuration Manager, porque éste incluye el código para regenerar la clave maestra de servicio que es crítica para el funcionamiento de los servicios de SQL Server.

www.detodoprogramacion.com

Page 58: Microsoft SQL Server 2008 Español - Mike Hotek

36 Parte I Introducción a Microsoft SQL Server 2008

FIGURA 3-2 Lista de servicios en el Administrador de configuración de SQL Server

Si bien se pueden iniciar, detener, pausar y reiniciar los servicios de SQL Server, SQL Server tiene una amplia cantidad de funciones de administración que le garantizan que rara vez, o nunca, sea necesario apagar o reiniciar el servicio de SQL Server.

En este procedimiento, revisará las opciones y configuraciones disponibles para los servicios SQL Server.

Revisión de las opciones del servicio

1. Inicie SQL Server Configuration Manager, seleccione Inicio | Todos los programas | Microsoft SQL Server 2008 | Herramientas de configuración | SQL Server Configuration Manager.

2. En el panel izquierdo, seleccione Servicios de SQL Server.

3. Haga doble clic en el servicio de SQL Server que está en el panel de la derecha, para visualizar el cuadro de diálogo “Propiedades” que se muestra en la página 37.

4. Revise las opciones de cada una de las fichas.

5. Haga clic en Cancelar para cerrar el cuadro de diálogo Propiedades sin realizar ningún cambio.

www.detodoprogramacion.com

Page 59: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3 Uso de las herramientas de SQL Server 2008 37

SQL Server Configuration Manager también le permite configurar los protocolos de comunicaciones disponibles para conexiones cliente. Además de la configuración de los argumentos específicos del protocolo, también puede controlar si las comunicaciones deben ser encriptadas o si una instancia responderá a una solicitud de enumeración, como se muestra en la Figura 3-3.

FIGURA 3-3 Propiedades de Protocolo

www.detodoprogramacion.com

Page 60: Microsoft SQL Server 2008 Español - Mike Hotek

38 Parte I Introducción a Microsoft SQL Server 2008

Consejo: Las aplicaciones pueden transmitir un comando especial, denominado “solicitud de enumeración”, a través de una red para localizar los servidores SQL Server que se ejecutan en la red. Además de poder enumerar los servidores SQL es valioso en entornos de desarrollo y testing, en los casos donde pueden aparecer, desaparecer y ser reconstruida de forma relativamente frecuente, la enumeración no es deseable en un entorno de producción. Al desactivar las respuestas de enumeración mediante el establecimiento de la opción “Ocultar Instancia” en Sí, se evita que alguien utilice las técnicas de detección para localizar servidores SQL Server para un posible ataque.

SQL Server Management Studio

SQL Server Management Studio es la herramienta principal que va a usar la mayor parte del tiempo. SSMS proporciona todas las capacidades de gestión de servicios de SQL Server junto con la capacidad para crear y ejecutar Transact-SQL (TSQL), expresiones multidimensionales del lenguaje (MDX), extensiones de minería de datos (DMX) y código XML for Analysis (XMLA). En esta sección se presenta una breve reseña de SSMS, como se muestra en la Figura 3-4, cada capítulo posterior en este libro extenderá su conocimiento sobre las capacidades de SSMS.

FIGURA 3-4 SQL Server Management Studio

En la siguiente práctica, se pondrá en marcha SSMS y se conectará a la instancia del motor de base de datos

que instaló en el Capítulo 2, "Instalación y configuración de SQL Server 2008".

www.detodoprogramacion.com

Page 61: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3 Uso de las herramientas de SQL Server 2008 39

Iniciar SSMS y conectarse a una instancia

1. Inicie SSMS seleccionando Inicio | Todos los programas | Microsoft SQL Server 2008 | SQL Server Management Studio.

2. Cuando se muestre el cuadro de diálogo “Conectar al servidor”, acepte las opciones predeterminadas y haga clic en Conectar.

Nota Debido a que sólo ha instalado una instancia predeterminada en este momento, este cuadro de diálogo debería mostrar ”Motor de base de datos” para el tipo de servidor, <machinename> para el nombre del servidor y “Autenticación Windows” para la opción de autenticación. Ahora que se ha conectado a una instancia dentro SSMS, para todos los ejercicios restantes de este libro, vamos a suponer que usted puede realizar estos pasos y no repetirlos.

SSMS tiene una variedad de ventanas que puede abrir y colocar dentro de la interfaz con el fin de acceder a diversos conjuntos de características.

La ventana “Servidores registrados” proporciona un lugar para almacenar la información de conexión para todos los servicios de SQL Server en su entorno. Una vez almacenado, puede hacer clic derecho en cualquier servidor e iniciar una conexión con el servidor ya sea en el Explorador de objetos o una ventana de consulta.

El Explorador de plantillas, que se muestra en el panel derecho de la Figura 3-4, permite el acceso a cientos de plantillas predefinidas para crear, modificar o eliminar objetos, así como consultar diversos objetos usando TSQL, MDX, XMLA, o DMX. Puede utilizar las plantillas que se suministran con SQL Server, modificarlas para incluir estándares de codificación específicos de su organización, y añadir plantillas o grupos adicionales de plantillas.

El menú “Comunidad” en la barra de herramientas le permite iniciar una ventana del navegador en el centro del panel, para acceder a los foros de MSDN y a “Microsoft Connect” de la misma forma que anteriormente se comentó en el tema “Libros en pantalla”.

El menú Herramientas | Opciones de la barra de herramientas mostrará el cuadro de diálogo “Opciones”, como se muestra en Figura 3-5 en la página 40, para que pueda configurar el entorno de SSMS específicamente de la forma en que desea trabajar.

Configurar el entorno SSMS

1. Seleccione Herramientas | Opciones de la barra de herramientas.

2. Expanda la opción “Environment” del árbol y seleccione el nodo “General”. Utilice la lista desplegable de la opción “Al inicio” para configurar el aspecto y el look and feel del SQL Server Management Studio.

3. Expanda: Editor de texto | Todos los idiomas | Fichas (tabs).

4. Establezca el Tamaño de tabulación a 4.

www.detodoprogramacion.com

Page 62: Microsoft SQL Server 2008 Español - Mike Hotek

40 Parte I Introducción a Microsoft SQL Server 2008

FIGURA 3-5 Cuadro de diálogo Opciones del SQL Server Management Studio

5. Establezca el Tamaño de sangría a 4.

6. Seleccione la opción Insertar espacios.

7. Explore el resto de las opciones que están disponibles para la configuración.

8. Haga clic en Aceptar para guardar la configuración.

Consejo: Cuando se establece SSMS para iniciarse con un entorno vacío, usted no verá la ventana “Conectar a Servidor” y SSMS se iniciará de inmediato. A continuación, tendrá que conectarse explícitamente a una instancia para el Explorador de objetos o para la ventana de consulta, ya sea desde el panel de servidores registrados, Archivo | Conectar Explorador de objetos, o desde el botón Nueva consulta. Al establecer las opciones de tamaño de tabulación y espacios de inserción, SSMS reemplazará automáticamente cualquier “pestaña” con espacios en una ventana de consulta, que le permitirá formatear y alinear más fácilmente el código, incluso cuando se utiliza una fuente proporcional.

Como se puede ver en la Figura 3-6, el Explorador de objetos proporciona acceso a prácticamente cualquier acción que desea realizar sobre cualquier objeto de SQL Server. Usted va a utilizar las funcionalidades del Explorador de objetos a lo largo de prácticamente todos los capítulos de este libro.

Dos funciones adicionales del SSMS son “resúmenes de objetos” y capacidades de reporting incorporadas (built-in). La ficha “detalle del Explorador de objetos” muestra información resumida según el objeto que está seleccionado en el Explorador de objetos. Los Informes SSMS, se muestran en la Figura 3-7 y permiten mostrar tanto informes estándar que se incluyen con SQL Server como acceder a sus propios informes personalizados que se han diseñado con el Diseñador de informes de Reporting Services y sobre los que aprenderá en el artículo "Reporting Services", que se puede encontrar en: www.microsoft.com/learning/books/online/ServerClient.

www.detodoprogramacion.com

Page 63: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3 Uso de las herramientas de SQL Server 2008 41

FIGURA 3-6 Explorador de objetos para una instancia de SQL Server

FIGURA 3-7 Informes SSMS

www.detodoprogramacion.com

Page 64: Microsoft SQL Server 2008 Español - Mike Hotek

42 Parte I Introducción a Microsoft SQL Server 2008

Correo electrónico de base de datos

El correo electrónico de la base de datos le permite a un servidor SQL Server enviar mensajes de correo saliente. Si bien los mensajes pueden contener resultados de consultas, el correo electrónico de base se utiliza principalmente para enviar mensajes de alerta a los administradores para notificarles de las condiciones de ejecución o cambios que se han hecho en los objetos. En el siguiente procedimiento, usted aprenderá cómo configurar el “Correo electrónico de base de datos”.

Configurar el Correo electrónico de base

1. Haga clic en el botón Nueva consulta para abrir una nueva ventana de consulta y ejecute el siguiente código para habilitar la función de Correo electrónico de base:

EXEC sp_configure 'Database Mail XPs', 1

GO

RECONFIGURE WITH OVERRIDE

GO

2. En el Explorador de objetos, abra el nodo de administración, haga clic en Correo electrónico de base, y seleccione Configuración de Correo electrónico de base.

3. Haga clic en Siguiente en la pantalla de bienvenida.

4. Seleccione la opción "Configurar el correo de la base de datos a partir de la realización de las siguientes tareas" y haga clic en Siguiente.

5. Especifique un nombre para el perfil y haga clic en Agregar para especificar la configuración de una cuenta de correo.

6. Introduzca en los campos de la ventana “Nueva cuenta de correo de base de datos”: el nombre de la cuenta, la dirección de e-mail, el nombre para mostrar, el e-mail de respuesta (se puede dejar el mismo que se puso en el campo “dirección de e-mail”), y el nombre de servidor.

7. Seleccione el modo apropiado de autenticación SMTP para su organización y, si se utiliza

Autenticación básica, especifique el nombre de usuario y la contraseña. La configuración debe quedar similar a la siguiente:

www.detodoprogramacion.com

Page 65: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3 Uso de las herramientas de SQL Server 2008 43

Nota Su pantalla debe ser similar a la configuración del gráfico anterior. Yo estoy usando mi cuenta de correo electrónico de Internet y he dejado a propósito el nombre del servidor, el nombre de usuario y la contraseña fuera del gráfico. Usted tendrá que llenar el campo Nombre de servidor si está utilizando un servidor de correo interno.

8. Haga clic en Aceptar y, a continuación, haga clic en Siguiente.

9. Marque la casilla en la columna “Pública2 junto al perfil que acaba de crear y activar este modo en Sí en la columna de perfil predeterminado y haga clic en Siguiente.

10. Revise la configuración de la página Parámetros de configuración del sistema y haga clic en Siguiente.

11. Haga clic en Aceptar y, a continuación, haga clic en Siguiente y, a continuación, haga clic en Finalizar.

12. La última página debe mostrar el éxito de los cuatro pasos de configuración, haga clic en Cerrar.

13. En el Explorador de objetos, haga clic en elemento Agente SQL Server y seleccione Iniciar en el menú de acceso directo, para iniciar el servicio del Agente SQL Server, si no está ya funcionando.

Nota El correo electrónico de base de datos utiliza los servicios del Agente SQL Server para enviar mensajes como un proceso background (de fondo). Si el Agente SQL Server no se está ejecutando, los mensajes se acumulan en una cola en la base de datos msdb.

14. Haga clic en Correo base de datos y seleccione “Enviar correo electrónico de prueba” desde el menú contextual.

15. Seleccione el Perfil de Correo electrónico de base que acaba de crear, introduzca una dirección e-mail en el campo “Para:”, y haga clic en “Enviar correo electrónico de prueba”.

16. Vaya a su cliente de correo electrónico y compruebe que ha recibido el mensaje de correo electrónico de prueba.

www.detodoprogramacion.com

Page 66: Microsoft SQL Server 2008 Español - Mike Hotek

44 Parte I Introducción a Microsoft SQL Server 2008

Herramientas de gestión del rendimiento

Además de las herramientas de configuración y administración de las que se discutió previamente, SQL Server 2008 incluye tres herramientas especializadas para capturar, analizar y resolver problemas de rendimiento de datos.

Profiler (analizador)

SQL Server Profiler es una herramienta gráfica que actúa como interfaz para el seguimiento SQL de la Interfaz de programación de aplicaciones (API). Profiler le permite definir los eventos de SQL Server, como se muestra en la Figura 3-8, que desea capturar para ver la información. También puede especificar opciones de filtrado para orientar sus datos de captura dentro de los eventos que se han especificado. Usted aprenderá más acerca de Profiler en el artículo, "Rendimiento y Herramientas de captura de datos ", que se puede encontrar en www.microsoft.com/learning/libros/online/ServerClient.

FIGURA 3-8 Selección de eventos en el cuadro de diálogo de las propiedades del SQL Server Profiler

Asesor de Tuning del motor de base de datos (Engine Tuning Advisor)

Database Engine Tuning Advisor (DTA) analiza una carga de trabajo de consultas y formula recomendaciones de cambios en los índices y particiones, que pueden mejorar el rendimiento de las consultas (Como se muestra en la Figura 3-9).

www.detodoprogramacion.com

Page 67: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 3 Uso de las herramientas de SQL Server 2008 45

Usted aprenderá más acerca de los índices en el capítulo 6, "Índices", acerca de particionado en el Capítulo 7, "Particionamiento", sobre capturar la carga de trabajo de una consulta en el artículo, "Herramientas de Rendimiento y Captura de datos ", que puede encontrar en el Sitio web enwww.microsoft.com/learning/libros/online/ServerClient, y sobre cómo aplicar DTA en el artículo, "Herramientas de análisis de rendimiento", que se puede encontrar en el sitio web www.microsoft.com/learning/books/online/ServerClient.

FIGURA 3-9 Afinar la definición de la carga de trabajo DTA

Performance Studio (Estudio de rendimiento)

Performance Studio es el nombre dado a un conjunto de tecnologías en SQL Server 2008 que se orientan al análisis de rendimiento de los datos en toda la empresa. Los componentes de Performance Studio son:

 

 

 

Performance Data Warehouse

Recolectores de Datos

Informes de rendimiento

El Performance Data Warehouse es una base de datos que usted crea. Data Collectors son paquetes SSIS, que se ejecutan de forma programada con el Agente SQL Server. Y los Informes de Rendimiento son un conjunto de reportes de “Report Designer” escritos con los datos almacenados en la base Performance Data Warehouse.

www.detodoprogramacion.com

Page 68: Microsoft SQL Server 2008 Español - Mike Hotek

46 Parte I Introducción a Microsoft SQL Server 2008

Usted aprenderá sobre cómo configurar, administrar y aprovechar los componentes de Performance Studio en el artículo, "Herramientas de análisis de rendimiento", que se puede encontrar en www.microsoft.com/learning/books/online/ServerClient.

Herramientas de Business Intelligence

La gestión de SSIS, SSAS y SSRS, se realiza dentro del SSMS (Management Studio). Sin embargo, el desarrollo de paquetes, informes, modelos de informes, cubos OLAP y modelos de minería de datos se realiza en el Business Intelligence Development Studio (BI Dev Studio).

Business Intelligence Development Studio (BIDS)

El BI Studio Dev es el shell de Visual Studio 2008 con soporte para proyectos BI SQL Server 2008, como se muestra en la Figura 3-10. Cada uno de los proyectos de BI se estudiarán en el capítulo 24, "Servicios de Integración", Capítulo 25, "SQL Server Reporting Services" y en el Capítulo 26, "SQL Server Analysis Services."

FIGURA 3-10 BI Dev Studio Projects

www.detodoprogramacion.com

Page 69: Microsoft SQL Server 2008 Español - Mike Hotek

Abra BI Dev Studio, cree un nuevo proyecto y diseñe los objetos que se desean implementar.

Capítulo 3 Uso de las herramientas de SQL Server 2008 47

Capítulo 3 Referencia Rápida

Para

Administrar una instancia de SQL Server, cubos OLAP, modelos de minería de datos, Integración

Servicios, o de Reporting Services

Escribir y/o ejecutar código T-SQL, MDX, o DMX.

Configuración y administración de Correo electrónico de base de datos

Obtener ayuda sobre un tema

Haga lo siguiente

Conéctese al servicio correspondiente dentro del Explorador de objetos de SQL Server Management Studio

Abra la ventana de consulta apropiada (T-SQL, MDX, o

DMX) y conéctese a la instancia contra la que desea escribir o

ejecutar código.

Conectarse a una instancia del motor de base de datos

Inicie SQL Server Books Online. Si usted está escribiendo una consulta, puede resaltar un término y usar SHIFT + F1 para lanzar Books On Line con el término destacado

Abra SQL Server Configuration Manager y use el botón de arranque, parar o pausar, de la barra de herramientas o haga doble clic en el servicio para acceder a la ventana de propiedades.

Iniciar, detener y pausar un servicio o

administrar las cuentas de servicio

Limitar los recursos que una consulta en particular o que un usuario pueden consumir

Construir proyectos SSIS, SSRS, SSAS e implementarlos en una instancia de SQL Server

Gestionar el rendimiento Utilice Profiler para capturar las cargas de trabajo de las consultas, DTA para analizar cargas de trabajo capturadas con el Profiler, y Performance Studio para automatizar la captura de métricas de rendimiento.

Configurar el regulador de recursos dentro de SSMS

www.detodoprogramacion.com

Page 70: Microsoft SQL Server 2008 Español - Mike Hotek

Parte II

Diseñar bases de datos

En esta parte:

Capítulo 4: Creación de bases de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Capítulo 5: Diseñar tablas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. 63

Capítulo 6: Índices. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Capítulo 7: Partición. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

49

www.detodoprogramacion.com

Page 71: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 4

Creación de bases de datos

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

Comprender la función de cada base de datos del sistema

Crear bases de datos

Definir y agregar grupos de archivos a una base de datos

Agregar archivos a un grupo de archivos

Separar y adjuntar bases de datos

Las bases de datos son los objetos primarios dentro de SQL Server, tanto para el motor relacional, como para SQL Server 2008 Analysis Services (SSAS). En este capítulo, usted aprenderá cómo crear bases de datos, junto con los fundamentos de almacenamiento de datos. Usted aprenderá acerca de los diferentes tipos de grupos de archivos que se pueden crear para una base de datos y cómo cada tipo afecta la forma en que los datos se almacenan y manipulan.

Dado que todos los datos dentro de SQL Server tienen que ser almacenados dentro de una base de datos, la información sobre la Instancia de SQL Server y cualquiera de los objetos que contiene dicha instancia también tienen que ser almacenados en bases de datos. Vamos a describir cada una de las bases de datos del sistema que se incluyen en SQL Server y su papel dentro de la plataforma de SQL Server.

La capacidad del sistema de archivos de mover bases de datos alrededor de un único servidor o mover bases de datos de un servidor a otro es fundamental para poder gestionar un entorno de SQL Server. Usted completará este capítulo, aprendiendo un método para mover bases de datos alrededor de su entorno: separar y adjuntar (detach and attach).

Bases de datos del sistema SQL Server

SQL Server 2008 incluye un conjunto de bases de datos de sistema utilizadas para administrar los diversos aspectos del motor de base de datos:

 

 

 

 

 

master

model

msdb

tempdb

distribution

51

www.detodoprogramacion.com

Page 72: Microsoft SQL Server 2008 Español - Mike Hotek

52 Parte II Diseñar bases de datos

Nota Con cada objeto referenciado en las descripciones de las bases de datos de sistema, se comenta el número de capítulo donde usted puede encontrar más información acerca de ese objeto en particular.

La base de datos master está en el corazón de cada instancia de SQL Server. Sin la base de datos master, SQL Server no se puede ejecutar. La base de datos master contiene información sobre el núcleo de objetos dentro de una instancia, tales como:

 

 

 

 

 

 

Bases de datos - Capítulo 4

Logins - Capítulo 18

Opciones de configuración - Capítulo 2

Endpoints - Capítulo 18

Disparadores DDL a nivel de servidor - Capítulo 14

Servidores vinculados (linked) - Capítulo 8

La base de datos model es una plantilla, que utiliza SQL Server, cuando se crea una nueva base de datos. Cuando se realiza un comando CREATE DATABASE (que se conocerá más adelante en este capítulo), SQL Server toma la definición de la base de datos model y la aplica a la nueva base de datos que está creando. El propósito de la base de datos model es permitir que los administradores creen objetos que se agregarán después automáticamente a las nuevas bases de datos que sean creadas.

La base de datos msdb es utilizada por el servicio Agente de SQL Server junto con SQL Server 2008 Integration Services (SSIS). El papel central de la base de datos msdb es almacenar los Jobs (trabajos) y schedules (programaciones) que son ejecutados por el Agente SQL Server. Dentro de la base de datos msdb, puede encontrar la siguiente información:

 

 

 

 

 

 

 

 

 

Reportes DTA (Database Engine Tuning Advisor) Capítulo 29

El historial de cualquier copia de seguridad/restauración ejecutada contra cualquiera de las bases de datos - Capítulo 20

La información de seguimiento para el envío de logs (registros) - Capítulo 23

Jobs, pasos de jobs y programaciones (schedules) - Capítulo 21

Alertas - Capítulo 21

Cuentas de proxy - Capítulo 21

Planes de mantenimiento - Capítulo 21

Paquetes SSIS - Capítulo 24

Registros del correo de base de datos - Capítulo 3

La base de datos tempdb es un área "borrador" dentro de SQL Server. El motor de SQL Server utiliza tempdb como un área de almacenamiento temporal cuando se hacen operaciones de ordenamiento y agregación.

www.detodoprogramacion.com

Page 73: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 4 Creación de bases de datos 53

Usted puede ver la base de datos tempdb como cumpliendo una función similar a la del archivo de paginación en Windows. Todo lo creado en tempdb, por su propia naturaleza, es temporal. Cuando se reinicia una instancia de SQL Server, tempdb es eliminada y vuelta a crear.

Nota Nunca debería crear un objeto que se requiere que sea persistente en la tempdb porque perderá todo lo almacenado en esta base de datos, cuando la instancia se reinicie.

La base de datos distribution se crea en el “distribuidor” cuando se habilita la replicación. Podrá obtener más información acerca de la replicación en el artículo, "Características de alta disponibilidad", que se pueden encontrar en www.microsoft.com/aprendizaje/books/online/ServerClient.

Estructura de una base de datos SQL Server Los objetos que se crean dentro de una base de datos se denominan colectivamente como "esquema" de la base de datos. Los elementos que definen una base de datos, los componentes de almacenamiento, se conocen como la estructura de base de datos. Una base de datos de SQL Server se define mediante un elemento físico, archivos en el sistema operativo y un elemento lógico utilizado para agrupar los archivos dentro de una base de datos. La estructura básica de una base de datos se muestra en la Figura 4-1 en la página 54.

Los archivos de base de datos

Los tipos de archivo más comunes que soporta una base de datos SQL Server son archivos de datos y archivos de registro de transacciones. Las extensiones de archivo por defecto para los archivos de datos son los siguientes:

 

 

 

. Mdf

. Ndf

. Ldf

archivo principal

archivo secundario

archivo de registro de transacciones

Las extensiones por defecto utilizadas para archivos de datos son sólo sugerencias. No es necesario utilizar estas extensiones o incluso proporcionar extensiones para los archivos que usted cree. Sin embargo, usted se evitará una gran confusión si se adherirse a la extensión de archivo por defecto que se ha convertido en un estándar para Bases de datos SQL Server.

Puede especificar varias propiedades para los archivos de datos y archivos de registro, tales como:

 

 

 

 

Nombre del archivo físico

Tamaño inicial de archivo

Factor de crecimiento del archivo

El tamaño máximo

www.detodoprogramacion.com

Page 74: Microsoft SQL Server 2008 Español - Mike Hotek

54 Parte II Diseñar bases de datos

Base de datos

El grupo de archivos

Catálogo de Texto completo

Grupo de archivos FILESTREAM

Archivos de Datos

Transacción Log (Registro de Transacciones)

Directorio FILESTREAM

Catálogo de Texto completo

Archivos Índice de Full-Text

Archivos

FIGURA 4-1 Elementos estructurales de una Base de datos

La sintaxis genérica para definir un archivo es:

<filespec> ::= { ( NAME = logical_file_name ,

FILENAME = { 'os_file_name' | 'filestream_path' } [ , SIZE = size [ KB | MB | GB | TB ] ] [ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ] [ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]) [ ,...n ]

}

Mientras que el nombre físico de un archivo es un elemento obligatorio en la definición, las propiedades más importantes que se manejan para un archivo son el tamaño y el factor de crecimiento.

Con el tiempo, va a almacenar cada vez más datos dentro de una base de datos. SQL Server le permite gestionar el almacenamiento en disco mediante la configuración del parámetro FILEGROWTH en un archivo. Cuando el Motor de almacenamiento de SQL Server detecta que se está quedando sin espacio libre en el archivo, se aumentará automáticamente el tamaño del mismo de acuerdo con la especificación FILEGROWTH.

www.detodoprogramacion.com

Page 75: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 4 Creación de bases de datos 55

El crecimiento de archivo se puede especificar como un porcentaje o un tamaño fijo-KB, MB, GB o TB. Cuando se especifica un porcentaje de crecimiento, SQL Server agrega una cantidad de espacio para el archivo basado en el porcentaje del tamaño actual del archivo en el disco. Cuando se especifica un tamaño fijo, SQL Server agregará el espacio de acuerdo con la especificación de crecimiento de tamaño fijo.

El parámetro MAXSIZE le permite limitar el tamaño de un archivo a un valor máximo de modo que SQL Server no intenta aumentar el tamaño del archivo más allá del espacio de disco disponible en el del sistema operativo.

Cuando se crea un archivo, se puede especificar un tamaño inicial del mismo. El tamaño del archivo que inicialmente se especifica, está relacionado con la cantidad de datos que se espera almacenar en él. Puesto que usted no puede predecir la cantidad total de datos que se van a almacenar, desea especificar un tamaño que sea lo suficientemente grande como para manejar los datos de un período de tiempo, mientras que sea lo suficientemente pequeño tal que usted no necesite asignar constantemente espacio adicional en los archivos.

Estructura interna de archivos

Los archivos de datos que soportan una base de datos SQL Server pueden llegar a ser bastante grandes. Con el fin de leer y escribir datos de manera eficiente, el motor de almacenamiento de SQL Server (Storage engine) no lee ni escribe el archivo de datos completo. En cambio, el motor de almacenamiento de SQL Server lee y escribe trozos de 64 KB de un archivo de datos llamado extensiones (extents).

Cuando se añaden archivos a una base de datos, SQL Server inicializa el contenido de cada archivo con segmentos de almacenamiento de 8 KB llamados páginas. Una página define el elemento de almacenamiento de mayor granularidad utilizado por SQL Server, cada página tiene una estructura específica de tal manera que SQL Server puede almacenar y recuperar datos. Ocho páginas se combinan en una estructura llamada extent. Una extensión define el bloque más granular de E/S utilizado por el Motor de almacenamiento de SQL Server para leer y escribir datos.

Más información La estructura de una página de datos está más allá del alcance de este libro. Para una discusión detallada de la estructura de la página de datos y los mecanismos de almacenamiento interno de SQL Server, por favor referirse a “SQL Server 2008 Internals” por Kalen Delaney.

Los archivos índices de texto completo son una estructura de archivos especializada utilizada sólo, y en conjunción con, la indexación de texto completo. Los archivos almacenados a través de un tipo de datos FILESTREAM residen en archivos individuales en el sistema operativo bajo el control del motor del servidor de almacenamiento de SQL.

Más información Usted aprenderá más acerca de los índices de texto completo en el Capítulo 17, "indización de texto completo" y del tipo de datos FILESTREAM en el capítulo 5, "Diseño de tablas".

www.detodoprogramacion.com

Page 76: Microsoft SQL Server 2008 Español - Mike Hotek

56 Parte II Diseñar bases de datos

Los grupos de archivos

Todos los datos se almacenarán en el sistema operativo en uno o más archivos, en base a los tipos de datos almacenados, así como las opciones de almacenamiento que elija. Con el fin de proporcionar abstracción en la necesidad de trabajar con los archivos físicos en el sistema operativo, SQL Server introduce el concepto de “grupo de archivos”. Un grupo de archivos no es más que un nombre para una colección de archivos del sistema operativo. Los administradores de bases de datos (DBAs) pueden centrarse en la gestión de datos dentro de grupos de archivos, mientras que se deja la semántica de “almacenamiento físicos” para el motor de almacenamiento de SQL Server.

El uso de un grupo de archivos como una capa de abstracción es útil, ya que permite que el almacenamiento en disco sea diseñado por separado del almacenamiento de datos dentro de una base de datos. Mediante la separación de las arquitecturas de almacenamiento, un DBA puede crear grupos de archivos que contengan varios archivos, con el fin de distribuir los datos entre una colección de archivos para obtener rendimiento, sin necesidad de participar en el almacenamiento físico de cada fila de datos. Los objetos de base de datos se crean en un grupo de archivos y el motor de almacenamiento de SQL Server se encarga de la distribución de los datos en toda la colección de archivos.

Como podrá observar en la Figura 4-1, el registro de transacciones recibe un tratamiento especial dentro de una instancia de SQL Server Server. Un archivo de datos está asociado a un grupo de archivos. Sin embargo, un archivo de registro de transacciones no está asociado a un grupo de archivos dentro de la base de datos. La razón de que un registro de transacciones no se asocie a un grupo de archivos es porque no se le permite a usted interactuar directamente con el registro de transacciones o colocar objetos en el archivo de registro de transacciones. La gestión de los datos dentro de un archivo de registro de transacciones es territorio exclusivo del motor de almacenamiento de SQL Server.

Usted puede crear tres tipos de grupos de archivos dentro de una instancia de SQL Server:

 

 

 

Datos

Texto completo

FILESTREAM

El grupo de archivos más común que usted creará, se utiliza para almacenar los datos de las tablas e índices. El grupo de archivos define un límite de almacenamiento para tablas e índices. Durante la creación, usted especifica el grupo de archivos que se utilizará para almacenar los datos de una tabla o índice. A menos que sean particionados, los datos almacenados en las tablas e índices no pueden abarcar grupos de archivos.

Más información Usted aprenderá sobre cómo crear tablas en el capítulo 5, "Diseño de tablas", índices en el Capítulo 6, "Índices", y la forma particionar tablas e índices en el capítulo 7, "Particiones".

Los grupos de archivos se pueden crear con dos propiedades opcionales: PRIMARY y DEFAULT. Usted puede sólo tener un grupo de archivos PRIMARY o DEFAULT dentro de una base de datos.

www.detodoprogramacion.com

Page 77: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 4 Creación de bases de datos 57

El grupo de archivos dentro de una base de datos que se designe como PRIMARIO contendrá todos los objetos “de sistema” asociados a la base de datos. El grupo de archivos que se designa como DEFAULT define la opción de almacenamiento cuando las tablas o los índices se crean sin especificar una opción de almacenamiento de grupo de archivos.

Nota El grupo de archivos PRIMARY tendrá normalmente un único archivo de datos con extensión. Mdf. Esto le permite a los administradores de bases garantizar que todos los objetos “de sistema” dentro de una base de datos se mantienen en un solo archivo. Junto con la designación de un grupo de archivos que no contenga la extensión “. Mdf” como DEFAULT, los DBAs pueden garantizar que sólo los objetos de sistema se encuentran dentro del grupo de archivos PRIMARY.

Un grupo de archivos de texto completo, referido como un catálogo de texto completo, se crea como apoyo de la indización de texto.

Más información Usted aprenderá más acerca de los catálogos de texto completo en el Capítulo 17, "índices de texto completo."

Un grupo de archivos FILESTREAM es un grupo de archivos que está designado para el almacenamiento de los datos FILESTREAM.

Más información Usted aprenderá más sobre el tipo de datos FILESTREAM en el capítulo 5, "Diseño de Tablas ".

Creación de una base de datos

Una vez que entienda la función de los archivos y grupos de archivos, la creación de una base de datos es relativamente un proceso sencillo. La sintaxis genérica para la creación de una base de datos es la siguiente:

CREATE DATABASE database_name [ ON

[ PRIMARY ] [ <filespec> [ ,...n ] [ , <filegroup> [ ,...n ] ]

[ LOG ON { <filespec> [ ,...n ] } ] ] [ COLLATE collation_name ] [ WITH <external_access_option> ]]

[;]

]

En el siguiente procedimiento, creará dos bases de datos que va a utilizar para demostrar varias características de SQL Server dentro de este libro. Una base de datos tendrá varios grupos de archivos y designará a un grupo de archivos como DEFAULT. La segunda base de datos se compone de un grupo de archivos FILESTREAM.

Nota Es altamente recomendable que usted separe FILESTREAM dentro de una base de datos de todos los demás datos, porque FILESTREAM es incompatible con mirroring de base de datos y snapshot de base de datos.

www.detodoprogramacion.com

Page 78: Microsoft SQL Server 2008 Español - Mike Hotek

58 Parte II Diseñar bases de datos

Nota Dentro de cualquier procedimiento de este libro, se utilizarán la unidad C y los directorios por defecto para los comandos que hacen referencia al sistema de archivos. Usted debe hacer los ajustes necesarios en el path de archivo de acuerdo a sus preferencias.

Crear una base de datos

1. Inicie SSMS y haga clic en Nueva consulta de la barra de herramientas.

2. Escriba el siguiente código (el código es desde el archivo “Chapter4\code1.sql” en los ejemplos que acompañan el libro):

CREATE DATABASE SQL2008SBS ON PRIMARY ( NAME = N'SQL2008SBS', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS.mdf', SIZE = 3MB , MAXSIZE = UNLIMITED, FILEGROWTH = 10% ),

FILEGROUP FG1 DEFAULT ( NAME = N'SQL2008SBSFG1_Dat1', FILENAME = N'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_1.ndf', SIZE = 2MB , MAXSIZE = UNLIMITED, FILEGROWTH = 2MB), (NAME = N'SQL2008SBSFG1_Dat2', FILENAME = N'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_2.ndf', SIZE = 2MB , MAXSIZE = UNLIMITED, FILEGROWTH = 2MB), (NAME = N'SQL2008SBSFG1_Dat3', FILENAME = N'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_3.ndf', SIZE = 2MB , MAXSIZE = UNLIMITED, FILEGROWTH = 2MB)

LOG ON ( NAME = N'SQL2008SBS_Log', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS.ldf', SIZE = 2MB , MAXSIZE = UNLIMITED , FILEGROWTH = 10MB )

GO

CREATE DATABASE SQL2008SBSFS ON PRIMARY ( NAME = N'SQL2008SBSFS', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBSFS.mdf', SIZE = 3MB , MAXSIZE = UNLIMITED, FILEGROWTH = 10% ),

FILEGROUP DocumentFileStreamGroup CONTAINS FILESTREAM ( NAME = N'FileStreamDocuments', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBSFS' ) LOG ON ( NAME = N'SQL2008SBSFS_Log', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBSFS.ldf', SIZE = 2MB , MAXSIZE = UNLIMITED , FILEGROWTH = 10MB )

GO

3. Actualice el Explorador de objetos, y compruebe que se han creado dos nuevas bases de datos llamadas SQL2008SBS y SQL2008SBSFS.

4. Haga clic derecho en la base de datos SQL2008SBS, seleccione Propiedades y, navegue por las distintas fichas (tabs) en el cuadro de diálogo Propiedades de la base de datos.

www.detodoprogramacion.com

Page 79: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 4 Creación de bases de datos 59

Mover Bases de datos

A veces, puede que tenga que mover de lugar bases de datos dentro de su entorno para aprovechar espacio de almacenamiento adicional o a máquinas con capacidad de procesamiento superior. Dado que SQL Server iniciará cada base de datos de una instancia y abrirá cada archivo asociado para operaciones de lectura/escritura, usted necesitará realizar varios pasos para poder mover una base de datos.

El primer paso en el proceso, “separar” (detach), elimina la entrada de la base de datos de la instancia, cierra todos los archivos asociados con la base de datos, y libera todos los bloqueos del sistema operativo. El paso final en el proceso, “adjuntar” (attach), crea una nueva entrada de base de datos dentro de la instancia y abre todos los archivos asociado a la base de datos.

Nota Si necesita mover archivos a diferentes directorios en el mismo servidor, entonces usted puede utilizar el al comando ALTER DATABASE.

Separar una base de datos (Detach)

Cuando separa una base de datos, usted está extrayendo la entrada de la base de datos desde la instancia del servidor SQL. SQL Server entonces libera todos los bloqueos del sistema operativo sobre todos los archivos asociados a una base de datos. Una vez terminado, todo lo que queda son los archivos del sistema operativo que contienen todos los datos. Los archivos pueden ser copiados a una nueva ubicación con el fin de mover la base de datos. Hay que prestar especial atención a los datos de texto completo o de FILESTREAM asociados a la base de datos, ya que todas estas estructuras también deben moverse junto con todos los datos/archivos de registro de la base de datos.

Una base de datos no se puede separar si se cumple alguna de las siguientes condiciones:

 

 

 

 

 

La base de datos está participando en una replicación

La base de datos está participando en mirroring de base de datos

Se ha creado una instantánea de base de datos

La base de datos está en “modo sospechoso”

La base de datos es una base de datos del sistema

Separar una base de datos

1. Inicie SSMS y conéctese a su instancia de SQL Server 2008 en el Explorador de objetos.

2. Haga clic derecho en la base de datos que ha creado previamente SQL2008SBS y seleccione Separar (Detach), como se muestra en el siguiente gráfico.

www.detodoprogramacion.com

Page 80: Microsoft SQL Server 2008 Español - Mike Hotek

60 Parte II Diseñar bases de datos

3. En el cuadro de diálogo “Separar base de datos”, deje todas las opciones con sus valores predeterminados y haga clic en Aceptar.

4. La base de datos SQL2008SBS ya no debería aparecer como una entrada en el Explorador de objetos.

Adjuntar una base de datos

Una vez que se ha desprendido una base de datos, puede copiar los archivos asociados a la misma en una nueva ubicación y luego adjuntarlos a una instancia de SQL Server. Existen algunas restricciones para adjuntar una base de datos. Las restricciones más importantes son:

  La instancia tiene que estar en el mismo service pack/ nivel de revisión (hotfix) o más alto que el de la instancia de base de datos donde fue separada la base de datos.

Todos los archivos de datos deben estar disponibles

Debe copiar y poner todos los archivos y directorios asociados a un tipo de datos FILESTREAM en

exactamente la misma estructura de directorios como la instancia donde se separó la base de datos de datos.

 

 

Mover y adjuntar una base de datos

1. En el Explorador de objetos, haga clic en el nodo Bases de datos y seleccione Adjuntar (attach) desde el del menú contextual.

2. Haga clic en "Agregar" sobre la ventana de diálogo "Attach Database", en la sección "Database to attach", vaya a la ubicación del archivo. mdf de la base de datos SQL2008SBS, seleccione el archivo SQL2008SBS.mdf, y haga clic en Aceptar.

3. Compruebe que la base de datos SQL2008SBS ahora existe en el Explorador de objetos.

www.detodoprogramacion.com

Page 81: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 4 Creación de bases de datos 61

www.detodoprogramacion.com

Page 82: Microsoft SQL Server 2008 Español - Mike Hotek

62 Parte II Diseñar bases de datos

Capítulo 4 Referencia Rápida

Para

Crear una nueva base de datos

Añadir almacenamiento a una base de datos

Haga lo siguiente

Utilice el comando CREATE DATABASE

 

 

Agregar uno o más archivos a un grupo de archivos existentes

Agregar uno o más grupos de archivos que contengan al menos un archivo

Establecer un grupo de archivos que se utilizará por defecto cuando no se especifican opciones de almacenamiento al crear una tabla o índice

Habilitar una base de datos para almacenar datos FILESTREAM

Asigne la propiedad DEFAULT para el grupo de archivos

 

 

Crear una base de datos con un grupo de archivos designados con la opción CONTAINS FILESTREAM

Añadir un grupo de archivos a una base de datos existente diseñado para almacenamiento FILESTREAM

Separar una base de datos

Adjuntar una base de datos

Ejecute el procedimiento almacenado de sistema sp_detach_db

Ejecutar CREATE DATABASE con la opción FOR ATTACH

www.detodoprogramacion.com

Page 83: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5

Diseñar tablas

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

 

 

 

Crear y gestionar esquemas

Seleccionar los tipos de datos apropiados

Definir las propiedades adecuadas para las columnas de una tabla

Crear tablas

Entender los nuevos tipos de datos: FILESTREAM, SPATIAL, y DATE/TIME

Crear columnas calculadas

Definir restricciones (constraints) para asegurar la integridad de datos

Configurar las opciones de almacenamiento de datos para la compresión de filas/columnas y utilizar el concepto de “poca densidad” (sparse).

El corazón de cualquier base de datos y el propósito de cualquier plataforma de base de datos es almacenar y gestionar datos. Sin tablas, es imposible almacenar o gestionar los datos. En este capítulo usted aprenderá cómo definir tablas para almacenar sus datos. También aprenderá a definir los tipos de datos, las propiedades, y las restricciones necesarias para proporcionar estructura a los datos en una forma que satisfaga los requerimientos del negocio. Una vez que haya creado un par de tablas, usted aprenderá acerca de una característica disponible en SQL Server 2008 Management Studio (SSMS), que le permite ver la estructura de la tabla gráficamente, llamado: “diagramas de base de datos”. Por último, usted aprenderá acerca de las nuevas opciones de almacenamiento: “comprimir” y “almacenamiento disperso”, que optimizará la cantidad de espacio necesario en disco.

Premisa comercial

Uno de los objetivos de la serie “Paso a Paso” es proporcionar un ejemplo básico que se pueda construir a los largo de todo el libro. A fin de comprender toda la serie de prácticas en todo este libro, usted necesita una descripción básica del entorno empresarial sobre el que estaremos construyendo los ejemplos.

Wide World Importers es una empresa de importación/exportación con sede en Dallas, Texas. Wide World Importers se especializa en una variedad de herramientas eléctricas usadas principalmente para el rubro carpintería. Un pequeño porcentaje de la cartera de productos es importado de diversas empresas alrededor el mundo. El resto de la cartera de productos se fabrica en una instalación de fabricación con tecnología de punta en la compañía, la que también se encuentra en el área de Dallas, Texas.

Wide World Importers tiene un sitio Web donde los clientes pueden hacer sus pedidos “minoristas” a través de un catálogo de ventas por correo. La compañía también vende al por mayor a un variedad de cadenas de tiendas y negocios especializados. Los clientes pueden hacer sus pedidos al por mayor

63

www.detodoprogramacion.com

Page 84: Microsoft SQL Server 2008 Español - Mike Hotek

64 Parte II Diseñar bases de datos

a través del sitio Web, por teléfono, o Intercambio Electrónico de Datos (EDI) utilizandodocumentos XML formateados según las especificaciones de la compañía.

Además de un amplio inventario de productos, Wide World Importers también mantiene una biblioteca de manuales y documentación de productos con formato Word y Formato de Documento Portátil (PDF). Los clientes pueden descargar la documentación a través del sitio Web por medio de uno o más enlaces en una página de productos (el código que está en el archivo " Chapter5\code14-mastercreationscript.sql " en los ejemplos que acompañan el presente libro, incluye todos los casos prácticos listados en este capítulo).

Nombrar objetos

El nombre de un objeto es referido como un identificador. Con la excepción de algunas restricciones, cada objeto tiene un identificador que se asigna cuando se crea el objeto.

Hay dos tipos de identificadores: los regulares y delimitados (regular and delimited).

Las reglas de los identificadores son como sigue:

 

 

 

 

Máximo de 128 caracteres

El primer carácter debe ser una letra

No puede ser una palabra reservada de T-SQL

No puede contener espacios ni caracteres especiales

Los nombres de objetos que no cumplan con las reglas para los identificadores, deben estar delimitados con comillas dobles ", o bien con corchetes, [].

Los objetos de una base de datos se nombran utilizando un esquema de nombres de cuatro partes: <instancia>. <database>.<schema>. <object>. Las porciones de la instancia, la base de datos y el esquema son opcionales. Si no se especifica el nombre de la instancia, el nombre del objeto usará de forma predeterminada el nombre de la instancia a la que está conectado actualmente. Si no se especifica el nombre de base de datos, se usa el actual contexto de base de datos para la conexión. Si el nombre de esquema no se especifica, se utilizará el esquema predeterminado.

Nota La mejor práctica para nombrar y referirse a objetos es siempre especificar explícitamente <schema>. <object>.

Esquemas

Todos los objetos de una base de datos se crean dentro de un esquema. A la vez que un esquema proporciona un medio para agrupar objetos, también proporciona un límite o marco de seguridad.

Nota Usted aprenderá más sobre la aplicación de esquemas para la seguridad en el capítulo 19, "Seguridad".

www.detodoprogramacion.com

Page 85: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 65

La sintaxis genérica para crear un esquema es el siguiente:

CREATE SCHEMA schema_name AUTHORIZATION owner_name

En la siguiente práctica, creará varios esquemas que se utilizarán a lo largo de este libro.

Crear un esquema

1. Inicie SSMS, abra una nueva ventana de consulta, y cambie el contexto a la base de datos SQL2008SBS.

2. Ingrese y ejecute el siguiente código (el código está en el archivo “Chapter5\code1.sql” de

los ejemplos que acompañan este libro):

CREATE SCHEMA Customers AUTHORIZATION dbo GO CREATE SCHEMA Orders AUTHORIZATION dbo GO CREATE SCHEMA Products AUTHORIZATION dbo GO CREATE SCHEMA LookupTables AUTHORIZATION dbo GO

3. En el Explorador de objetos, expanda la base de datos SQL2008SBS junto con los nodos Seguridad y Esquemas, para verificar la creación de sus cuatro esquemas, como se muestra en el siguiente gráfico.

www.detodoprogramacion.com

Page 86: Microsoft SQL Server 2008 Español - Mike Hotek

66 Parte II Diseñar bases de datos

Nota El explorador de objetos almacena en caché la información que usted ve la primera vez. Por lo tanto, es posible que necesite actualizar el Explorador de objetos para ver los objetos nuevos que se crearon usando una ventana de consulta. Usted puede actualizar cualquier nodo en el Explorador de objetos, haciendo clic derecho y seleccionando “Actualizar”.

Diseño de base de datos

Se han escrito libros enteros y varias semanas cursos han sido impartidos sobre el diseño de base de datos. En todo este material, se encuentran discusiones sobre la primera, segunda y tercera forma normal, junto con la construcción de modelos de datos lógicos y físicos. Usted podría gastar una significativa cantidad de tiempo en aprender acerca de los metadatos y las herramientas de modelado de datos. Perdido en todo este material está el simple hecho de que las tablas tienen que ser creadas para respaldar una solicitud y las personas que crean las tablas tienen cosas más importantes de qué preocuparse en lugar de saber la forma normal en que está una base de datos o si recuerdan construir un modelo lógico y hacer un modelo físico a partir del modelo lógico.

Una base de datos en el mundo real no va a cumplir con los diseños teóricos, no importa cuanto usted intente encajar una estaca cuadrada en un agujero redondo.

El diseño de base de datos es en realidad un proceso muy simple, una vez que deje de pensar en exceso sobre lo que está haciendo. El proceso de diseño de una base de datos se puede resumir en una simple frase: "poner las cosas donde corresponde".

Reduciendo estas decenas de miles de páginas de material sobre diseño de base de datos en una sola frase sin duda hará que algunas personas se pongan moradas, así que vamos a investigar esta sencilla afirmación un poco más de cerca.

Si usted tuviera que diseñar una base de datos que almacenará los clientes, los pedidos de clientes, productos, y los productos que un cliente pidió, el proceso de elaboración de un conjunto de tablas es muy sencillo. Nuestros clientes pueden tener un nombre, apellido y dirección. Ahora tenemos una tabla llamada Cliente con tres columnas de datos. Sin embargo, si desea utilizar la dirección para enviar un pedido, usted tendrá que romper la dirección en sus partes componentes: localidad, ciudad, estado o provincia y el código postal. Si sólo permitió una dirección para un cliente, la información de dirección iría a la tabla cliente. Sin embargo, si usted quiere ser capaz de almacenar varias direcciones para un cliente, necesitamos una segunda tabla que se podría llamar CustomerAddress. Si a un cliente se le permite colocar una sola orden, entonces la información de la orden entraría en la tabla cliente. Sin embargo, si a un cliente se le permite colocar más de una orden, usted querría dividir los pedidos en una tabla separada que podría llamarse Orden. Si una orden puede ser compuesta por más de un artículo, usted desearía agregar una tabla la que se podría llamar OrderDetails para mantener varios elementos de una orden dada. Podríamos seguir esta lógica a través de todos los elementos de datos que se desea almacenar y, al final, se ha diseñado una base de datos mediante la aplicación de un principio simple: ". poner la cosas donde corresponde"

www.detodoprogramacion.com

Page 87: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 67

Una vez que tenga el diseño básico de la base de datos completo, por "poner las cosas donde corresponde", entonces está listo para agregar todos los elementos estructurales que llevan su diseño a una base de datos real. El resto de este capítulo, junto con el resto de los demás capítulos, enseñará cómo añadir elementos estructurales para el diseño, la toma de decisiones sobre el almacenamiento, seguridad y recuperación de datos, y a utilizar muchas capacidades dentro de SQL Server para construir aplicaciones de alto rendimiento, altamente escalables y de alta disponibilidad, todo esto por encima de su diseño de base de datos central.

Tipos de datos

Una hoja de cálculos y una base de datos son muy similares a un nivel muy básico. Tanto las hojas de cálculo como las bases de datos tienen filas y columnas donde se almacenan los datos. Tanto las hojas de cálculo como las bases de datos permiten localizar, recuperar y manipular datos en una variedad de maneras. Una de las diferencias fundamentales entre una base de datos y una hoja de cálculo es que una base de datos proporciona e impone una estructura sobre los datos que se almacenan. Aunque es posible mezclar caracteres, datos numéricos, y fechas en una sola columna de una hoja de cálculo, la base de datos impideeste tipo de estructura indefinida mediante el uso de tipos de datos asignados a una columna. Incluso aunque un tipo de datos no se conozca generalmente como una constraint, un tipo de datos es el mayor y fundamental elemento de restricción de una base de datos, en la que se restringe el rango de los posiblesvalores que están autorizados para ser almacenado dentro de una columna.

Mientras que muchos querrán saltar impacientes hacia delante a temas "más interesantes" de este material, yo tendría precaución en esto. No hay ninguna cantidad de hardware, códigos de aplicación, o indexación que puedan superar una mala decisión sobre el tipo de datos para una columna. Mientras que el disco de almacenamiento es relativamente barato y prácticamente ilimitado, cada bloque de datos debe ser movido a través de la memoria. La memoria no es barata y no es ilimitada. Tomar una decisión de un tipo de datos que cueste un adicional de 4 bytes de almacenamiento por cada fila en una tabla cuando sólo tiene unos pocos cientos de filas realmente no va a importar, sin embargo, cuando se almacenan millones, decenas de millones, o miles de millones de filas de datos en una tabla, los 4 bytes adicionales por fila pueden hacer la diferencia entre una aplicación que funciona y una aplicación que no.

Los datos numéricos

Uno de los tipos de datos más comunes que se encuentran dentro de SQL Server son los tipos de datos numéricos. Hay nueve tipos de datos numéricos que se incluyen con SQL Server 2008. Cuatro tipos de datos están diseñados para almacenar valores enteros de varios tamaños. Dos tipos de datos están diseñados para almacenar los datos monetarios. Cuatro tipos de datos están diseñados para almacenar números decimales con distintas precisiones. La Tabla 5-1 en la página 68 enumera los tipos de datos numéricos disponibles junto con el rango de valores y el espacio de almacenamiento necesario.

www.detodoprogramacion.com

Page 88: Microsoft SQL Server 2008 Español - Mike Hotek

68 Parte II Diseñar bases de datos

TABLA 5-1 Tipos de datos numéricos

Rango de Valores

0 hasta 255

-32.768 Y 32.767

-231 A 231-1

-263 A 263 -1

-1038 1-1038 -1

-214.748,3648 A 214,748.3647

-922.337.203.685.477,5808 A

922,337,203,685,477.5807

-3,438 A -1,1838, 0, y 1,1838 a 3,438

-1,79308 A -2,23308, 0, y 2,23308 a 1,79308

Tipo de datos

tinyint

smallint

int

bigint

decimal (p, s)

numeric (p, s)

smallmoney

money

real

FLOAT (n)

Espacio de almacenamiento

1 byte

2 bytes

4 bytes

8 bytes

5 a 17 bytes

4 bytes

8 bytes

4 bytes

4 bytes u 8 bytes

Nota Los tipos de datos decimales y numéricos son exactamente equivalentes entre sí. Ambos tipos de datos se mantienen en el producto (SQL Server) para tener compatibilidad hacia atrás. Cualquiera de estos tipos de datos puede ser utilizado cuando se necesitan almacenar datos numéricos exactos con decimales, sin embargo, se recomienda que elija o decimal o numérico en toda la organización para mantener la coherencia. Por simplicidad en este libro, siempre vamos a usar decimales a partir de ahora. Por favor, tenga en cuenta que en cualquier lugar que nos referimos a un tipo de datos decimal, puede reemplazar el decimal con un valor numérico de la misma definición.

Los tipos de datos money y smallmoney están específicamente diseñados para almacenar valores monetarios con un máximo de cuatro decimales. Es interesante observar que mientras money y smallmoney fueron diseñados para almacenar valores monetarios, las instituciones financieras utilizan el tipo de datos decimal debido a la capacidad de almacenar un mayor número de decimales que son críticos para cálculos de tasa de interés y rendimiento.

Los tipo de datos float tienen un parámetro opcional del número de dígitos almacenados después del decimal llamado mantisa. Si la mantisa está definida entre 1 y 24, entonces el float consumirá 4 bytes de almacenamiento. Si la mantisa está definida entre 25 y 53, el float consumirá 8 bytes de almacenamiento.

Nota Un tipo de datos real también se puede representar mediante el uso de float (24).

Tipos de datos numéricos exactos y aproximados

Los cuatro tipos de datos utilizados para almacenar datos decimales pueden dividirse en las categorías de exactos y aproximados. Los tipos de datos exactos son money, smallmoney, decimal, y numeric.

www.detodoprogramacion.com

Page 89: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 69

Los tipos de datos números aproximados son float y real. Un tipo de datos numérico exacto almacena el valor de precisión que le asigne. Un tipo de datos numérico aproximado, también conocido como un número de punto flotante es impreciso. Por ejemplo, si usted almacenó 1.0 en un tipo de datos decimal, siempre obtiene un valor de 1,0 y exactamente 1,0 sería utilizado dentro de cualquier cálculo que involucre el dato. Sin embargo, si almacenó 1.0 en un tipo de datos flota o real, podría ser almacenado como 1,000. . .1 o 0,999. . .9.

La arquitectura del procesador, Intel o AMD, también afectará a los valores que están almacenados en tipos de datos float o real. Si usted está utilizando tipos de datos float o real para realizar los cálculos, va a acumular errores de redondeo con cada cálculo realizado.

Si bien puede parecer extraño que el almacenamiento de datos en un tipo de datos donde el valor puede cambiar en función de la arquitectura del procesador o que recupere algo que no coincide exactamente con lo que está almacenado, los tipos de datos float y real se utilizan para una amplia gama de datos debido a la capacidad de almacenar números extremadamente grandes.

Tipos de datos decimales

Los tipos de datos Decimal tienen dos parámetros: uno de precisión y otro de escala. La precisión indica el número total de dígitos que se pueden almacenar tanto a la izquierda como de la derecha de la coma decimal. La escala indica el número máximo de dígitos a la derecha del punto decimal. Por ejemplo, un decimal (8,3) permite el almacenamiento de un total de 8 dígitos con 3 de los dígitos a la derecha del decimal o sea valores entre -99999,999 y 99.999,999.

El espacio de almacenamiento consumido por un tipo de datos decimal depende de la precisión y se define como muestra la Tabla 5-2.

TABLA 5-2 Almacenamiento tipos de datos decimal y numeric

Espacio de almacenamiento

5 bytes

9 bytes

13 bytes

17 bytes

Precisión

1 a 9

10 a 19

20 a 28

29 a 38

Datos de Carácter

Los tipos de datos character y numeric en general, representan más del 90 por ciento de todos los tipos de datos definidos dentro de una base de datos. La Tabla 5-3 en la página 70 muestra el espacio de almacenamiento consumido por tipos de datos basados en character .

www.detodoprogramacion.com

Page 90: Microsoft SQL Server 2008 Español - Mike Hotek

70 Parte II Diseñar bases de datos

TABLA 5-3 Tipos de datos de character

Espacio de almacenamiento

1 byte por carácter definido por n hasta un máximo de 8000 bytes

1 byte por carácter almacenado hasta un máximo de 8000 bytes

1 byte por carácter almacenado hasta un máximo de 2 GB

2 bytes por carácter definido por n hasta un máximo de 4000 bytes

2 bytes por carácter almacenado hasta un máximo de 4000 bytes

2 bytes por carácter almacenado hasta un máximo de 2 GB

Tipo de datos

char (n)

varchar (n)

texto

nchar (n)

nvarchar (n)

ntext

Nota Los tipo de datos text y ntext están obsoletos en SQL Server 2005. Usted no debería usarlos en cualquier nuevo desarrollo. Las tablas que tienen tipos de datos text o ntext deberían ser modificadas para utilizar varchar (max) / nvarchar (max) en su lugar

Datos de caracteres de longitud fija y variable

SQL Server le permite definir los datos de caracteres, ya sea como longitud fija o variable. El número de caracteres definidos establece el número máximo de caracteres que se permiten almacenar en una columna.

Cuando los datos se almacenan en un tipo de datos char o nchar, la cantidad de almacenamiento consumido es igual a la definición de almacenamiento del tipo de datos, independientemente del número de caracteres colocados en la columna. Cualquier espacio que no es consumido por los datos se rellena con espacios.

Cuando los datos se almacenan en un tipo de datos nvarchar o varchar, la cantidad de almacenamiento consumido es igual al número de caracteres efectivamente almacenados.

Datos Unicode

Los datos de caracteres se pueden almacenar usando un conjunto ANSI o uno de caracteres Unicode. El conjunto de caracteres ANSI abarca la mayor parte de los caracteres que se utilizan en la mayoría de los idiomas en todo el mundo. Sin embargo, ANSI sólo abarca un poco más de 32.000 caracteres. Varios idiomas como el árabe, el hebreo y algunos dialectos chinos contienen más de 32.000 caracteres del alfabeto estándar. Con el fin de almacenar la amplia gama de caracteres, se necesitan 2 bytes de almacenamiento para cada uno.

SQL Server le permite especificar si el almacenamiento de datos de una columna es Unicode o no Unicode. Los tipos de datos Unicode comienzan con una n y son nchar (n), nvarchar (n), y ntext.

Varchar (max) y nvarchar (max)

Antes de SQL Server 2005, hubo un conjunto de tipos de datos para almacenar los datos de caracteres que consumían hasta 8000 bytes de almacenamiento y un conjunto separado de tipos de datos para almacenar grandes volúmenes de caracteres de datos, de hasta 2 GB.

www.detodoprogramacion.com

Page 91: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 71

Cada conjunto de tipos de datos tiene diferentes restricciones y métodos variados para recuperar y manipular los datos. Para simplificar la gestión de datos de caracteres, los tipos de datos de caracteres de longitud variable se pueden definir con una longitud máxima de 8000 para varchar y 4000 para nvarchar o puede utilizar la palabra clave max que le permite a los tipos de datos varchar y nvarchar, almacenar hasta 2 GB de datos. Los tipos de datos Varchar (max) y nvarchar (max) soportan las mismas capacidades de programación como cualquier otra columna de caracteres de longitud variable.

Con la introducción de varchar (max) y nvarchar (max), los tipos de datos text y ntext han quedado en desuso.

En la siguiente práctica, se comparan las diferencias de almacenamiento entre un tipo de datos char y varchar.

Nota Discutiremos las variables y los lotes en el Capítulo 13, "Procedimientos almacenados", y la concatenación en el Capítulo 10, "Recuperación de datos". LAS Variables y la concatenación se utilizan aquí para demostrar la diferencia entre el almacenamiento de los tipos de datos char y varchar.

Comparar los Tipos de datos char (n) y varchar (n)

1. Abra una nueva ventana de consulta y ejecute el siguiente código (el código está en el archivo

“Capítulo 5\code2.sql” en los ejemplos que acompañan el presente libro):

DECLARE @fixedlength char(10), @variablelength varchar(10) SET @fixedlength = 'Test' SET @variablelength = 'Test' SELECT DATALENGTH(@fixedlength) SELECT DATALENGTH(@variablelength)

2. Observe la diferencia en la cantidad de espacio de almacenamiento consumido.

Los datos de fecha y hora

SQL Server proporciona varios tipos de datos para almacenar fechas y horas, como se muestra en la Tabla 5-4.

TABLA 5-4 Tipos de datos de fecha y hora

Rango de Valores

01/01/1900 hasta 06/06/2079

01/01/1753 a 12/31/9999

01/01/0001 a 12/31/9999

01/01/0001 a 12/31/9999

01/01/0001 a 12/31/9999

00:00:00.0000000 a

23:59:59.9999999

Tipo de datos

smalldatetime

datetime

datetime2

datetimeoffset

date

time

Precisión

1 minuto

0,00333 segundos

100 nanosegundos

100 nanosegundos

1 día

100 nanosegundos

Espacio de

almacenamiento

4 bytes

8 bytes

6 a 8 bytes

8 a 10 bytes

3 bytes

3 a 5 bytes

www.detodoprogramacion.com

Page 92: Microsoft SQL Server 2008 Español - Mike Hotek

72 Parte II Diseñar bases de datos

Los tipos de datos Smalldatetime y datetime almacenan ambos una fecha y una hora como un valor único. SQL Server 2008 introduce el tipo de datos datetime2 que debería sustituir tanto al tipo de datos smalldatetime y el datetime, debido a una mejor precisión, así como la capacidad de manejar un mayor rango de fechas.

El datetimeoffset le permite almacenar una zona horaria para aplicaciones que necesitan localizar fechas y horas.

Datos binarios

Los datos binarios se almacenan en un conjunto de cuatro tipos de datos, que se enumeran en la Tabla 5-5.

TABLA 5-5 Tipos de datos binarios

Rango de Valores

Null, 0 y 1

Fijo con datos binarios

Datos binarios de longitud variable

Datos binarios de longitud variable

Tipo de datos

bit

binary

varbinary

image

Espacio de almacenamiento

1 bit

Hasta 8000 bytes

Hasta 8000 bytes

Hasta 2 GB

Nota El tipo de datos image está obsoleto en SQL Server 2005. Usted no debería usar image en ningún nuevo desarrollo. Las tablas que tienen datos de tipo image deben ser modificados para usar varbinary (max) en su lugar.

Al igual que los tipos de datos caracteres de longitud variable, se puede aplicar la palabra clave max para el tipo de datos varbinary para permitir el almacenamiento de hasta 2 GB de datos, a la vez que soporta todas las funciones de programación disponibles para la manipulación de datos binarios.

XML

El tipo de datos “lenguaje de marcas extensibles” (Extensible Markup Language o XML) le permite almacenar y manipular documentos XML de forma nativa. Cuando almacena documentos XML, está limitado a un máximo de 2 GB así como un máximo de 128 niveles dentro de un documento.

Los documentos XML son útiles porque almacenan los datos y la estructura en un único archivo, que permite la transferencia de datos independiente de la plataforma. La estructura de un documento XML es llamado XML schema.

Además de definir una columna con un tipo de datos XML, también puede limitar los tipos de documentos XML

que están permitidos para ser almacenados dentro de la columna. Usted limita los tipos de documentos XML

creando una colección de esquemas XML y asociando la colección de esquema a la columna XML. Al insertar o actualizar un documento XML, se validará contra la colección de esquemas XML para asegurarse de que sólo está insertando documentos XML que cumplen con uno de los esquemas permitidos.

www.detodoprogramacion.com

Page 93: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 73

En la siguiente práctica, se creará una colección de esquemas que se utilizará como una restricción para validar documentos XML más adelante en este capítulo.

Crear una colección de esquemas XML

1. Abra una nueva ventana de consulta, cambie el contexto a la base de datos SQL2008SBS y ejecute el siguiente código (este se encuentra en el archivo “Capítulo 5\code3.sql” en los ejemplos que acompañan este libro):

CREATE XML SCHEMA COLLECTION ProductAttributes AS '<xsd:schema xmlns:schema="PowerTools" xmlns:xsd=http://www.w3.org/2001/XMLSchema xmlns:sqltypes=http://schemas.microsoft.com/sqlserver/2004/sqltypes targetNamespace="PowerTools" elementFormDefault="qualified"> <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" /> <xsd:element name="dbo.PowerTools"> <xsd:complexType> <xsd:sequence> <xsd:element name="Category"> <xsd:simpleType> <xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52"> <xsd:maxLength value="30" /> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Amperage"> <xsd:simpleType> <xsd:restriction base="sqltypes:decimal"> <xsd:totalDigits value="3" /> <xsd:fractionDigits value="1" /> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="Voltage"> <xsd:simpleType> <xsd:restriction base="sqltypes:char" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52"> <xsd:maxLength value="7" /> </xsd:restriction> </xsd:simpleType> </xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>''

www.detodoprogramacion.com

Page 94: Microsoft SQL Server 2008 Español - Mike Hotek

74 Parte II Diseñar bases de datos

Nota Por razones de brevedad en la página impresa, sólo se ha incluido un único esquema en el libro. El código en el CD que acompaña al capítulo 5 presenta una colección de esquemas más amplia, que

usted puede utilizar.

2. Ejecute la siguiente consulta para revisar la colección de esquemas XML recién creada.

SELECT * FROM sys.xml_schema_collections

Los datos FILESTREAM

Aunque las bases de datos se han diseñado para almacenar datos discretos, bien estructurados, de vez en cuando tendrá que almacenar grandes volúmenes de datos no estructurados denominados Blob (Binary Large Objects). En la mayoría de los casos, un BLOB es el contenido de un archivo.

Antes de SQL Server 2008, había que extraer el contenido del archivo y guardarlo en un tipo de datos varbinary (max), varchar (max), o nvarchar (max). Sin embargo, no se podía almacenar más de 2 GB de datos utilizando este método.

En otros casos, los administradores de bases de datos (DBAs) almacenan un nombre de archivo en una tabla, dejando el archivo en un directorio en el sistema operativo. El almacenamiento de los archivos fuera de la base de datos creó numerosos problemas con los nombres de archivo, para asegurarse que fueran sincronizados con las tablas y que las copias de seguridad del directorio también se sincronizaran con el contenido de la base de datos.

SQL Server 2008 introduce un nuevo método de almacenamiento llamado FILESTREAM. FILESTREAM combina lo mejor de ambos mundos. Los BLOBs almacenados en una columna FILESTREAM son controlados y mantenidos por SQL Server, sin embargo, los datos residen en un archivo en el sistema operativo. Mediante el almacenamiento de los datos en el sistema de archivos fuera de la base de datos, ya no se restringen al límite de 2 GB en BLOBs. Además, al hacer copia de seguridad de la base de datos, todos los archivos se copian en el mismo el tiempo, garantizando que el estado de cada archivo permanece sincronizado con la base de datos.

Nota Usted puede ver las referencias al nuevo tipo de datos en SQL Server 2008 llamado FILESTREAM. Técnicamente hablando, los datos de FILESTREAM se almacenan en una columna varbinary (max) con un atributo de FILESTREAM. Sin embargo, para los propósitos de este libro se hará referencia a una columna varbinary (max) con la propiedad FILESTREAM como un tipo de datos FILESTREAM debido al hecho de que el tipo de datos se comporta de manera muy diferente con la propiedad FILESTREAM.

Tipo de datos espaciales

Hay dos tipos de datos espaciales que se definen en SQL Server 2008: geometry y geography. Los datos Geometry están basados en la geometría euclidiana y se utilizan para almacenar puntos, líneas, curvas y polígonos. Los datos Geography se basan en un elipsoide y se utilizan para almacenar datos, tales como longitud y latitud.

www.detodoprogramacion.com

Page 95: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 75

Nota Los datos espaciales es un tema que va mucho más allá del alcance de este libro. Es posible escribir libros enteros sobre el uso y la manipulación de los datos espaciales en SQL Server. Para un inicio básico del uso de los datos espaciales, consulte de los Libros en pantalla el artículo "Tipos de datos espaciales".

Tipo de datos hierarchyid

El tipo de datos hierarchyID se utiliza para organizar los datos jerárquicos, como organigramas, listas de materiales, y diagramas de flujo. Mediante el empleo de un hierarchyid, puede buscar rápidamente los nodos dentro de una jerarquía, así como mover los datos entre los nodos dentro de la estructura.

Propiedades de columna

Puede aplicar varias propiedades a las columnas que afectan la forma en que se almacenan los datos o la forma en que la columna se comporta. Tres de las propiedades más comunes que se aplican a las columnas son: collation (intercalación), identidad y aceptación de valores NULL.

Como se vio en el capítulo 2, las secuencias de intercalación (collation), afectan la forma en que los datos de caracteres se comparan y se agregan. Puede especificar la secuencia de intercalación a nivel de columna mediante la palabra clave COLLATE junto con el nombre de la secuencia de intercalación que se aplica.

Se puede definir la propiedad IDENTIDAD (identity) sobre las columnas que tienen un tipo de datos numérico. Cuando se define la propiedad IDENTIDAD, conocida como una columna de identidad, SQL Server administra los valores de esta columna por usted. La definición de una identidad tiene dos parámetros, SEED e INCREMENT. El parámetro SEED (semilla), define el primer número que será asignado cuando se inserten datos en la tabla. El parametro INCREMENT (incremento), define el número que se añadirá al valor anterior para cada fila subsiguiente que se inserta en la tabla. Por ejemplo, una IDENTIDAD (1,2) iniciará en 1 y el incremento será de a 2 por cada nueva fila se inserta en la tabla, produciendo un conjunto de incremento de números impares.

Nulabilidad es la propiedad más común asignada a una columna. Cuando una columna se define como NOT NULL, se requiere un valor para asignar a la columna. Cuando una columna se define como NULL, usted no tiene que asignar un valor a la columna.

Nota Null es un concepto especial dentro de los sistemas de bases de datos que afecta a cualquier cálculo realizado contra los datos. Volveremos a ver el tema de los nulos varias veces a lo largo de este libro, y explicaremos una variedad de ventajas y limitaciones de los valores nulos.

www.detodoprogramacion.com

Page 96: Microsoft SQL Server 2008 Español - Mike Hotek

76 Parte II Diseñar bases de datos

Creación de tablas

El lenguaje T-SQL está dividido en dos categorías distintas de comandos: lenguaje de definición de datos (Data Definition Language -DDL) y Lenguaje de manipulación de datos (Data Manipulation Language - DML). Al crear, modificar y eliminar objetos dentro del motor de base de datos SQL Server, está utilizando comandos DDL.

Hay tres comandos básicos dentro DDL:

 

 

 

CREATE crea un objeto (por ejemplo, CREATE TABLE, CREATE INDEX, CREATE DATABASE )

ALTER modifica un objeto (por ejemplo, ALTER TABLE, ALTER INDEX, ALTER DATABASE )

DROP elimina un objeto (por ejemplo, DROP TABLE, DROP INDEX, DROP DATABASE )

Nota Puede encontrar la sintaxis específica para crear, modificar o eliminar cualquier objeto, en los Libros en pantalla.

En el siguiente ejercicio, comenzará con la creación de tablas para almacenar los clientes, pedidos, productos, y empleados.

Crear una tabla

1. Abra una nueva ventana de consulta, cambie el contexto a la base de datos SQL2008SBS y ejecute la siguiente consulta (el código es el que se encuentra en el archivo “Capítulo5\code4.sql en los ejemplos que se adjuntan al libro):

CREATE SCHEMA HumanResources dbo AUTORIZACIÓN

GO CREATE TABLE Customers.Customer (CustomerID INT IDENTITY(1,1), CompanyName VARCHAR(50) NULL, FirstName VARCHAR(50) NULL, LastName VARCHAR(50) NULL, ModifiedDate DATE NOT NULL) GO CREATE TABLE Customers.CustomerAddress (AddressID INT IDENTITY(1,1), AddressType VARCHAR(20) NOT NULL, AddressLine1 VARCHAR(50) NOT NULL, AddressLine2 VARCHAR(50) NULL, AddressLine3 VARCHAR(50) NULL, City VARCHAR(50) NOT NULL, StateProvince VARCHAR(50) NULL, Country VARCHAR(70) NULL) GO CREATE TABLE Orders.OrderHeader (OrderID INT IDENTITY(1,1), OrderDate DATE NOT NULL, SubTotal MONEY NOT NULL,

www.detodoprogramacion.com

Page 97: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas

TaxAmount MONEY NOT NULL, ShippingAmount MONEY NOT NULL, FinalShipDate DATE NULL) GO CREATE TABLE Orders.OrderDetail (OrderDetailID INT IDENTITY(1,1), SKU CHAR(10) NOT NULL, Quantity INT NOT NULL, UnitPrice MONEY NOT NULL, ShipDate DATE NULL) GO CREATE TABLE Products.Product (ProductID INT IDENTITY(1,1), ProductName VARCHAR(50) NOT NULL, ProductCost MONEY NOT NULL, ListPrice MONEY NOT NULL, ProductDescription XML NULL) GO CREATE TABLE HumanResources.Employee (EmployeeID INT IDENTITY(1,1), FirstName VARCHAR(50) NOT NULL, LastName VARCHAR(50) NOT NULL, JobTitle VARCHAR(50) NOT NULL, BirthDate DATE NOT NULL, HireDate DATE NOT NULL) GO CREATE TABLE HumanResources.EmployeeAddress (AddressID INT IDENTITY(1,1), AddressType VARCHAR(20) NOT NULL, AddressLine1 VARCHAR(50) NOT NULL, AddressLine2 VARCHAR(50) NULL, AddressLine3 VARCHAR(50) NULL, City VARCHAR(50) NOT NULL, StateProvince VARCHAR(50) NULL, Country VARCHAR(70) NULL) GO

77

2. Expanda el nodo Tablas en el Explorador de objetos de la base de datos SQL2008SBS y vea las tablas que acaba de crear.

Columnas calculadas

SQL Server le permite almacenar datos en columnas de tabla, como se describe en este capítulo. SQL Server también permite construir un cálculo e incluirlo como una columna en una tabla. Cuando se agrega una columna calculada en una tabla, SQL Server almacena solamente el cálculo. Cada vez que se recupera la columna calculada, SQL Server realiza el cálculo requerido y devuelve los resultados como parte de la consulta.

www.detodoprogramacion.com

Page 98: Microsoft SQL Server 2008 Español - Mike Hotek

78 Parte II Diseñar bases de datos

La tabla Orders.OrderHeader que creó anteriormente podría hacer uso de una columna calculada para calcular el importe total del pedido.

Nota A menos que se especifique explícitamente un nombre de base de datos diferente, se debe asumir que todas las consultas que se ejecuten se producirán contra la base de datos SQL2008SBS.

Crear una tabla con una columna calculada

1. Abra una nueva ventana de consulta y ejecute el siguiente código (el código está en el archivo

Capítulo 5\code5.sql en los ejemplos que acompañan el libro):

DROP TABLE Orders.OrderHeader GO

CREATE TABLE Orders.OrderHeader (OrderID INT IDENTITY(1,1), OrderDate DATE NOT NULL, SubTotal MONEY NOT NULL, TaxAmount MONEY NOT NULL, ShippingAmount MONEY NOT NULL, GrandTotal AS (SubTotal + TaxAmount + ShippingAmount), FinalShipDate DATE NULL)

GO

2. Expanda el nodo para la tabla Orders.OrderHeader y observe la definición de la nueva columna.

Añadir una columna calculada a una tabla existente

1. Ejecute el código siguiente para agregar la columna calculada ProductMargin a la tabla Products.Product (el código está en el archivo Capítulo 5\code6.sql en los ejemplos que acompañan el libro):

ALTER TABLE Products.Product ADD ProductMargin AS (ListPrice – ProductCost)

GO

Columnas escasas (Sparse Columns)

Con frecuencia, las tablas incluirán columnas que permiten valores NULL. A pesar de que una columna permite valores NULL, los valores NULL dependiendo de la definición de tipo de datos, pueden consumir una cantidad significativa de espacio de almacenamiento Cuando en una tabla se espera que tenga un número muy pequeño de filas con un valor en una columna en particular, usted debería designar a la columna con la propiedad SPARSE con el fin de minimizar el espacio de almacenamiento.

Si bien estamos permitiendo tres líneas de dirección para soportar un más amplio rango de direcciones posibles, las columnas AddressLine2 y AddressLine3 de las tablas Customers.CustomerAddress y HumanResources.EmployeeAddress deberían ser designadas como SPARSE.

www.detodoprogramacion.com

Page 99: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 79

Configurar el almacenamiento “Sparse” para una tabla

1. Ejecutar el siguiente código (el código está en el archivo Capítulo5\code7.sql en los ejemplos que acompañan el libro):

DROP TABLE Customers.CustomerAddress GO CREATE TABLE Customers.CustomerAddress (AddressID INT IDENTITY(1,1), AddressType VARCHAR(20) NOT NULL, AddressLine1 VARCHAR(50) NOT NULL, AddressLine2 VARCHAR(50) SPARSE NULL, AddressLine3 VARCHAR(50) SPARSE NULL, City VARCHAR(50) NOT NULL, StateProvince VARCHAR(50) NULL, Country VARCHAR(70) NULL, CONSTRAINT pk_customeraddress PRIMARY KEY (AddressID)) GO DROP TABLE HumanResources.EmployeeAddress GO CREATE TABLE HumanResources.EmployeeAddress (AddressID INT IDENTITY(1,1), AddressType VARCHAR(20) NOT NULL, AddressLine1 VARCHAR(50) NOT NULL, AddressLine2 VARCHAR(50) SPARSE NULL, AddressLine3 VARCHAR(50) SPARSE NULL, City VARCHAR(50) NOT NULL, StateProvince VARCHAR(50) NULL, Country VARCHAR(70) NULL, CONSTRAINT pk_employeeaddress PRIMARY KEY (AddressID)) GO

Restricciones (Constraints)

Las restricciones se utilizan dentro de SQL Server para definir elementos estructurales que limitan los datos y hacen cumplir la consistencia. Las restricciones que están disponibles en SQL Server son: clave primaria (primary key), valor único (unique), valor por defecto (default), y la clave externa o foránea (foreign key).

Claves Primarias

La clave primaria es una limitación fundamental en el diseño correcto de una base de datos. Una clave principal define la columna o columnas que identifican de forma exclusiva cada fila de la tabla. Si bien puede agregar datos a una tabla (INSERT) sin una clave principal, es imposible modificar o eliminar una sola fila de datos si no se puede definir de forma exclusiva.

www.detodoprogramacion.com

Page 100: Microsoft SQL Server 2008 Español - Mike Hotek

80 Parte II Diseñar bases de datos

Nota Mientras que hay un número muy pequeño de excepciones específicas, cada tabla en una base de datos debería tener una clave primaria.

En los siguientes ejercicios, usted ampliará las tablas ya creadas en este capítulo definiendo una restricción de clave primaria desde la creación de la tabla, y también agregará una restricción primary key, después que una tabla es creada.

Crear una tabla con una clave principal

1. Ejecutar el siguiente código (el código está en el archivo “Capítulo5\code8.sql” en los ejemplos que acompañan este libro):

DROP TABLE Customers.Customer GO CREATE TABLE Customers.Customer (CustomerID INT IDENTITY(1,1), CompanyName VARCHAR(50) NULL, FirstName VARCHAR(50) NULL, LastName VARCHAR(50) NULL, ModifiedDate DATE NOT NULL, CONSTRAINT pk_customer PRIMARY KEY (CustomerID)) GO DROP TABLE Customers.CustomerAddress GO CREATE TABLE Customers.CustomerAddress (AddressID INT IDENTITY(1,1), AddressType VARCHAR(20) NOT NULL, AddressLine1 VARCHAR(50) NOT NULL, AddressLine2 VARCHAR(50) NULL, AddressLine3 VARCHAR(50) NULL, City VARCHAR(50) NOT NULL, StateProvince VARCHAR(50) NULL, Country VARCHAR(70) NULL, CONSTRAINT pk_customeraddress PRIMARY KEY (AddressID)) GO DROP TABLE Orders.OrderHeader GO CREATE TABLE Orders.OrderHeader (OrderID INT IDENTITY(1,1), OrderDate DATE NOT NULL, SubTotal MONEY NOT NULL, TaxAmount MONEY NOT NULL, ShippingAmount MONEY NOT NULL, GrandTotal AS (SubTotal + TaxAmount + ShippingAmount), FinalShipDate DATE NULL, CONSTRAINT pk_orderheader PRIMARY KEY (OrderID)) GO

www.detodoprogramacion.com

Page 101: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 81

Agregar una clave principal a una tabla existente

1. Ejecutar el siguiente código (el código está en el archivo Capítulo5\ code9.sql):

ALTER TABLE Orders.OrderDetail ADD CONSTRAINT pk_orderdetail PRIMARY KEY (OrderDetailID) GO ALTER TABLE Products.Product ADD CONSTRAINT pk_product PRIMARY KEY (ProductID) GO ALTER TABLE HumanResources.Employee ADD CONSTRAINT pk_employee PRIMARY KEY (EmployeeID) GO

Restricciones UNIQUE

La restricción unique se utiliza para definir la columna o columnas que son requeridas para ser única/s dentro de una tabla. Una restricción de unicidad evitará la duplicación de datos en una tabla. Mientras que una clave principal también define la unicidad para una columna o columnas, hay dos diferencias importantes entre una restricción única y una clave primaria:

1. Una tabla sólo puede tener una clave primaria.

2. Una clave principal no permite valores nulos.

Usted puede crear varias restricciones UNIQUE en una tabla. Aunque una restricción de unicidad permite valores nulos, sólo una fila en la tabla puede tener un valor nulo. Si se define el índice único a través de más de una columna, sólo puede tener una sola aparición de cada combinación de un nulo dentro de cada columna definida por la restricción única.

Los productos de nuestra compañía pueden tener múltiples manuales asociados con ellos. Dado que algunos manuales de producto pueden ser muy grandes, es mucho más eficiente almacenar cada manual en el sistema operativo por medio de la capacidad de FILESTREAM en SQL Server. El dato FILESTREAM requiere una restricción unique en una columna.

Crear una tabla con una restricción UNIQUE

1. Ejecute el siguiente código para agregar una tabla Products.ProductDocument a la base de datos

(El código está en el archivo Capítulo 5\code10.sql):

CREATE TABLE Products.ProductDocument (DocumentID UNIQUEIDENTIFIER ROWGUIDCOL UNIQUE, DocumentType VARCHAR(20) NOT NULL, Document VARBINARY(MAX) FILESTREAM NULL, CONSTRAINT pk_productdocument PRIMARY KEY(DocumentID)) GO

www.detodoprogramacion.com

Page 102: Microsoft SQL Server 2008 Español - Mike Hotek

82 Parte II Diseñar bases de datos

Restricciones CHECK

La restricción check le permite restringir el rango de valores que se permiten en una columna dentro de una tabla. Por ejemplo, su empresa no le permite a un cliente pedir una orden con una cantidad negativa. Las tablas Orders.OrderHeader, Orders.OrderDetail y Products.Product previamente creadas, permiten datos que infringen las reglas de negocio. En el siguiente ejercicio, utilizará restricciones de comprobación para asegurarse que:

 

 

Las cantidades y los precios sean mayores que 0

Los importes de los impuestos y los gastos de envío no sean negativos

Crear una tabla con una restricción CHECK

1. Ejecute el siguiente código (el código está en el archivo Capítulo5\ code11.sql):

DROP TABLE Products.Product GO CREATE TABLE Products.Product (ProductID INT IDENTITY(1,1), ProductName VARCHAR(50) NOT NULL, ProductCost MONEY NOT NULL CHECK (ProductCost > 0), ListPrice MONEY NOT NULL CHECK (ListPrice > 0), ProductMargin AS (ListPrice – ProductCost), ProductDescription XML NULL, CONSTRAINT pk_product PRIMARY KEY (ProductID)) GO ALTER TABLE Orders.OrderHeader WITH CHECK

ADD CONSTRAINT ck_subtotal CHECK (SubTotal > 0)

ALTER TABLE Orders.OrderHeader WITH CHECK

ADD CONSTRAINT ck_taxamount CHECK (TaxAmount >= 0)

ALTER TABLE Orders.OrderHeader WITH CHECK ADD CONSTRAINT ck_shippingamount CHECK (ShippingAmount >= 0)

GO ALTER TABLE Orders.OrderDetail WITH CHECK

ADD CONSTRAINT ck_quantity CHECK (Quantity >= 0) ALTER TABLE Orders.OrderDetail WITH CHECK

ADD CONSTRAINT ck_unitprice CHECK (UnitPrice > 0) GO

2. Abra el nodo Restricciones (constraints) debajo de cada tabla en el Explorador de objetos para ver los resultados.

Restricciones DEFAULT

La restricción default se utiliza para especificar un valor “por omisión” para una columna , cuando un usuario no le pasa ningún valor a esa columna. Los usos más comunes de un valor por defecto son cuando se suele asignar un determinado valor a una columna.

www.detodoprogramacion.com

Page 103: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas 83

Si se define una columna como NOT NULL, debe asignarle un valor a la columna, a menos que se haya definido una restricción DEFAULT en la columna, si es así, asignar un valor a esa columna es opcional.

Nota Un default sólo es eficaz cuando inicialmente se agregan datos a la tabla.

Nuestras tablas clientes y ordenes tienen columnas de tipo fecha que se llenan de un modo muy estándar. Cuando se crea una fila de cliente, la columna ModifiedDate reflejará la fecha actual, tal como la columna OrderDate normalmente reflejará la fecha actual.

Crear una tabla con una restricción DEFAULT

1. Ejecute el siguiente código (que se encuentra en el archivo Capítulo5\ code12.sql):

DROP TABLE Customers.Customer GO CREATE TABLE Customers.Customer (CustomerID INT IDENTITY(1,1), CompanyName VARCHAR(50) NULL, FirstName VARCHAR(50) NULL, LastName VARCHAR(50) NULL, ModifiedDate DATE NOT NULL CONSTRAINT df_modifieddate DEFAULT GETDATE(), CONSTRAINT pk_customer PRIMARY KEY (CustomerID)) GO DROP TABLE Orders.OrderHeader GO CREATE TABLE Orders.OrderHeader (OrderID INT IDENTITY(1,1), OrderDate DATE NOT NULL CONSTRAINT df_orderdate DEFAULT GETDATE(), SubTotal MONEY NOT NULL CONSTRAINT ck_subtotal CHECK (SubTotal > 0), TaxAmount MONEY NOT NULL CONSTRAINT ck_taxamount CHECK (TaxAmount >= 0), ShippingAmount MONEY NOT NULL CONSTRAINT ck_shippingamount

CHECK (ShippingAmount >= 0), GrandTotal AS (SubTotal + TaxAmount + ShippingAmount), FinalShipDate DATE NULL, CONSTRAINT pk_orderheader PRIMARY KEY (OrderID)) GO

Las claves externas

La restricción foreign key es similar a una restricción check en que se hace cumplir un rango de valores que se permiten en una columna. Una restricción check saca los límites de los datos a través del uso de un valor estático o una función. Los límites de una clave externa provienen del uso de una tabla.

www.detodoprogramacion.com

Page 104: Microsoft SQL Server 2008 Español - Mike Hotek

84 Parte II Diseñar bases de datos

El conjunto de tablas que se han creado hasta ahora, si bien nos permiten capturar los datos, tienen algunos defectos fundamentales:

  Si bien podemos definir un cliente y almacenar el pedido de un cliente, no sabemos una orden concreta a que cliente pertenece.

No sabemos a qué orden pertenece un conjunto dado de ítems.

No sabemos a qué cliente o empleado está asociada una dirección.

 

 

Adicionalmente, nuestra estructura de tabla permite una cierta inconsistencia de datos, incluso cuando existe un conjunto de valores bien definidos. De acuerdo con nuestra estructura actual de la tabla, a todos los tipos de países, estado/provincia, y direcciones se les permite tener cualquier conjunto de valores que una aplicación defina, a pesar de que la lista de valores permitidos esté bien definida. El término general usado para un conjunto de tablas que definen una lista de valores reconocidos para hacer cumplir la consistencia de datos es “tabla de consulta” o “lookup table”. Usted puede ver a las lookup table como un conjunto de tablas que definen el rango de valores que son permitidos para los distintos elementos y por lo general son la fuente fundamental de listas desplegables dentro una aplicación (combos).

Una clave externa hace cumplir lo que se conoce como una relación padre-hijo. Por ejemplo, un cliente hace un pedido. En este ejemplo, la tabla primaria es el cliente, ya que define el cliente al que el pedido está asociado. Con el fin de crear una clave externa, debe tener definida una clave principal en la tabla principal.

Para solucionar nuestros problemas de asociación de datos, así como limitar el rango de valores conocidos, vamos a definir lookup tables y foreign keys.

Nota El siguiente ejemplo contiene una pequeña porción de las modificaciones de clave externa que son necesarias dentro de la base de datos que estamos creando. El código que acompaña este libro tiene un script que creará las versiones finales de todas las tablas dentro de nuestra base de datos.

Agregar una clave externa a una tabla existente

1. Ejecute el siguiente código (que está en el archivo Capítulo5\ code13.sql):

CREATE TABLE LookupTables.Country (CountryID INT IDENTITY(1,1), CountryName VARCHAR(70) NOT NULL UNIQUE, CONSTRAINT pk_country PRIMARY KEY(CountryID)) GO CREATE TABLE LookupTables.StateProvince (StateProvinceID INT IDENTITY(1,1), CountryID INT NOT NULL, StateProvince VARCHAR(50) NOT NULL UNIQUE, StateProvinceAbbrev CHAR(2) NOT NULL,

www.detodoprogramacion.com

Page 105: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 5 Diseño de Tablas

CONSTRAINT pk_stateprovince PRIMARY KEY(StateProvinceID)) GO ALTER TABLE LookupTables.StateProvince

ADD CONSTRAINT fk_countrytostateprovince FOREIGN KEY (CountryID) REFERENCES LookupTables.Country(CountryID)

GO

85

Diagramas de bases de datos

En este capítulo, se ha creado una base de datos relativamente simple que define una porción pequeña de

una empresa típica que tiene clientes y toma los pedidos de productos. Sin embargo, probablemente encontrará difícil recordar todas las tablas que ha creado y las asociaciones entre las tablas. Afortunadamente, SSMS tiene una característica llamada diagramas de base de datos que le permite ver una base de datos o un subconjunto de una base de datos gráficamente.

El siguiente ejercicio le mostrará cómo generar un diagrama de base de datos para la base de datos que acaba de crear.

Nota La primera vez que se crea un diagrama de base de datos en una base de datos, recibirá un mensaje sobre la creación de objetos de apoyo. Haga clic en Sí para crear los objetos de soporte.

Crear un diagrama de base de datos

1. Haga clic derecho en el nodo de base de datos y seleccione Nuevo Diagrama de Base de Datos.

2. Seleccione todas las tablas en el cuadro de diálogo “Agregar tabla”, haga clic en Agregar y, a continuación, haga clic en Cerrar.

3. Una vez que las tablas han sido añadidas, revise la estructura de su base de datos.

www.detodoprogramacion.com

Page 106: Microsoft SQL Server 2008 Español - Mike Hotek

86 Parte II Diseñar bases de datos

Nota Los diagramas de base de datos le dan una visión básica de una base de datos. Hay que tener mucho cuidado, porque un diagrama de base de datos tiene un enlace directo a la base de datos subyacente. Los diagramas de bases de datos le permiten realizar cambios en la base de datos, pero salvando estos cambios hace modificaciones a la base de datos real y no sólo a la del gráfico. Cuando diseña una base de datos, usted debería utilizar una herramienta de modelado de datos, como Visio for Enterprise Architects.

Capítulo 5 Referencia Rápida

Para

Diseñar una base de datos

Crear un esquema

Definir una columna de incremento automático

Optimizar el almacenam. de una columna cuando un gran porcentaje de filas pueden ser nulas

Identificar de forma única las filas de una tabla

Únicamente restringir los valores de datos en una columna

Restringir el rango de valores permitidos en una columna

Almacenar un cálculo sin la necesidad de

almacenar los resultados del cálculo

Haga lo siguiente

Ponga las cosas donde corresponde

Utilice el comando CREATE SCHEMA

Especifique un tipo de datos numérico con la propiedad IDENTITY

Especifique la opción SPARSE para la columna

Utilice una restricción de clave PRIMRY KEY

Utilice una restricción UNIQUE

Utilice una restricción CHECK para los límites de datos definidos por un valor, fórmula o función

Utilice una FOREIGN KEY para límites de datos definidos por una tabla

Utilice una columna calculada

www.detodoprogramacion.com

Page 107: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6

Índices

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

 

 

Comprender la estructura de los índices

Crear índices agrupados y no agrupados (clustered and nonclustered)

Crear índices con columnas incluidas (included columns)

Crear índices de cobertura (covering indexes)

Crear índices filtrados (filtered indexes)

Crear índices XML

Administrar índices y ocuparse de la fragmentación del índice

Los índices se utilizan para mejorar el rendimiento de las consulta de datos. En un mundo perfecto, podría crear un gran número de índices para satisfacer todas las permutaciones de consultas que el usuario puede crear. Sin embargo, los índices deben mantenerse. Cuando los datos se insertan, actualizan o eliminan, los índices deben ser recalculados. La creación de índices debe ser equilibrada, de modo que pueda crear índices suficientes para mejorar las consultas, al tiempo que garantiza un impacto mínimo sobre las modificaciones a los datos.

En este capítulo, usted aprenderá cómo crear los distintos tipos de índices que SQL Server 2008 soporta.

Estructura de Índice

SQL Server no necesita tener los índices en una tabla para recuperar datos. Una tabla puede simplemente ser escaneada para encontrar la porción de datos que se solicita. Por desgracia, los usuarios quieren almacenar grandes cantidades de datos en una tabla y ser capaz de recuperar los datos al instante.

Los índices no son un concepto nuevo, los usamos todos los días. Si nos fijamos en la parte trasera de este libro, usted encontrará un índice en forma impresa. Si usted quiere leer acerca del tema “partición”, puede encontrar la información de dos maneras diferentes. Usted puede abrir este libro, comenzar en la página 1, y escanear cada página hasta que llegó el Capítulo 7, "Particionamiento", y ubicar la información específica que necesitaba. También puede abrir el índice al final del libro, buscar “particionamiento”, y luego ir a la página correspondiente del libro. Ambas lograran su objetivo, pero utilizar el índice le permitirá localizar la información que desea, observando el menor número de páginas posible.

Un índice es útil solamente si puede proporcionar un medio para encontrar datos muy rápidamente, independientemente del volumen de datos que se almacenan. Eche un vistazo al índice en la parte posterior de este libro.

87

www.detodoprogramacion.com

Page 108: Microsoft SQL Server 2008 Español - Mike Hotek

88 Parte II Diseñar bases de datos

El índice contiene sólo una muestra muy pequeña de las palabras en el libro, lo que proporciona una forma mucho más compacta para buscar información. El índice está organizado por orden alfabético, una manera natural de los seres humanos para trabajar con palabras, la cual permite eliminar un gran porcentaje de las

páginas en el índice para encontrar la información que necesita. Además, le permite escanear hasta encontrar el término que está buscando, y después de encontrar la palabra, usted sabe que no tiene que buscar más. SQL Server organiza los índices de una manera muy similar.

Los árboles balanceados (B-trees)

La estructura que SQL Server utiliza para construir y mantener los índices se llama árbol balanceado (B-tree). Un ejemplo de un árbol B se muestra en la Figura 6-1.

Raíz

Intermedio

Hoja

FIGURA 6-1 Estructura del B-árbol

Un árbol B está construido de un nodo raíz que contiene una sola página de datos, cero o más niveles intermedios y un nivel de hoja. El concepto básico de un árbol B es la primera palabra de su nombre “balanceado”. Un B-tree es siempre simétrico. Siempre habrá el mismo número de páginas en ambas las mitades izquierda y derecha de un árbol-B, en cada nivel dentro del mismo.

Las páginas de nivel hoja contienen entradas ordenadas en el orden que usted especificó. Los datos en el nivel hoja contienen todas las combinaciones de valores de la columna (s) que han sido indexadas. El número de filas de índice en una página está determinado por el espacio de almacenamiento requerido por las columnas que se definieron en el índice.

Nota Las páginas en SQL Server pueden almacenar hasta 8060 bytes de datos. Por lo tanto, un índice creado en una columna con un tipo de datos INT puede almacenar 2015 valores en una sola página en el índice, mientras que una columna con un tipo de dato datetime2 sólo puede almacenar la mitad de muchos valores, o 1007 valores por página.

Los niveles raíz e intermedios del índice, se construyen tomando la primera entrada de cada página en el nivel inferior, junto con un puntero a la página desde la que provienen los valores de los datos, como se muestra en la Figura 6-2.

www.detodoprogramacion.com

Page 109: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6 Índices

City1 City62 City121 City190

89

City1 City34

City62 City93

City121 City150

City190 City220

City1 City27

City34 City61

City62 City89

City93 City120

City121 City148

City150 City177

City190 City217

City220 City247

FIGURA 6-2 La construcción de los niveles intermedio y raíz

Una consulta comienza con la página raíz y escanea la página hasta que encuentre una página que contiene el valor que se busca en. A continuación, utiliza el puntero de página para saltar al siguiente nivel y escanea las filas de esa página hasta que encuentra una página que contiene los datos que se buscan. A continuación, salta al siguiente nivel y repite el proceso, moviéndose a través de los niveles subsiguientes hasta que alcanza el nivel de la raíz del índice. En este punto, la consulta ha localizado los datos requeridos. (N del T: Creo que hay un error en la versión en ingles y donde dice “root level” debería decir “leaf level” o sea que se alcanza el nivel hoja).

Por ejemplo, si usted está buscando City132, la consulta se iniciará en el nivel raíz y escaneará las filas. Dado que City132 cae entre City121 y City190, SQL Server sabe que City132 posiblemente se pueda encontrar en la página que comienza con City121. SQL Server entonces se moverá a la página de nivel intermedio que comienza con City121. Al escanear la página, SQL Server de nuevo determina que City132 se encuentra entre City121 y City150, SQL Server entonces se mueve a página a nivel de hoja que inicia con City121. La página se escanea hasta que se encuentra City132 y dado que esta es una página de nivel hoja, no hay más páginas que transitar para localizar los datos requeridos. Si City132 no existe en la tabla, SQL Server no encuentra una entrada para City132 y tan pronto como lee la entrada de City133, se sabe que el valor de City132 no figura más abajo en la página y la consulta devolverá “sin resultados”. Usted debe notar en la estructura anterior, que SQL Server sólo tendrá que leer un máximo de tres páginas para localizar cualquier ciudad dentro de la base de datos.

Esto es lo que significa tener un árbol de equilibrado. Cada búsqueda que se lleva a cabo siempre transitará el mismo número de niveles en el índice, así como el mismo número de páginas en el índice para localizar la porción de datos que le interesa.

Niveles de indexación

El número de niveles de un índice y el número de páginas dentro de cada nivel de un índice son determinados por simples matemáticas. Una página de datos en SQL Server tiene 8192 bytes de tamaño, de los cuales se pueden utilizar para almacenar hasta 8060 bytes de datos de usuario reales. Basándose en el número de bytes requerido para almacenar una clave de índice, determinado por el tipo de datos, se puede calcular el número de filas por página que se almacenan, por simple división.

www.detodoprogramacion.com

Page 110: Microsoft SQL Server 2008 Español - Mike Hotek

90 Parte II Diseñar bases de datos

El siguiente ejemplo describe no sólo cómo se construye un índice, sino además los cálculos del tamaño para un índice. Este ejemplo le dará una idea del valor que tiene un índice para encontrar datos dentro de tablas muy grandes, y le explicará por qué la cantidad de tiempo para encontrar una porción de datos no varía tanto cuando el tamaño de una base de datos se incrementa dramáticamente. Por supuesto, la cantidad de tiempo para localizar los datos depende también de escribir consultas eficientes, tema que se tratará en la Parte III, "Recuperar y manipular datos", capítulos 8-11.

Si se construye un índice en una columna INT, cada fila de la tabla requiere 4 bytes de almacenamiento en el índice.

Si sólo hay 1.200 filas de datos en la tabla, usted necesitaría 4.800 bytes de almacenamiento. Debido a que todas las entradas caben en una sola página de datos, el índice tendría una sola página que sería la página raíz, así como la página hoja. De hecho, puede almacenar 2.015 filas en la tabla y aun seguirían localizándose en una sola página para el índice.

Tan pronto como se agrega la fila número 2.016, todas las entradas ya no caben en una sola página, por lo que se asignan dos páginas adicionales al índice. La ya existente página "raíz" se empuja hacia abajo en el índice para convertirse en una página de nivel hoja. Una de las nuevas páginas asignadas se convierte en la nueva página de nivel raíz. SQL Server, a continuación toma los datos de la segunda mitad de la página previamente existente y los mueve a la segunda página nueva que se asigna y se coloca en el nivel de hoja. El paso final en el proceso es tomar la primera entrada de cada una de las páginas de nivel hoja y escribir las entradas a la nueva página raíz. Este proceso crea un índice con una página raíz y dos páginas de nivel hoja. En este índice no es necesario un nivel intermedio debido a que la página raíz puede contener todos los valores de las primeras entradas de las páginas de nivel hoja. En este punto, la localización de cualquier fila de la tabla requiere examinar exactamente dos páginas en el índice.

Nota El proceso por el que SQL Server asigna una nueva página y mueve la mitad de los datos desde una página completa a una nueva página se conoce como división de página (page splitting). Tenga en cuenta que las filas en una página de índice se mantienen en forma ordenada, por lo que SQL Server siempre escribirá las nuevas entradas en la ubicación ordenada correctamente. Esto puede hacer que las filas para moverse entre una página y otra se dividan y puede ocurrir a cualquier nivel dentro de la estructura de almacenamiento. Para una explicación más detallada de las estructuras de almacenamiento y división de páginas, consulte SQL Server 2008 Internals escrito por Kalen Delaney.

Puede seguir añadiendo filas a la tabla sin afectar el número de niveles en el índice hasta llegar a 4.060.225 filas. A continuación, tiene 2.015 páginas de nivel hoja con 2.015 entradas cada uno. La página raíz tendrá 2.015 entradas correspondientes a la primera fila en cada una de las páginas de nivel hoja. Cuando la fila número 4.060.226 de datos se añade a la tabla, debe ser asignada otra página al índice en el nivel hoja, pero la página raíz no puede contener 2.016 entradas porque superaría los 8.060 bytes que se permiten. Así SQL Server pasará por el mismo proceso se ha explicado anteriormente, donde dos páginas nuevas se asignan al índice. La anterior página de nivel raíz ahora se convertiría en una página de nivel intermedio junto con una nueva página que también será asignada al nivel intermedio. La previamente conocida página "raíz" se someterá a una división de página para mover la mitad de las entradas a la recién creada página de nivel intermedio. La primera entrada en cada una de las dos páginas de nivel intermedio se escribe en la nueva página raíz recién asignada.

www.detodoprogramacion.com

Page 111: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6 Índices 91

La próxima vez que se necesitará un nuevo nivel intermedio, será cuando se agregué la fila número 8181353376 a la tabla. 2.015 filas de la página raíz corresponden a 2.015 páginas el nivel intermedio, cada una de las cuales tiene 2.015 entradas correspondientes a las 2.015 páginas al nivel hoja más una fila adicional de datos que no cabría.

Como se puede ver, este tipo de estructura permite a SQL Server buscar muy rápidamente filas en tablas extremadamente grandes. En este ejemplo, la búsqueda de una fila de la tabla con un poco más de 4 millones de filas requiere que SQL Server analice sólo dos páginas de datos y la tabla puede crecer hasta más de 8 mil millones de filas antes que SQL Server requiera leer tres páginas para encontrar cualquier fila.

Índices agrupados Un índice se puede definir mediante una o más columnas de la tabla, la clave de índice, con la siguientes restricciones:

 

 

Se puede definir un índice con un máximo de 16 columnas

El tamaño máximo de la clave de índice es de 900 bytes

La columna (s) definida para el índice agrupado (clustered index) se conocen como la clave de agrupación (clustering key). Un índice clúster es especial porque él hace que SQL Server ordene los datos de la tabla de acuerdo con la clave de agrupación. Debido a que una tabla no puede ser ordenada de más de una forma, se puede definir un solo índice agrupado en una tabla..

Nota Una tabla sin un índice agrupado se denomina “montón” (heap). Como una regla general, cada tabla debería tener un índice agrupado. Una de las razones principales para crear un índice cluster en cada tabla es eliminar los punteros de reenvío. Los punteros de reenvío están mucho más allá del alcance de este libro. Para obtener más información acerca de punteros de reenvío y los efectos perjudiciales sobre el rendimiento de las consultas, por favor consulte Inside SQL Server 2005: Query Tuning and Optimization por Kalen Delaney.

La sintaxis general para la creación de un índice relacional es la siguiente:

CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name ON <object> ( column [ ASC | DESC ] [ ,...n ] ) [ INCLUDE ( column_name [ ,...n ] ) ] [ WHERE <filter_predicate> ] [ WITH ( <relational_index_option> [ ,...n ] ) ] [ ON { partition_scheme_name ( column_name )

| filegroup_name | default

} ] [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ][ ; ]

www.detodoprogramacion.com

Page 112: Microsoft SQL Server 2008 Español - Mike Hotek

92 Parte II Diseñar bases de datos

Usted puede recordar que las secuencias de comandos de creación de tablas que utilizamos en el capítulo 5, "Diseño de tablas", tenía una palabra clave de "clúster" en la especificación de una clave principal. Aunque una clave primaria es una restricción, SQL Server físicamente implementa una clave principal como un índice. Debido a que la opción por defecto para una clave principal es clustered, SQL Server crea un índice agrupado para una clave primaria. Del mismo modo, una restricción única (unique) está físicamente implementada como un índice único. Puesto que una clave primaria es también única, de forma predeterminada, SQL Server implementa físicamente cada clave primaria como un índice agrupado único.

Nota Los esquemas de partición se discutirán en detalle en el Capítulo 7.

En la práctica que sigue, va a crear índices agrupados en las tablas OrderHeader y OrderDetail creadas anteriormente en el capítulo 5. Como ya hemos creado claves primarias en las tablas OrderHeader y OrderDetail utilizando las opciones por defecto, primero eliminará y volverá a crear las claves primarias como “no agrupados” con el fin de crear después el único índice cluster permitido por cada tabla.

Crear un índice agrupado

1. Ejecute el código siguiente en la base de datos SQL2008SBS (el código está en el archivo Capítulo 6\code1.sql):

—Must drop foreign key first, because it depends on the primary key ALTER TABLE Orders.OrderDetail

DROP CONSTRAINT fk_orderheadertoorderdeatils GO —Change the existing primary keys to nonclustered ALTER TABLE Orders.OrderHeader

DROP CONSTRAINT pk_orderheader GO ALTER TABLE Orders.OrderHeader

ADD CONSTRAINT pk_orderheader PRIMARY KEY NONCLUSTERED (OrderID) GO ALTER TABLE Orders.OrderDetail

DROP CONSTRAINT pk_orderdetail GO ALTER TABLE Orders.OrderDetail

ADD CONSTRAINT pk_orderdetail PRIMARY KEY NONCLUSTERED (OrderDetailID) GO —Recreate the foreign key (fix the misspelling from chapter 5) ALTER TABLE Orders.OrderDetail

ADD CONSTRAINT fk_orderheadertoorderdetails FOREIGN KEY (OrderID) REFERENCES Orders.OrderHeader (OrderID)

GO

www.detodoprogramacion.com

Page 113: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6 Índices

—Create new clustered indexes on the ShipDate/FinalShipDate columns CREATE CLUSTERED INDEX icx_finalshipdate ON Orders.OrderHeader (FinalShipDate) GO CREATE CLUSTERED INDEX icx_shipdate ON Orders.OrderDetail (ShipDate) GO

93

2. En el Explorador de objetos, expanda el nodo índices para las tablas OrderHeader y OrderDetail. Observe que ahora tiene un índice agrupado (clustered) junto con el índice unique y nonclustered creado con la tabla.

Los índices no agrupados

El otro tipo de índice relacional que se puede crear es el índice no agrupado (nonclustered index). Los índices no agrupados no imponen un orden en la tabla, por lo que puede crear varios índices no agrupados sobre una tabla. Los índices no agrupados tienen las mismas restricciones que un índice agrupado (máximo de 900 bytes y un máximo de 16 columnas), junto con, además, la limitación de un máximo de 249 índices no agrupados en una tabla.

Mantenimiento de Índices

A primera vista, se podría pensar que simplemente deberá crear decenas o cientos de índices en una tabla con el fin de adaptarse a cualquier posible consulta. Sin embargo, es necesario recordar cómo se construye un índice. Los valores de la columna en la que se crea el índice se utilizan para generar dicho índice. Los valores en el índice también se ordenan. Cuando una nueva fila se agrega a la tabla, antes de que la operación pueda completarse, SQL Server debe agregar el valor de esta nueva la fila en la ubicación correcta dentro del índice.

Si sólo hay un índice en la tabla, una fila nueva escrita en la tabla también causa que se escriba en el índice. Si hay 30 índices en la tabla, una fila nueva escrita en la tabla causaría otras 30 escrituras adicionales para agregar el valor a cada uno de los índices.

Si la página de índice de nivel de hoja no tiene espacio para el nuevo valor, SQL Server tiene que realizar una página dividida y escribir la mitad de las filas de la página completa en una nueva página recién asignada. Si esto también hace que una página de índice de nivel intermedio se desborde, se produciría una división de página en ese nivel también. Si la nueva fila también hace que la página raíz se desborde, la página raíz tendría que ser dividida en un nuevo nivel intermedio, creando una nueva página raíz.

Los índices pueden mejorar el rendimiento de una consulta, pero cada índice creado también causa una degradación en el rendimiento de los comandos INSERT, UPDATE, DELETE y MERGE. Por lo tanto, es necesario un cuidadoso equilibrio del número de índices para tener operaciones óptimas. Como una regla general, si tiene cinco o más índices en una tabla diseñada para el procesamiento de transacciones en línea (OLTP), es probable que tenga que volver a evaluar por qué existen esos índices. Las tablas diseñadas para operaciones de lectura o consultas de tipo "data warehouse", suelen tener muchos más índices

www.detodoprogramacion.com

Page 114: Microsoft SQL Server 2008 Español - Mike Hotek

94 Parte II Diseñar bases de datos

ya que las operaciones de escritura a un almacén de datos, generalmente ocurren a través de operaciones por lotes controlados administrativamente fuera de las horas pico.

Nota Usted aprenderá más acerca de INSERT, UPDATE, DELETE y MERGE en el capítulo 10, "Manipulación de Datos”

En la siguiente práctica, agregará unos pocos índices no agrupados a la base de datos SQL2008SBS para dar soporte a las operaciones de consulta que tienen alta probabilidad de ocurrir, tales como la búsqueda de un producto por su nombre o la búsqueda de un cliente por su nombre o ciudad.

Crear un índice no agrupado

1. Ejecute el siguiente código en la base de datos SQL2008SBS (el código está en el archivo

Capítulo 6\code2.sql):

CREATE NONCLUSTERED INDEX idx_companyname ON Customers.Customer(CompanyName) GO CREATE NONCLUSTERED INDEX idx_lastnamefirstname ON Customers.Customer(LastName,FirstName) GO CREATE NONCLUSTERED INDEX idx_city ON Customers.CustomerAddress(City) GO CREATE NONCLUSTERED INDEX idx_customerid ON Customers.CustomerAddress(CustomerID) GO CREATE NONCLUSTERED INDEX idx_jobtitle ON HumanResources.Employee(JobTitle) GO CREATE NONCLUSTERED INDEX idx_lastnamefirstname ON HumanResources.Employee(LastName,FirstName) GO CREATE NONCLUSTERED INDEX idx_productname ON Products.Product(ProductName) GO

2. En el Explorador de objetos, expanda el nodo de índices para las tablas Customers.Customer, Customers.CustomerAddress, HumanResources.Employee y Products.Product. Observe que ahora tiene creados otros índices no agrupados.

3. Ahora que tiene un poco de conocimiento sobre la ejecución de consultas, es el momento para empezar a mostrarle algunos atajos (shortcuts) que se pueden utilizar dentro de SSMS. Expanda el nodo Columnas debajo Products.Product y en la ventana de consulta escriba el siguiente código:

CREATE NONCLUSTERED INDEX idx_productmargin ON () GO

4. Desde el paso 1 de este procedimiento, usted ha visto cómo construir una declaración CREATE INDEX válida y se dará cuenta de que el nombre de la tabla y el nombre de la columna no aparecen en el comando. Desde el Explorador de objetos, arrastre y coloque el nombre de la tabla Products.Product en la ventana de consulta justo antes de los paréntesis abiertos. Su query debe ser ahora como la siguiente:

CREATE NONCLUSTERED INDEX idx_productmargin ON Products.Product() GO

www.detodoprogramacion.com

Page 115: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6 Índices 95

5. Desde el Explorador de objetos, arrastre y coloque el nombre de la columna ProductMargin entre

el par de paréntesis. La consulta debe parecerse a la siguiente:

CREATE NONCLUSTERED INDEX idx_productmargin ON Products.Product(ProductMargin) GO

6. Dentro de la ventana de consulta, resalte la declaración CREATE INDEX que completó en Paso 5 y pulse CTRL + E ó bien F5 (cualquiera de los dos) para ejecutar únicamente el código que aparece resaltado.

7. En el Explorador de objetos, expanda el nodo de índices para la tabla y Products.Product y observe el nuevo índice que acaba de crear.

Nota En los pasos 3-6, usted aprendió varias cosas que pueden no ser evidentes. En primer lugar, puede arrastrar cualquier nombre de objeto desde el Explorador de objetos hacia una ventana de consulta con el fin de no tener que escribir nombres. En segundo lugar, puede crear índices en columnas, así como columnas calculadas. En tercer lugar, se puede resaltar una porción de código en la ventana de consultas y ejecutar selectivamente sólo el código resaltado. Algunas cosas adicionales para que usted pueda jugar, mientras estamos con el tema de accesos directos, son las siguientes:

  Arrastre el nodo etiquetado “Columna” debajo de la tabla Products.Product a la ventana de consulta. Observe que aparece una lista separada por comas con cada columna en la tabla.

Intente arrastrar y soltar el nodo etiquetado “Tablas” debajo de la base de datos SQL2008SBS. Observe que no se puede utilizar la función arrastrar / soltar con este nodo.

Investigue qué otros nodos puede arrastrar y soltar desde el Explorador de objetos para una ventana de consulta.

Mantenga presionada la tecla ALT y arrastre el puntero del ratón sobre una parte de la ventana de consulta y observe que se pueden resaltar y aplicar los comandos cortar, copiar y pegar para el área seleccionada.

 

 

 

Columnas incluidas

Un ítem interesante para recordar es que cuando se define un índice en una o más columnas, cada valor dentro de la columna (s) se carga en el índice. En efecto, termina con una “tabla miniatura” con auto-mantenimiento, construida a partir de las columnas del índice. Lo que es importante es que si usted puede construir tales índices donde una consulta sólo tiene que acceder a los datos en el índice para satisfacer la consulta, no es necesario acceder a la tabla. Un índice que se construye de manera que satisfaga plenamente una consulta se denomina un índice de cobertura (covering index).

Índices de cobertura

Un índice de cobertura puede tener un efecto interesante en determinadas consultas. Si la consulta necesita devolver los datos de las columnas sólo dentro de un índice, SQL Server no necesita acceder a las páginas de datos de la tabla actual. Al transitar por el índice, SQL Server encuentra todos los datos que se requieren.

www.detodoprogramacion.com

Page 116: Microsoft SQL Server 2008 Español - Mike Hotek

96 Parte II Diseñar bases de datos

Si usted puede construir covering indexes para datos de acceso frecuente, puede aumentar el tiempo de respuesta para las consultas, evitando lecturas adicionales a la tabla subyacente. También puede aumentar potencialmente la concurrencia habiendo consultas que accedan a los datos de un índice, mientras que los cambios que no se escriben en el índice se están tratando sobre la tabla subyacente.

SQL Server es capaz de utilizar más de un índice en una consulta dada. Si dos índices tienen al menos una columna en común, SQL Server puede hacer join a los dos índices juntos con el fin de satisfacer una consulta.

Claramente, los índices son una gran cosa para tener en su base de datos y los covering indexes proporcionan mayor valor a las consultas. Sin embargo, está limitado a 16 columnas y 900 bytes en un índice, lo que excluye columnas con tipos de datos de gran tamaño, que podrían ser útiles en un “índice de cobertura” para no tener que extraer los datos desde la tabla subyacente.

SQL Server 2005 introduce una nueva característica en los índices llamada “columna incluida”. Las columnas incluidas forman parte del índice en el nivel hoja solamente. Los valores de las columnas incluidas no aparecen en la raíz o niveles intermedios de un índice y no cuentan para el límite de 900 bytes para un índice.

Por ejemplo, usted podría construir un índice para la columna Customers.CustomerAddress.City e incluir la columna AddressLine1 con el fin de satisfacer las consultas de direcciones. En la práctica que sigue, volverá a crear el índice en la columna Customers.CustomerAddress.City para incluir la columna AddressLine1.

Crear un Índice con columnas incluidas

1. Ejecutar el código siguiente en la base de datos SQL2008SBS (el código está en el archivo Capítulo 6 \ code3.sql en los ejemplos que acompañan el libro):

DROP INDEX idx_city ON Customers.CustomerAddress GO CREATE NONCLUSTERED INDEX idx_cityaddressline1 ON Customers.CustomerAddress(City) INCLUDE(AddressLine1) GO

2. En el nodo “índices”, observe el índice creado nuevamente.

3. En la superficie, no parece que el índice recién creado sea diferente del índice City creado previamente. En el Explorador de objetos, haga doble clic sobre el índice recién creado y seleccione la opción “Included Columns” que aparece en las propiedades del índice.

Nota Vamos a explicar muchas de las otras opciones que se ven en el cuadro de diálogo Propiedades del índice en secciones posteriores de este capítulo.

www.detodoprogramacion.com

Page 117: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6 Índices 97

Índices filtrados

Usted puede haber notado un pequeño problema con los índices que se han creado en la tabla Customers.Customer. Dentro de esta tabla, usted tiene una CompanyName junto con Nombre /Apellidos. A pesar de que yo generalmente diseño tablas para dividir los clientes minoristas de los mayoristas, debido a las definiciones completamente diferentes, hemos combinado los dos tipos de clientes en una sola tabla. Por lo tanto, usted tendrá un gran número de filas en la tabla Customers.Customer que no tendrán un valor de CompanyName, al igual que tendrá un gran número de filas que no tendrán valores de Nombre/Apellido porque los dos son mutuamente excluyentes.

Estadísticas de distribución

Los índices proporcionan una manera de localizar rápidamente los datos dentro de una tabla. El componente que es responsable de determinar si un índice se debe utilizar para satisfacer una consulta es el llamado Optimizer. El optimizador decide si desea o no utilizar un índice basado en las estadísticas de distribución que se almacenan en el índice.

Cuando se crea un índice, SQL Server genera una estructura llamada histograma que almacena información acerca de la distribución relativa de los valores de datos dentro de una columna. El grado en que los valores de la columna permite localizar pequeños conjuntos de datos se conoce como “selectividad” del índice. A medida que el número de valores únicos dentro de una columna aumenta, la selectividad de un índice aumenta. El optimizador elige los índices más selectivos para satisfacer una consulta, ya que un índice altamente selectivo permite al procesador de consulta eliminar una parte muy grande de la tabla con el fin de acceder rápidamente a la menor cantidad de datos necesarios para satisfacer la consulta.

Por sí mismos, los campos CompanyName y Nombre/Apellido normalmente serían altamente selectivos. El alto número de valores NULL hará que estos índices tengan una selectividad muy baja, y es probable que sean inútiles para el optimizador. SQL Server 2008 introduce una nueva función de indexación para resolver nuestro problema de selectividad, llamada “índice filtrado” (filtered index).

Los índices filtrados tienen las siguientes restricciones:

 

 

 

Debe ser un índice no agrupado (nonclustered)

No se puede crear en columnas calculadas

Las columnas no pueden someterse a la conversión del tipo de datos implícito o explícito

Nota Usted podría preguntarse por qué un índice agrupado no se puede filtrar. Además de ser un índice, el índice agrupado impone un orden en la tabla. No tendría ningún sentido intentar ordenar una tabla en sólo un subconjunto de las filas de la tabla.

www.detodoprogramacion.com

Page 118: Microsoft SQL Server 2008 Español - Mike Hotek

98 Parte II Diseñar bases de datos

En la práctica, que sigue, usted arrastrará, soltará y volverá a crear nuestros índices de la tabla Customers.Customer, para cambiarlos por índices filtrados que excluyan los datos que son NULL.

Crear un índice filtrado

1. Ejecute el código siguiente en la base de datos SQL2008SBS (el código está en el archivo Capítulo 6\code4.sql en los ejemplos que acompañan el presente libro):

DROP INDEX idx_companyname ON Customers.Customer GO DROP INDEX idx_lastnamefirstname ON Customers.Customer GO CREATE NONCLUSTERED INDEX idx_companyname ON Customers.Customer(CompanyName) WHERE CompanyName IS NOT NULL GO CREATE NONCLUSTERED INDEX idx_lastnamefirstname ON Customers. Customer(LastName,FirstName) WHERE LastName IS NOT NULL GO

2. En el Explorador de objetos, haga doble clic en sus índices recién creados, y seleccione la página “Filter” del cuadro de diálogo Propiedades del índice.

Creación de índices en línea

Cuando se crea un índice, todos los valores de la clave del índice deben ser leídos y utilizados para construir el índice. El proceso de lectura de todos los valores y la construcción del índice no ocurren instantáneamente. De esta forma, es posible para los datos, cambiar dentro de la clave de índice. SQL Server controla los cambios de datos en una tabla para asegurar la consistencia de datos durante la construcción del índice, de acuerdo con la opción de creación especificada. Los índices pueden ser creados ya sea “en línea” o “fuera de línea”. Cuando se crea un índice con la opción OFFLINE, SQL Server bloquea las entradas a la tabla, impidiendo cualquier cambio hasta que se crea el índice. Cuando se crea un índice usando la Opción ONLINE, SQL Server permite cambios en la tabla durante la creación del índice aprovechando el almacén de versiones dentro de la base de datos tempdb.

Usted controla la creación de un índice mediante la opción WITH ONLINE ON | OFF. La opción predeterminada es ONLINE OFF. Cuando se construye un índice agrupado fuera de línea, la tabla está bloqueada y no permite sentencias de selección o modificación de datos. Si usted construye un índice no agrupado fuera de línea, se realiza un bloqueo de tabla compartida, lo que permite sentencias de selección, pero no de modificación de datos.

Durante la creación de índices en línea, se puede tener acceso a la tabla o vista mediante consultas o instrucciones de modificación de datos. Cuando se crea un índice en línea, la funcionalidad de control de versiones de fila dentro de SQL Server 2008 se utiliza para garantizar que el índice puede ser construido sin

entrar en conflicto con otras operaciones sobre la tabla. La posibilidad de crear índices en línea está disponible con la versión Enterprise de SQL Server.

www.detodoprogramacion.com

Page 119: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6 Índices 99

Nota Usted aprenderá más acerca de bloqueo, el almacén de versiones y niveles de aislamiento en el capítulo 10, "Manipulación de Datos".

Mantenimiento y Gestión de Índices

Dado que los datos dentro de un índice se almacenan de forma ordenada, con el tiempo los valores pueden moverse en el índice debido a cualquiera de las divisiones de páginas o a los cambios en los valores. Con el fin de gestionar la fragmentación de un índice en el tiempo, es necesario realizar un mantenimiento periódico.

Fragmentación del Índice

Los archivos de un sistema operativo pueden fragmentarse con el tiempo debido a las operaciones repetidas de escritura. Aunque los índices pueden fragmentarse, la fragmentación del índice es un poco diferente de la fragmentación de archivos.

Cuando se crea un índice, todos los valores de la clave del índice se escriben de forma ordenada en las páginas del índice. Si se elimina una fila de la tabla, SQL Server necesita eliminar la entrada correspondiente en el índice. La eliminación del valor crea un "agujero" en la página del Índice. SQL Server no reclama el espacio dejado, ya que el costo de encontrar y reutilizar un "agujero" en un índice es prohibitivo. Si cambia un valor en una tabla en la que se basa un índice, SQL Server debe mover la entrada del índice a la ubicación adecuada, que también deja tras de sí un "agujero". Cuando las páginas de un índice se llenan y requieren una división de página, se obtiene una fragmentación adicional del índice. Con el tiempo, una tabla que está pasando por una gran cantidad de pérdida de clientes, una gran cantidad de cambios de datos, tendrá los índices fragmentados.

Para controlar la fragmentación de un índice, puede aprovechar una opción llamada “factor de llenado” y también puede utilizar la declaración ALTER INDEX para eliminar la fragmentación.

Factor de llenado (Fill factor)

La opción de factor de relleno para un índice determina el porcentaje de espacio libre que es reservado en cada página de nivel hoja del índice cuando el mismo se crea o se reconstruye. El espacio libre reservado deja un sector en la página para valores adicionales que se añadan, reduciendo la frecuencia de que ocurra una división de página. El factor de relleno se representa como un porcentaje del total. Por ejemplo, un factor de relleno de 75 significa que el 25 por ciento del espacio en cada página de nivel hoja se dejará vacío, para acomodar los valores futuros que se agreguen.

www.detodoprogramacion.com

Page 120: Microsoft SQL Server 2008 Español - Mike Hotek

100 Parte II Diseñar bases de datos

Desfragmentar un índice

Dado que SQL Server no reclama espacio, usted debe periódicamente recuperar el espacio vacío en un índice con el fin de preservar las ventajas de rendimiento de dicho índice. Usted puede desfragmentar un índice usando la declaración ALTER INDEX, como se muestra a continuación:

ALTER INDEX { index_name | ALL } ON <object> { REBUILD

[ [PARTITION = ALL] [ WITH ( <rebuild_index_option> [ ,...n ] ) ]

| [ PARTITION = partition_number [ WITH ( <single_partition_rebuild_index_option> [ ,...n ] )] ] ]

| DISABLE | REORGANIZE [ PARTITION = partition_number ] [ WITH ( LOB_COMPACTION = { ON | OFF } ) ]

| SET ( <set_index_option> [ ,...n ] ) }[ ; ]

Deshabilitar un índice

Un índice puede ser desactivado mediante el uso de la declaración ALTER INDEX de la siguiente manera:

ALTER INDEX { index_name | ALL } ON <object> DISABLE [ ; ]

Cuando se deshabilita un índice, la definición permanece en el catálogo del sistema, pero ya no es utilizado. SQL Server no mantiene el índice a medida que cambian los datos de la tabla y el índice no puede ser utilizado para satisfacer las consultas. Si un índice agrupado es deshabilitado, la tabla entera estará inaccesible.

Para habilitar un índice, se debe reconstruir, esto es para regenerar y poblar la estructura del árbol-B. Usted

puede lograr esto mediante el siguiente comando:

ALTER INDEX { index_name | ALL } ON <object> REBUILD [ ; ]

Índices XML

Un tipo de datos XML puede contener hasta 2 GB de datos en una sola columna. Si bien los datos XML tienen una estructura que se puede consultar, SQL Server necesita escanear la estructura de datos con el fin de localizar los datos dentro de un documento XML. Con el fin de mejorar el rendimiento de las consultas contra los datos XML, puede crear un tipo de índice especial llamado “índice XML”.

Los índices XML se pueden crear de dos tipos diferentes: PRIMARY y SECONDARY.

www.detodoprogramacion.com

Page 121: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 6 Índices 101

Un índice XML primario, está construido contra todos los nodos de la columna XML. El Índice XML primario también está relacionado con la tabla mediante el mantenimiento de un vínculo a la correspondiente fila en el índice agrupado. Por lo tanto se requiere un índice agrupado antes de poder crear una índice XML primario.

Una vez que se ha creado un índice XML primario, puede crear nuevos índices secundarios. Los índices secundarios se pueden crear en PATH, VALUE o PROPERTY. Se requiere primero un índice XML primario, ya que los índices XML secundarios se construyen contra los datos contenidos en el índice XML principal.

Los indices XML secundarios creados FOR PATH se basan en los valores PATH y NODE del índice XML primario. Un índice XML PATH se utiliza para optimizar las consultas buscando un camino dentro de un documento XML. Los índices creados FOR VALUE son construidos contra el PATH y el VALUE del índice XML primario y se utilizan para buscar valores dentro de documentos XML. Los índices creados FOR PROPERTY se crean utilizando la clave principal, el nodo, y la ruta. Los índices XML PROPERTY se utilizan para devolver, de manera eficiente, los datos de una columna XML con columnas adicionales de la tabla.

La sintaxis genérica para crear un índice XML es:

CREATE [ PRIMARY ] XML INDEX index_name ON <object> ( xml_column_name ) [ USING XML INDEX xml_index_name

[ FOR { VALUE | PATH | PROPERTY } ] ] [ WITH ( <xml_index_option> [ ,...n ] ) ][ ; ]

En la siguiente práctica, va a crear índices XML en la columna Products.Product. Los usuarios normalmente, ejecutarán consultas en la columna ProductDescription para localizar documentos que contienen valores específicos y también buscarán documentos con rutas específicas.

Crear índices XML

1. Ejecute el siguiente código en la base de datos SQL2008SBS (el código está en el archivo Capítulo 6\code5.sql en los ejemplos que acompañan el presente libro):

CREATE PRIMARY XML INDEX ipxml_productdescription ON Products. Product(ProductDescription) GO CREATE XML INDEX ispxml_productdescription ON Products.Product(ProductDescription) USING XML INDEX ipxml_productdescription FOR PATH GO CREATE XML INDEX isvxml_productdescription ON Products.Product(ProductDescription) USING XML INDEX ipxml_productdescription FOR VALUE GO

2. Expanda el nodo “Índices” debajo de la tabla Products.Product y observe los nuevos índices creados.

www.detodoprogramacion.com

Page 122: Microsoft SQL Server 2008 Español - Mike Hotek

102 Parte II Diseñar bases de datos

Índices espaciales

Los índices espaciales se crean en una columna espacial que es del tipo geometría o geografía.

CREATE SPATIAL INDEX index_name ON <object> ( spatial_column_name ) { [ USING <geometry_grid_tessellation> ]

WITH ( <bounding_box> [ [,] <tesselation_parameters> [ ,...n ] ] [ [,] <spatial_index_option> [ ,...n ] ] )

| [ USING <geography_grid_tessellation> ] [ WITH ( [ <tesselation_parameters> [ ,...n ] ]

[ [,] <spatial_index_option> [ ,...n ] ] ) ] } [ ON { filegroup_name | "default" } ];

Capítulo 6 Referencia Rápida

Para

Crear un índice agrupado

Crear un índice no agrupado

Agregar columnas a un índice que no cuenten para el límite de 900 bytes

Crear un índice contra un subconjunto

de filas

Reservar espacio en un índice, para valores futuros

Desfragmentar un índice

Deshabilitar un índice

Crear un índice XML

Crear un índice espacial

Haga lo siguiente

Ejecutar CREATE CLUSTERED INDEX

Ejecutar CREATE NONCLUSTEREDINDEX

Agregue una cláusula INCLUDE a un índice no agrupado

Agregue una cláusula WHERE para un índice no agrupado

Especifique un factor de relleno (FILL FACTOR) menor de 100% durante la creación del índice

Ejecute ALTER INDEX. . .REBUILD ó ALTER INDEX. . .REORGANIZE

Ejecute ALTER INDEX. . . DISABLE

CREATE PRIMARY XML INDEX. . . for a primary XML index

CREATE XML INDEX for a secondary XML index

Ejecute CREATE SPATIAL INDEX

www.detodoprogramacion.com

Page 123: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7

Particionamiento

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

Crear funciones de partición

Crear esquemas de partición

Particionar Tablas e índices

Mantener particiones

Mover datos dentro y fuera de las tablas usando particiones

La partición de tablas se introdujo por primera vez en SQL Server 2005 para permitirle a los usuarios, dividir grandes tablas a través de estructuras de almacenamiento múltiples. Anteriormente, los objetos se limitaban a un solo grupo de archivos que podía contener varios archivos. Sin embargo, la colocación de los datos dentro de un grupo de archivos era determinada por SQL Server.

La partición de tablas permite que las tablas, índices y vistas indizadas sean creadas en múltiples grupos de archivos, mientras que también le permite al DBA especificar que porción del objeto va a ser almacenados en un grupo de archivos específico.

El proceso para la partición de una tabla, una vista indexada, o un índice es el siguiente:

1. Crear una función de partición

2. Crear un esquema de partición asignada a una función de partición

3. Crear la tabla, índice o vista indexada en el esquema de partición

En este capítulo usted aprenderá cómo crear funciones de partición y esquemas de partición para aplicarlas a las tablas e índices. Usted también aprenderá cómo utilizar los comandos de mantenimiento de partición, para mover datos dentro y fuera de las tablas.

Funciones de partición

La función de partición define los límites que va a utilizar para dividir los datos a través un esquema de partición.

Un ejemplo de una función de partición es:

CREATE PARTITION FUNCTION mypartfunction (int) AS RANGE LEFT FOR VALUES (10,20,30,40,50,60)

103

www.detodoprogramacion.com

Page 124: Microsoft SQL Server 2008 Español - Mike Hotek

104 Parte II Diseñar bases de datos

Cada función de partición requiere un nombre y tipo de datos. El tipo de datos define los límites de los puntos limítrofes que se pueden aplicar y debe abarcar el mismo rango de datos o menor, que los datos de una columna de una tabla, índice o vista indexada, a la que la función de partición es aplicada.

El tipo de datos para una función de partición puede ser cualquier tipo de datos nativo de SQL Server, excepto text, ntext, image, varbinary (max), timestamp, xml, y varchar (max). Tampoco se pueden utilizar tipos de datos Transact-SQL definidos por el usuario y tipos de datos CLR. Los tipos de datos “imprecisos”, tales como real, así como columnas calculadas, deben conservarse como tales. Las columnas que se utilizan para la partición deben ser deterministas.

La cláusula AS permite especificar si la función de partición que está creando es RANGE LEFT o RANGE RIGHT. Los parámetros LETFT y RIGHT definen la partición que incluirá un punto límite.

Utilice la cláusula FOR VALUES para especificar los puntos límite para la función de partición. Si la función de partición se crea como RANGE LEFT, entonces el punto límite se incluirá en la partición izquierda. Si la función de partición se crea como RANGE RIGHT, entonces el punto límite se incluirá en la partición derecha.

Una función de partición mapea siempre el rango entero de datos, por lo tanto, no quedan espacios presentes. Usted no puede especificar puntos de contorno duplicados. Esto asegura que cualquier valor almacenado en una columna siempre se evalúa con una sola partición. Los valores nulos se almacenan siempre en la partición de más a la izquierda hasta que usted explícitamente especifique null como un punto límite y use la sintaxis RANGE RIGHT, en cuyo caso, los valores nulos se almacenan en la partición más a la derecha.

Puesto que el rango completo de valores está siempre mapeada por una función de partición, el resultado es la creación de una partición “de más” de los puntos límites que usted ha definido. La Tabla 7-1 muestra cómo se define en SQL Server la siguiente función de partición.

CREATE PARTITION FUNCTION mypartfunction (int) AS RANGE LEFT FOR VALUES (10,20,30,40,50,60)

TABLA 7-1 Rango función de partición izquierdo

Valor Min

-

11

21

31

41

51

61

Número de partición

1

2

3

4

5

6

7

Valor Max

10

20

30

40

50

60

+∞

www.detodoprogramacion.com

Page 125: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7 Particionamiento 105

Nota Usted puede tener un máximo de 1000 particiones de un objeto. Por lo tanto, se le permiteespecificar un máximo de 999 puntos de frontera.

Esquemas de partición

Los esquemas de partición proporcionan una definición alternativa para el almacenamiento. Un esquema de partición abarca uno o más grupos de archivos. La sintaxis genérica para la creación de un esquema de partición es:

CREATE PARTITION SCHEME partition_scheme_name AS PARTITION partition_function_name [ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )

Tres ejemplos de esquemas de partición son como sigue:

CREATE PARTITION SCHEME mypartscheme AS PARTITION mypartfunction TO (Filegroup1, Filegroup2, Filegroup3, Filegroup4, Filegroup5, Filegroup6, Filegroup7) CREATE PARTITION SCHEME mypartscheme AS PARTITION mypartfunction TO (Filegroup1, Filegroup1, Filegroup2, Filegroup2, Filegroup3) CREATE PARTITION SCHEME mypartscheme AS PARTITION mypartfunction ALL TO (Filegroup1)

Cada esquema de partición debe tener un nombre que se ajusta a las reglas de los identificadores. La cláusula AS PARTITION especifica el nombre de la función de partición que se asignará al esquema de partición. La cláusula TO especifica la lista de grupos de archivos que se incluyen en el esquema de partición.

Grupos de archivos

Cualquier grupo de archivos especificado en la declaración CREATE PARTITION SCHEME debe existir en la base de datos.

Un esquema de partición debe ser definido de tal manera que contenga un grupo de archivos para cada partición que es creada por la función de partición mapeada al esquema de partición. SQL Server 2008

permite el uso de palabra clave ALL, como se indica anteriormente, que permite que todas las particiones definidas por la función de partición, se creen dentro de un solo grupo de archivos. Si no utiliza la palabra clave ALL, entonces el esquema de partición debe contener al menos un grupo de archivos para cada partición definida dentro de la función de partición. Por ejemplo, una función de partición con 6 puntos límite (7 particiones) debe ser asignada a un esquema de partición con al menos 7 grupos de archivos definidos. Si más grupos de archivos son incluidos en el esquema de partición donde hay particiones, cualquier exceso de grupos de archivos no será usado para almacenar datos a menos que explícitamente se especifique mediante el uso del comando ALTER PARTITION SCHEME.

La Tabla 7-2 muestra como son mapeados una función de partición y un esquema de partición.

CREATE PARTITION FUNCTION mypartfunction (int) AS RANGE LEFT

www.detodoprogramacion.com

Page 126: Microsoft SQL Server 2008 Español - Mike Hotek

106 Parte II Diseñar bases de datos

FOR VALUES (10,20,30,40,50,60); GO CREATE PARTITION SCHEME mypartscheme AS PARTITION mypartfunction TO (Filegroup1, Filegroup2, Filegroup2, Filegroup4, Filegroup5, Filegroup6, Filegroup7); GO

TABLA 7-2 Función de partición mapeada a un esquema de partición

Número de partición

1

2

3

4

5

6

7

Grupo de archivos

FileGroup1

Filegroup2

Filegroup2

Filegroup4

Filegroup5

Filegroup6

Filegroup7

Valor Min

-

11

21

31

41

51

61

Valor Max

10

20

30

40

50

60

+

Particionando tablas e índices Crear una tabla, índice o vista indexada con particiones es muy similar a la creación de una tabla, índice o vista indexada sin particiones. Cada objeto que se crea tiene una cláusula ON que especifica dónde está almacenado el objeto. Sin embargo, la cláusula ON se omite sistemáticamente, causando que los objetos sean creados en el grupo de archivos predeterminado. Dado que un esquema de partición es simplemente una definición para el almacenamiento, particionar una tabla, índice o vista indexada, es un proceso muy sencillo.

Un ejemplo de una tabla con particiones es como sigue:

CREATE TABLE Employee (EmployeeID int NOT NULL, FirstName varchar(50) NOT NULL, LastName varchar(50) NOT NULL)

ON mypartscheme(EmployeeID); GO

La clave es la cláusula ON. En lugar de especificar un grupo de archivos, debe especificar un esquema de partición. El esquema de partición ya está definido con un mapeo a una función de partición. Por lo tanto, usted necesita especificar la columna en la tabla, la clave de partición, a la que se aplicará la función de partición. En el ejemplo anterior, hemos creado una tabla llamada Employee y se utilizó el Columna EmployeeID para dividir la tabla basada en la definición de la función de partición que fue mapeada al esquema de partición donde de la tabla está almacenada. La Tabla 7-3 muestra cómo se dividen los datos en la tabla Employee.

CREATE PARTITION FUNCTION mypartfunction (int) AS RANGE LEFT FOR VALUES (10,20,30,40,50,60); GO CREATE PARTITION SCHEME mypartscheme AS PARTITION mypartfunction TO (Filegroup1, Filegroup2, Filegroup3, Filegroup4, Filegroup5, Filegroup6, Filegroup7); GO

www.detodoprogramacion.com

Page 127: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7 Particionamiento

CREATE TABLE Employee (EmployeeID int NOT NULL,

FirstName varchar(50) NOT NULL, LastName varchar(50) NOT NULL)

ON mypartscheme(EmployeeID); GO

107

TABLA 7-3 Función de partición mapeada a un esquema de partición

Nro. de partición

1

2

3

4

5

6

7

Grupo de archivos

FileGroup1

Filegroup2

Filegroup3

Filegroup4

Filegroup5

Filegroup6

Filegroup7

EmployeeID Min

-∞

11

21

31

41

51

61

EmployeeID Max

10

20

30

40

50

60

+∞

Es necesario especificar que la clave de particionamiento es del mismo tipo de datos, longitud y precisión. Si la clave de particionamiento es una columna calculada, la columna calculada debe ser PERSISTED.

Copia de seguridad y restauración parcial

El particionamiento tiene un efecto de gestión interesante sobre sus tablas e índices. Basado en la definición de la función de partición y esquema de partición, es posible determinar el conjunto de filas que se encuentran en un grupo de archivos determinado. Mediante el uso de esta información, es posible hacer copia de seguridad y restauración de una parte de una tabla, así como manipular los datos en una parte de una tabla sin afectar a ninguna otra parte de la misma.

Creación de un índice con particiones

Al igual que en la creación de una tabla con particiones, usted particiona un índice mediante la especificación de un esquema de partición en la cláusula ON, como en el ejemplo de código siguiente:

CREATE NONCLUSTERED INDEX idx_employeefirstname ON dbo.Employee(FirstName) ON mypartscheme(EmployeeID);

GO

Cuando se especifica la clave de partición para un índice, no está limitado a las columnas sobre las que está definido el índice. Como se vio en el capítulo 6, "Indices", un índice puede tener una cláusula opcional INCLUDE. Cuando se crea un índice en una tabla con particiones, SQL Server incluye automáticamente la clave de partición en la definición de cada índice, lo que le permite particiónar un índice de la misma manera que la tabla.

Nota Cuando inicialmente realiza la partición de una tabla, debe partir la tabla en una columna que forma parte del índice agrupado de la tabla.

www.detodoprogramacion.com

Page 128: Microsoft SQL Server 2008 Español - Mike Hotek

108 Parte II Diseñar bases de datos

Las tablas Orders.OrderHeader y Orders.OrderDetail sólo deben contener los doce meses más recientes de las órdenes según lo determinado por la fecha de envío del artículo. Todos los datos mayores de doce meses deben ser trasladados a un conjunto de tablas históricas. Las tablas históricas mantendrán un máximo de tres años de datos antes de que se retiren de la base de datos transaccional. En este ejercicio, creará las nuevas tablas históricas como tablas con particiones. También añadirá grupos de archivos adicionales a la base de datos SQL2008SBS que serán usados para el particionado.

Partición de una tabla nueva

1. Ejecute el siguiente código en la base de datos SQL2008SBS (el código está en el archivo Capítulo7\code1.sql que está en los ejemplos que acompañan el presente libro). Las particiones para las tablas OrderHeader y OrderDetail se muestran en la Tabla 7-4.

CREATE SCHEMA Archive AUTHORIZATION dbo GO ALTER DATABASE SQL2008SBS ADD FILEGROUP FG2 ALTER DATABASE SQL2008SBS ADD FILEGROUP FG3 GO ALTER DATABASE SQL2008SBS ADD FILE

(NAME = FG2_dat, FILENAME = 'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_4.ndf', SIZE = 2MB)

TO FILEGROUP FG2 ALTER DATABASE SQL2008SBS ADD FILE

(NAME = FG3_dat, FILENAME = 'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_5.ndf', SIZE = 2MB)

TO FILEGROUP FG3 GO CREATE PARTITION FUNCTION shipdatepartfunc (date) AS RANGE RIGHT FOR VALUES ('1/1/2007','1/1/2008') GO CREATE PARTITION SCHEME shipdatepartscheme AS PARTITION shipdatepartfunc TO (FG1, FG2, FG3) GO -- We want the primary key to be nonclustered so that -- we can create a clustered index to partition the table CREATE TABLE Archive.OrderDetail(

OrderDetailID INT NOT NULL, OrderID INT NOT NULL, SKU CHAR(10) NOT NULL, Quantity INT NOT NULL, UnitPrice MONEY NOT NULL, ShipDate DATE NOT NULL)

ON shipdatepartscheme(ShipDate) GO

www.detodoprogramacion.com

Page 129: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7 Particionamiento

CREATE CLUSTERED INDEX icx_shipdate

ON Archive.OrderDetail(ShipDate) ON shipdatepartscheme(ShipDate)

GO ALTER TABLE Archive.OrderDetail

ADD CONSTRAINT pk_orderdetail PRIMARY KEY NONCLUSTERED (OrderDetailID, ShipDate) ON shipdatepartscheme(ShipDate) GO CREATE TABLE Archive.OrderHeader(

OrderID INT NOT NULL, CustomerID INT NOT NULL, OrderDate DATE NOT NULL, SubTotal MONEY NOT NULL, TaxAmount MONEY NOT NULL, ShippingAmount MONEY NOT NULL, GrandTotal AS ((SubTotal+TaxAmount)+ShippingAmount), FinalShipDate DATE NOT NULL)

ON shipdatepartscheme(FinalShipDate) GO ALTER TABLE Archive.OrderHeader

ADD CONSTRAINT pk_orderheader PRIMARY KEY NONCLUSTERED(OrderID, FinalShipDate) ON shipdatepartscheme(FinalShipDate) GO CREATE CLUSTERED INDEX icx_finalshipdate

ON Archive.OrderHeader(FinalShipDate) ON shipdatepartscheme(FinalShipDate)

GO

109

TABLA 7-4 Partición para la asignación de grupo de archivos

Partición

Número

1

2

3

1

2

3

Grupo de archivos

OrderHeader

FileGroup1

Filegroup2

Filegroup3

Min

+∞

01/01/2007

01/01/2008

+∞

01/01/2007

01/01/2008

Max

12/31/2006

12/31/2007

+∞

12/31/2006

12/31/2007

+∞

OrderDetail

FileGroup1

Filegroup2

Filegroup3

www.detodoprogramacion.com

Page 130: Microsoft SQL Server 2008 Español - Mike Hotek

110 Parte II Diseñar bases de datos

Gestión de particiones

Una vez que una tabla o índice son particionados, SQL Server automáticamente almacenará los datos de acuerdo a la definición de la función de partición y del esquema de partición. Con el tiempo, las necesidades de partición de los datos va a cambiar..

Operadores SPLIT y MERGE

Con los datos en constante cambio, las particiones raramente son estáticas. Dos operadores están disponibles para gestionar las definiciones de punto límite, estos son: SPLIT y MERGE.

El operador SPLIT introduce un nuevo punto límite en una función de partición. MERGE elimina un punto límite de una función de partición. La sintaxis general es la siguiente:

ALTER PARTITION FUNCTION partition_function_name() {SPLIT RANGE ( boundary_value ) | MERGE RANGE ( boundary_value ) } [ ; ]

Usted debe tener mucho cuidado al utilizar los operadores SPLIT y MERGE. Con ellos usted añadirá o eliminará una partición entera de la función de partición. Los datos no son removidos de la tabla con estos operadores, sólo la partición. Dado que, una partición sólo puede residir en un único grupo de archivos, un SPLIT o MERGE podría causar una cantidad significativa de E/S de disco ya que SQL Server reubica filas en el disco.

Modificación de un esquema de partición

Grupos de archivos se pueden añadir a un esquema de partición existente con el fin de crear más espacio de almacenamiento para una tabla particionada. La sintaxis general es la siguiente:

ALTER PARTITION SCHEME partition_scheme_name NEXT USED [ filegroup_name ] [ ; ]

La cláusula NEXT USED tiene dos propósitos.

  Agregar un nuevo grupo de archivos a la partición de esquema, si el grupo de archivos especificado no es aun parte del esquema de partición.

Marcar la propiedad NEXT USED para un grupo de archivos.  

El grupo de archivos que está marcado con la bandera NEXT USED es el grupo de archivos que contendrá la siguiente partición que se crea cuando se ejecuta una operación SPLIT.

Alineación de Índice

Una tabla y sus índices asociados se pueden particionar de manera diferente. El único requisito es que el índice agrupado y la tabla tienen que ser particionados de la misma manera ya que el índice cluster no se puede almacenar en una estructura separada de la tabla.

www.detodoprogramacion.com

Page 131: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7 Particionamiento 111

Sin embargo, si una tabla y todos sus índices son particionados utilizando la misma función de partición, se dice que están alineados. Si una tabla y todos sus índices utilizan la misma función de partición y el mismo esquema de partición, el almacenamiento está alineado también.

Al alinear el almacenamiento, las filas en una tabla junto con los índices que dependen de las filas, están almacenados en los mismos grupos de archivos. Esto garantiza que si a una sola partición se le hace copia de seguridad o restauración, los datos y los índices correspondientes se mantienen juntos como una sola unidad.

Operador Cambiar (Switch)

En este punto, particionar es probablemente tan claro como el barro. Después de todo, el objetivo de la partición es dividir una tabla y sus índices asociados, en múltiples estructuras de almacenamiento. El propósito de cada operador es la de gestionar las múltiples estructuras de almacenamiento. Sin embargo, el particionamiento permite funciones avanzadas de gestión de datos que van mucho más allá de simplemente almacenar una parte de una tabla en un grupo de archivos. Para comprender el efecto, debemos dar un paso atrás para entender el diseño básico de datos en SQL Server.

SQL Server almacena los datos en páginas en una lista doblemente enlazada. Con el fin de localizar y acceder a los datos, SQL Server realiza el siguiente proceso básico:

1. Resolver el nombre de la tabla para un ID de objeto

2. Buscar la entrada para el ID de objeto en sys.indexes para extraer la primera página para el objeto

3. Leer la primera página de objeto

4. Usar las entradas “Página siguiente” y “Página anterior” sobre cada página de datos, caminar por la cadena de páginas para localizar los datos requeridos.

La primera página de un objeto no tendrá una página anterior, por lo tanto, la entrada se establece en 0:0. La última página del objeto no tiene una entrada en la página siguiente, por lo que el valor se establece en 0:0. Cuando se encuentra un valor de 0:0 para la siguiente página, SQL Server no tiene que leer ninguna página más.

¿Qué tiene que ver la estructura de cadena de página con la partición?. Cuando una tabla es particionada, los datos se ordenan físicamente, divididos en secciones, y se almacenan en grupos de archivos. Así, a partir de la perspectiva de la cadena de páginas, SQL Server encuentra la primera página del objeto en la partición 1, camina a través del resto de la tabla por la cadena de páginas, llega a la última página en la partición 1 que apunta a la primera página de partición 2, etc. a través del resto de la tabla. Mediante la creación de un ordenamiento físico de los datos, una posibilidad muy interesante está disponible.

Si fuera a modificar el puntero de página en la última página de la partición 1 para tener un valor de 0:0 como siguiente página, SQL Server no leería más allá y tendría el efecto de provocar que los datos "desaparezcan" de la tabla. No habría ningún bloqueo o interbloqueos, ya que se habría producido únicamente una simple operación de metadatos para actualizar el puntero de página. La idea básica para una operación de metadatos se muestra en la Figura 7-1.

www.detodoprogramacion.com

Page 132: Microsoft SQL Server 2008 Español - Mike Hotek

112 Parte II

0:0

Diseñar bases de datos

0:0

1:500

1:500

1:752

1:752

Edición de metadatos

0:0

1:931

1:931

1:822

1:822

0:0

0:0

1:500

1:500

1:752

1:752

1:1043

1:1043

1:931

1:931

1:822

1:822

0:0

FIGURA 7-1 Lista doblemente enlazada

Sería bueno poder simplemente descartar una parte de una tabla. Sin embargo, SQL Server no le permite simplemente tirar datos. Aquí es donde el operador SWITCH entra en juego. La idea básica es que SWITCH le permite intercambiar particiones entre tablas, de una manera perfectamente escalable, sin locking, bloqueos o interbloqueos.

SWITCH tiene varios requisitos, a fin de garantizar que la operación sea perfectamente escalable. Los requisitos más importantes son:

 

 

 

 

 

 

 

Los datos e índices para las tablas de origen y de destino deben tener almacenamientos alineados.

Las tablas de origen y de destino deben tener la misma estructura.

Los datos no pueden ser obligados a moverse desde un grupo de archivos a otro.

Dos particiones con datos no pueden ser cambiadas.

La partición de destino debe estar vacía.

La tabla origen o destino no puede participar en una replicación.

Las tablas de origen o de destino no pueden tener índices de texto completo o un tipo de datos FILESTREAM definido.

www.detodoprogramacion.com

Page 133: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7 Particionamiento 113

Los requisitos para poder cambiar las particiones llevan a requisitos muy conflictivos dentro de entornos de producción. Con el fin de particionar una tabla, la clave de particionamiento debe ser agregada a la clave primaria, así como también cualquier índice único creado en una tabla. Sin embargo, la columna en la que desea crear una partición, casi nunca es un miembro de la clave principal o un índice único. Por lo tanto, con el fin de construir una tabla que tome ventaja de SWITCH, usted debe destruir el sistema de unicidad gestionado dentro de una tabla. La función SWITCH lo forzará a ejecutar código para verificar la unicidad de una columna, la cual estaba previamente forzada por una clave principal.

Un muy buen ejemplo del tema con claves de particionamiento se puede encontrar en nuestras tablas OrderHeader y OrderDetail. Usted sólo quiere mantener los últimos doce meses de las órdenes basándose en la fecha de envío. Por lo tanto, usted debe particionar la tabla en la columna de fecha de envío. Sin embargo, la tabla no tendrá almacenamiento alineado, (un requisito de Switch), a menos que agregue la columna Fecha de envío a la clave primaria. Agregar la columna fecha de envío a la clave primaria es imposible, ya que una clave primaria no permite valores NULL. Para solucionar el problema con valores NULL, tendría que hacer la columna de fecha de envío no NULL y luego llenar la columna con una fecha ficticia que es filtrada por la aplicación. Además, la adición de la columna fecha de envío a la clave principal le permitiría entonces repetir OrderIDs y OrderDetailIDs en la tabla, una violación clara de su estructura de base de datos. Su siguiente pensamiento sería tratar de solucionar este problema creando un índice único para las columnas OrderID/OrderDetailID para hacer cumplir lo que fue destruido al cambiar la clave primaria, para que la tabla tenga alineación de almacenamiento para el operador SWITCH. Sin embargo, no puede crearse un índice único que no contiene la clave de particionado. Esto lo deja de vuelta en el punto de partida, donde las necesidades de su base de datos están en completa contradicción con la posibilidad de utilizar el operador SWITCH. La única manera de evitar esta situación es mover hacia arriba el cumplimiento de valores únicos para las columnas OrderID y OrderDetailID, en la aplicación, negando el uso de la identidad, o construir un trigger detrás de la tabla que rechace cualquier fila que trate de duplicar los datos en estas columnas. Mientras que el operador SWITCH es útil para minimizar el bloqueo, muchos encontrarán que las restricciones impuestas en el diseño de base de datos, son demasiada sobrecarga para implementar esta capacidad.

Nota Uno de los retos de la enseñanza de SQL Server desde el principio, es el hecho de que muchos temas dependen del conocimiento de otros temas. Es bastante difícil para mostrar el efecto de SWITCH si aún no sabe cómo construir una declaración SELECT o insertar datos en una tabla. Por lo tanto, la práctica que sigue se hará en una tabla ficticia muy simple y se deja a usted que implemente este código en las tablas Archive.OrderHeader y Archive.OrderDetail, una vez que haya completado los capítulos 8 a 15 y se hayan poblado estas tablas con datos.

www.detodoprogramacion.com

Page 134: Microsoft SQL Server 2008 Español - Mike Hotek

114 Parte II Diseñar bases de datos

Administrar particiones

1. Ejecute el siguiente código en la base de datos SQL2008SBS para crear una función de partición, un esquema y una tabla con particiones, para trabajar con ellos. (El código está en el archivo Capítulo7\ code2.sql en los ejemplos adjuntos al libro):

CREATE PARTITION FUNCTION partfunc (datetime ) AS RANGE RIGHT FOR VALUES ('1/1/2005','1/1/2006') GO CREATE PARTITION SCHEME partscheme AS PARTITION partfunc TO (FG1, FG2, FG3) GO CREATE TABLE dbo.orders (

OrderID int identity(1,1), OrderDate datetime NOT NULL, OrderAmount money NOT NULL CONSTRAINT pk_orders PRIMARY KEY CLUSTERED (OrderDate,OrderID))

ON partscheme(OrderDate) GO

2. Ejecute el siguiente código para rellenar la tabla con datos de prueba:

SET NOCOUNT ON DECLARE @month int = 1,

@day int = 1, @year int = 2005

WHILE @year < 2007 BEGIN

WHILE @month <= 12 BEGIN

WHILE @day <= 28 BEGIN

INSERT dbo.orders (OrderDate, OrderAmount) SELECT CAST(@month AS VARCHAR(2)) + '/' + CAST(@day AS VARCHAR(2)) + '/'

+ CAST(@year AS VARCHAR(4)), @day * 20 SET @day = @day + 1

END SET @day = 1 SET @month = @month + 1

END SET @day = 1 SET @month = 1 SET @year = @year + 1

END GO

www.detodoprogramacion.com

Page 135: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7 Particionamiento 115

3. Vea los datos en una sola partición, ejecutando el siguiente código:

SELECT * FROM dbo.orders WHERE $partition.partfunc(OrderDate)=3 GO

4. Modifique la función de partición para introducir un nuevo rango y establezca el próximo grupo de archivos utilizando el siguiente código:

ALTER PARTITION SCHEME partscheme NEXT USED FG1; GO ALTER PARTITION FUNCTION partfunc() SPLIT RANGE ('1/1/2007'); GO

5. Cree una tabla para cambiar los datos de 2005 y visualice el contenido de ambas tablas mediante el siguiente código:

CREATE TABLE dbo.ordersarchive (

OrderID int NOT NULL, OrderDate datetime NOT NULL

CONSTRAINT ck_orderdate CHECK (OrderDate<'1/1/2006'), OrderAmount money NOT NULL CONSTRAINT pk_ordersarchive PRIMARY KEY CLUSTERED (OrderDate,OrderID))

ON FG2 GO SELECT * FROM dbo.orders SELECT * FROM dbo.ordersarchive GO

6. Aplique SWITCH a los datos de 2005 para la tabla de archivo (histórico) y vea los resultados mediante el siguiente código:

ALTER TABLE dbo.orders SWITCH PARTITION 2 TO dbo.ordersarchive GO

SELECT * FROM dbo.orders SELECT * FROM dbo.ordersarchive GO

7. Quite el punto de límite para 2005 mediante el siguiente código:

ALTER PARTITION FUNCTION partfunc() MERGE RANGE ('1/1/2005'); GO

www.detodoprogramacion.com

Page 136: Microsoft SQL Server 2008 Español - Mike Hotek

116 Parte II Diseñar bases de datos

8. Aplique DROP a los objetos de prueba relacionados con esta práctica para limpiar la base de datos:

DROP TABLE dbo.orders DROP TABLE dbo.ordersarchive DROP PARTITION SCHEME partscheme DROP PARTITION FUNCTION partfunc GO

Han pasado más de siete años desde que se introdujo la posibilidad de partición en el producto de SQL Server, y se remonta a la etapa beta de SQL Server 2005. Sin embargo, la capacidad de obtener información acerca de tablas con particiones todavía está increíblemente limitado. Así que, como beneficio adicional, la siguiente consulta proporciona un conjunto de resultados que le permite decir qué grupo de archivos está mapeado con una partición determinada de un objeto (El código está en el archivo Capítulo7\code3.sql).

Nota Usted aprenderá cómo construir declaraciones SELECT como la siguiente, en los capítulos 8 y 9.

SELECT SCHEMA_NAME(tbl.schema_id) + '.' + OBJECT_NAME(tbl.object_id) TableName, idx.name IndexName, ps.name PartitionScheme, idxpf.PartitionFunction PartitionFunction, CASE WHEN idxpf.boundary_value_on_right = 1 THEN 'RIGHT'

WHEN idxpf.boundary_value_on_right = 0 THEN 'LEFT' END RangeType, p.partition_number AS PartitionNumber, prv.value AS BoundaryValue, CAST(p.rows AS float) AS NumRows, fg.name AS FileGroupName, p.data_compression AS DataCompression FROM sys.tables AS tbl

INNER JOIN sys.indexes AS idx ON idx.object_id = tbl.object_id INNER JOIN sys.partitions AS p ON p.object_id=CAST(tbl.object_id AS int)

AND p.index_id=idx.index_id INNER JOIN sys.indexes AS indx ON p.object_id = indx.object_id

AND p.index_id = indx.index_id LEFT OUTER JOIN sys.destination_data_spaces AS dds

ON dds.partition_scheme_id = indx.data_space_id AND dds.destination_id = p.partition_number

INNER JOIN sys.partition_schemes AS ps ON ps.data_space_id = indx.data_space_id LEFT OUTER JOIN sys.partition_range_values AS prv

ON prv.boundary_id = p.partition_number AND prv.function_id = ps.function_id

LEFT OUTER JOIN sys.filegroups AS fg ON fg.data_space_id = dds.data_space_id OR fg.data_space_id = indx.data_space_id

LEFT OUTER JOIN sys.partition_functions AS pf ON pf.function_id = prv.function_id INNER JOIN (

SELECT DISTINCT indx.name IndexName, pf.name PartitionFunction, pf.boundary_value_on_right

FROM sys.indexes AS indx INNER JOIN sys.partition_schemes AS ps ON ps.data_space_id = indx.data_space_id

INNER JOIN sys.partitions AS p ON p.object_id = indx.object_id AND p.index_id=indx.index_id

INNER JOIN sys.partition_range_values AS prv ON prv.boundary_id = p.partition_number AND prv.function_id = ps.function_id

INNER JOIN sys.partition_functions AS pf ON pf.function_id = prv.function_id) idxpf

ON idxpf.IndexName = idx.name

www.detodoprogramacion.com

Page 137: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 7 Particionamiento 117

Capítulo 7 Referencia Rápida

Para

Crear una función de partición

Crear un esquema de partición

Partición de una tabla

Haga lo siguiente

Utilizar CREATE PARTITION FUNCTION

Utilizar CREATE PARTITION SCHEME mapeado a una función de partición previamente creada

 

 

Crear la tabla en un esquema de partición

Borre y vuelva a crear el índice agrupado sobre un esquema de partición

Eliminar un punto de límite de una

función de partición

Añadir un punto de límite en una función

de partición

Mover particiones entre tablas

Utilice el operador MERGE

Utilice el operador SPLIT

Utilice el operador SWITCH

www.detodoprogramacion.com

Page 138: Microsoft SQL Server 2008 Español - Mike Hotek

Parte III

Recuperar y manipular datos

En esta parte:

Capítulo 8: Recuperación de Datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Capítulo 9: Recuperación de datos avanzada. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Capítulo 10: Manipulación de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

119

www.detodoprogramacion.com

Page 139: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8

Recuperación de datos

Después de completar este capítulo, usted será capaz de

 

 

 

Recuperar datos de una o más tablas

Filtrar los resultados de la consulta

Ordenar los resultados de la consulta

T-SQL tiene cientos de comandos para crear y manipular los objetos de una base de datos, necesarios para gestionar su negocio. Sin embargo, es suficiente un solo comando para recuperar datos: SELECT. SELECT es el comando más potente y flexible que encontrará dentro de cualquier lenguaje de programación. En este capítulo, usted comenzará a aprender cómo tomar ventaja de las características básicas del comando SELECT. Usted aprenderá cómo recuperar datos de una o más tablas, filtrar los resultados, y aplicar la ordenación de los datos.

Nota Cada capítulo de este libro tiene múltiples procedimientos a seguir. Este capítulo, como así también el Capítulo 9, "Funciones avanzadas de recuperación de datos", saldrá un poco del formato normal de los capítulos de un libro paso a paso. Porque no hay mejor sustituto del aprendizaje que hacer, los capítulos 8 y 9 se construyen como un ejercicio de aprendizaje de gran tamaño. Yo lo guiaré a través de como construir declaraciones SELECT para satisfacer sus necesidades a partir de consultas simples y progresando a través de ejemplos más complejos. En la conclusión del capítulo 9, usted estará preparado para escribir todas las consultas diferentes que su aplicación necesitará. Para demostrar la más amplia gama de la cláusula SELECT, todos los ejemplos estarán basados en la base de datos de ejemplo AdventureWorks. Le recomiendo, llevar a cabo cada una de las consultas de ejemplo contra la base de datos AdventureWorks y que observar los resultados. Todos los ejemplos se pueden encontrar en el archivo Chapter08\ code1.sql.

Declaración General de SELECT

La sintaxis genérica para una declaración SELECT es la siguiente:

SELECT statement ::= [WITH <common_table_expression> [,...n]] <query_expression> [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] } [ ,...n ] ] [ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ] [ BY expression [ ,...n ] ] ]

[ <FOR Clause>] [ OPTION ( <query_hint> [ ,...n ] ) ]

121

www.detodoprogramacion.com

Page 140: Microsoft SQL Server 2008 Español - Mike Hotek

122 Parte III Recuperar y manipular datos

<query expression> ::=

{ <query specification> | ( <query expression> ) } [ { UNION [ ALL ] | EXCEPT | INTERSECT } <query specification> | ( <query expression> ) [...n ] ]

<query specification> ::= SELECT [ ALL | DISTINCT ]

[TOP expression [PERCENT] [ WITH TIES ] ] < select_list > [ INTO new_table ] [ FROM { <table_source> } [ ,...n ] ] [ WHERE <search_condition> ] [ GROUP BY [ ALL ] group_by_expression [ ,...n ] [ WITH { CUBE | ROLLUP } ] ] [ HAVING < search_condition > ]

Aunque la sintaxis genérica de una declaración SELECT es muy complicada y con muchas cláusulas, el único elemento necesario es la palabra clave SELECT. El SELECT más básico que puede construirse devolverá una constante. Por ejemplo, las consultas siguientes devuelven uno o más constantes como conjunto de resultados.

select 1 select 'select 1 ' select 'this is a character constant', 'this is another character constant', 1, '7/27/2008'

Puesto que el propósito primario del almacenamiento de datos en las tablas es el de poder obtener los datos de nuevo para utilizarlos por su negocio, usted necesita la capacidad de recuperar datos de una tabla. La cláusula FROM se utiliza para especificar el origen de la tabla desde la que desea recuperar los datos.

Ya has visto que la cláusula SELECT puede contener constantes. La cláusula SELECT se utiliza para especificar cualquier cosa que desea que se devuelva en su conjunto de resultados: constante, columna (s), o cálculo.

Esto nos lleva a la forma más simple de una sentencia SELECT que devuelve datos de una tabla:

SELECT *

FROM Person.Address

El asterisco, "estrella", es un acceso directo para designar todas las columnas. Por lo tanto, la consulta anterior devolverá todas las filas y todas las columnas de la tabla Person.Address. SELECT * FROM devuelve todas las columnas que existen en la tabla al momento de ejecución de la sentencia SELECT. Aunque esto podría sonar como un atajo muy conveniente, el uso de SELECT * es desaconsejado porque cualquier cambio en la estructura de una tabla después que ha implementado una aplicación, conduce a un riesgo significativo de errores de aplicación inesperados. Por lo tanto, siempre debe definir explícitamente la lista de columnas que desea obtener de la siguiente manera:

SELECT AddressID, AddressLine1, AddressLine2, City, StateProvinceID, PostalCode FROM Person.Address

www.detodoprogramacion.com

Page 141: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8 Recuperación de datos 123

Si sólo tiene una única tabla en la consulta o si la columna que está recuperando es única dentro la consulta, sólo tiene que especificar el nombre de la columna en la lista del SELECT. Sin embargo, si la columna no es única dentro de la consulta, debe especificar el nombre de la columna completo como sigue:

SELECT Person.Address.AddressID, Person.Address.AddressLine1, Person.Address.AddressLine2, Person.Address.City, Person.Address.StateProvinceID, Person.Address.PostalCode FROM Person.Address

Con el fin de proporcionar referencias simplificadas dentro de una declaración SELECT, T-SQL proporciona la capacidad para cambiar el nombre de columnas y tablas, denominada “alias”. Los alias pueden ser de tres diferentes formas:

<alias> = <column> <column/table> AS <alias> <column/table> <alias>

Cualquiera de los métodos para los alias son válidos dentro de T-SQL, sin embargo, es muy común ver utilizado el último método. Las consultas siguientes muestran ejemplos de alias (el alias está en negrita):

SELECT MyAddress=AddressID, AddressLine1, AddressLine2, City, StateProvinceID, PostalCode FROM Person.Address SELECT AddressID AS MyAddress, AddressLine1, AddressLine2, City, StateProvinceID, PostalCode FROM Person.Address SELECT AddressID MyAddress, AddressLine1, AddressLine2, City, StateProvinceID, PostalCode FROM Person.Address SELECT a.AddressID MyAddress, a.AddressLine1, a.AddressLine2, a.City, a.StateProvinceID, a.PostalCode FROM Person.Address a

SQL Server cuenta con más de 100 funciones para agregar, analizar y manipular datos. Para una lista completa, consulte el artículo de los libros en pantalla "Funciones (Transact-SQL)." Usted puede utilizar las funciones CAST y CONVERT para cambiar el tipo de datos. Las siguientes consultas devuelven los mismos resultados:

SELECT CAST(AddressID AS varchar(30)), AddressLine1, AddressLine2, City, StateProvinceID FROM Person.Address SELECT CAST(AddressID AS varchar), AddressLine1, AddressLine2, City, StateProvinceID FROM Person.Address SELECT CONVERT(varchar(30),AddressID), AddressLine1, AddressLine2, City, StateProvinceID FROM Person.Address

www.detodoprogramacion.com

Page 142: Microsoft SQL Server 2008 Español - Mike Hotek

124 Parte III Recuperar y manipular datos

Usted se dará cuenta de que en el primer ejemplo se especificó varchar (30), mientras que en el segundo ejemplo sólo se especifica varchar. Cuando el número de caracteres no está especificado para CAST/ CONVERT el valor por defecto es 30. Al igual que con caso de “SELECT *”, se recomienda, por lo tanto dejar explícitamente especificando el número de caracteres de una CAST / CONVERT.

CAST o CONVERT sólo deben utilizarse cuando SQL Server no puede convertir implícitamente los tipos de datos. Por ejemplo, un tipo de datos INT implícitamente se convertirá en una DECIMAL. Usted se estará preguntando ¿Por qué T-SQL tiene dos funciones para convertir los datos?. Aunque CAST es un recién llegado a SQL Server, CONVERT tiene una capacidad de formato adicional para los datos de fecha y hora. CONVERT acepta un tercer parámetro para los tipos de datos date y time, que le permite especificar un formato de cadena. Las consultas siguientes son ejemplos de “formateo” de date y time:

SELECT CONVERT(varchar(30),ModifiedDate,101) AS MonthDay4DigitYear, AddressLine1 FROM Person.Address SELECT CONVERT(varchar(30),ModifiedDate,103) AS DayMonth4DigitYear, AddressLine1 FROM Person.Address SELECT CONVERT(varchar(30),ModifiedDate,1) AS MonthDay2DigitYear, AddressLine1 FROM Person.Address SELECT CONVERT(varchar(30),ModifiedDate,3) AS DayMonth2DigitYear, AddressLine1 FROM Person.Address

T-SQL le permite concatenar dos valores utilizando el signo más “+”, como lo muestra la siguiente consulta.

SELECT AddressID, AddressLine1 + ' ' + AddressLine2, City, StateProvinceID, PostalCode FROM Person.Address

Se dará cuenta de que un gran número de las filas de la consulta anterior devuelven un valor NULL para la segunda columna del conjunto de resultados. La columna AddressLine2 permite valores NULL y la mayoría de las filas de la tabla Person.Address contienen un valor NULL para la columna AddressLine2. Dado que un NULL es la inexistencia de un valor, algo concatenado con un valor NULL va a producir un NULL. Y dado también que el efecto deseado para la consulta anterior es concatenar las líneas de dirección, es necesario llegar a un método para evitar que los datos de AddressLine1 sean eliminados del resultado, cuando hay un valor NULL en la columna AddressLine2. T-SQL tiene dos funciones que permiten sustituir un valor NULL con otro valor, ISNULL y COALESCE, como muestran las siguientes consultas.

SELECT AddressID, AddressLine1 + ' ' + ISNULL(AddressLine2,''), City, StateProvinceID FROM Person.Address SELECT AddressID, AddressLine1 + ' ' + COALESCE(AddressLine2,''), City, StateProvinceID FROM Person.Address SELECT ProductID, Color FROM Production.Product SELECT ProductID, ISNULL(Color,'Not Applicable') FROM Production.Product

www.detodoprogramacion.com

Page 143: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8 Recuperación de datos 125

Si desea devolver el número de filas de una tabla, puede utilizar la función COUNT, como se se muestra aquí.

SELECT COUNT (*) FROM Person.Address

Las funciones se pueden anidar unas dentro de otras para realizar cálculos avanzados. Por ejemplo, la siguiente consulta devolverá la longitud máxima de los datos almacenados en la columna AddressLine1.

SELECT MAX (DATALENGTH (AddressLine1)) DE Person.Address

Si usted necesita devolver condicionalmente un valor en un conjunto de resultados, puede utilizar la función CASE que tiene una sintaxis genérica de:

CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ]

END

Por ejemplo, la siguiente consulta devuelve un valor diferente en el conjunto de resultados basándose en el valor de la columna ShipMethodID.

SELECT ShipMethodID, CASE ShipMethodID WHEN 1 THEN 'A.Datum' WHEN 2 THEN 'Contoso' WHEN 3 THEN 'Consolidated Messenger' ELSE 'Unknown' END

FROM Purchasing.PurchaseOrderHeader

La expresión condicional se evalúa en el orden de la expresión. Cuando se ejecuta el ejemplo que sigue a continuación, no se debería ver "A.Datum" aparecer en cualquier parte del conjunto de resultados, porque la expresión condicional para "Contoso" y "Consolidated Messenger" aparecen antes que "A.Datum en la función CASE.

SELECT ShipMethodID, CASE WHEN ShipMethodID = 2 THEN 'Contoso' WHEN ShipMethodID = 3 THEN 'Consolidated Messenger' WHEN ShipMethodID >= 2 AND ShipMethodID <= 4 THEN 'A.Datum' ELSE 'Unknown' END ShipMethod

FROM Purchasing.PurchaseOrderHeader

El reordenamiento de la expresión CASE, para mover el condicional para “A.Datum” al inicio de la función CASE, causará que “Mensajero Contoso” y “Consolidado” no aparezca en los resultados.

SELECT ShipMethodID, CASE WHEN ShipMethodID >= 2 AND ShipMethodID <= 4 THEN 'A.Datum' WHEN ShipMethodID = 2 THEN 'Contoso'

www.detodoprogramacion.com

Page 144: Microsoft SQL Server 2008 Español - Mike Hotek

126 Parte III Recuperar y manipular datos

WHEN ShipMethodID = 3 THEN 'Consolidated Messenger' ELSE 'Unknown' END ShipMethod

FROM Purchasing.PurchaseOrderHeader r

Cuando hay superposición de los condicionales en una función CASE, lo único que tendría que hacer es cambiar el orden dentro de la declaración CASE y con ello podría romper una aplicación. Así, mientras las últimas dos consultas son válidas, no son una buena práctica de codificación.

En este punto, usted debe darse cuenta de que a pesar de que sólo tiene una sola sentencia para recuperar datos, una declaración SELECT es muy flexible. Ha ejecutado cerca de 30 consultas diferentes usando sólo dos cláusulas para la declaración SELECT y menos de 10 de las más de 100 funciones disponibles que se incluyen con SQL Server 2008.

Ordenando Resultados

Cuando usted necesita ordenar los resultados devueltos, utilice la cláusula ORDER BY. Se puede especificar cualquier número de columnas en la cláusula ORDER BY, sin embargo, la longitud total de todas las columnas de la Cláusula ORDER BY debe ser menor de 8.060 bytes. ORDER BY no permite columnas que sean de los tipos de datos TEXT, NTEXT, IMAGE, o XML. Las columnas de la cláusula ORDER BY no tienen por que incluirse en la lista SELECT.

La posición de la columna en la cláusula ORDER BY determina la secuencia que se aplica al resultado ordenado. Por ejemplo, si aparece column1 antes de columna2, los resultados serán ordenados primero por column1 y luego por columna2. También puede especificar la dirección de ordenación para cada columna como ascendente, “ASC”, o descendente, DESC. Ascendente es el tipo de dirección por defecto cuando no se especifica.

Compare las siguientes consultas:

SELECT AddressID, AddressLine1 + ' ' + ISNULL(AddressLine2,''), City, StateProvinceID FROM Person.Address ORDER BY AddressID SELECT AddressID, AddressLine1 + ' ' + ISNULL(AddressLine2,''), City, StateProvinceID FROM Person.Address ORDER BY AddressID DESC SELECT AddressID, AddressLine1 + ' ' + ISNULL(AddressLine2,''), City, StateProvinceID FROM Person.Address ORDER BY City, AddressID DESC SELECT AddressID, AddressLine1 + ' ' + ISNULL(AddressLine2,''), City, StateProvinceID FROM Person.Address ORDER BY PostalCode DESC SELECT AddressID, AddressLine1 + ' ' + ISNULL(AddressLine2,''), City, StateProvinceID FROM Person.Address ORDER BY PostalCode DESC, AddressID

www.detodoprogramacion.com

Page 145: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8 Recuperación de datos 127

Filtrado de datos

Las cláusulas básicas SELECT, FROM y ORDER BY son sólo ligeramente útiles en la construcción de aplicaciones. Muy pocas aplicaciones tendrán el requerimiento de devolver todos los datos en una tabla, por esto, la cláusula WHERE se utiliza para limitar los resultados devueltos. Los criterios de filtrado aplicados a una consulta se conocen como un “argumento de búsqueda” (Search-Argument SARG).

Las siguientes consultas son ejemplos de una cláusula WHERE básica, que devuelven una sola fila de la tabla Person.Address.

SELECT * FROM Person.Address WHERE AddressID = 102 SELECT * FROM Person.Address WHERE AddressID = 2

Además de una igualdad, también puede probar con >, <,> =, <=, y <>. Una desigualdad se puede escribir como <> o ! =. Las siguientes consultas son ejemplos adicionales de una cláusula WHERE simple.

SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice < 15 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice <= 15 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice > 15 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice >= 15 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE DaysToManufacture <> 4

Se pueden especificar criterios compuestos mediante la combinación de AND y OR, como se muestra en los siguientes ejemplos:

SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice > 8.99 AND ListPrice < 34.99 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice > 8.99 OR ListPrice < 34.99 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Name > 'Mu'

www.detodoprogramacion.com

Page 146: Microsoft SQL Server 2008 Español - Mike Hotek

128 Parte III Recuperar y manipular datos

Al especificar criterios compuestos, hay que tener cuidado y asegurarse de que va a encontrar los resultados que espera. La primera consulta devolverá todas las filas con un precio de lista superior de 8,99 y menor que 34.99, pero no se devuelve ninguna fila con un precio de lista exactamente igual a 8.99 o 34.99. La segunda consulta devolverá todas las filas de la tabla, ya que cada fila tiene un precio de lista que es o superior a 8,99 o inferior a 34.99. La tercera consulta muestra que se puede aplicar cualquiera de los operadores de desigualdad a algo más que sólo números y fechas.

Si desea incluir los dos valores límites en el conjunto de resultados, puede utilizar la sintaxis >= y <= de la siguiente manera:

SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice >= 8.99 AND ListPrice <= 34.99

T-SQL proporciona una alternativa a >= y <=, esta es BETWEEN, que hará sus consultas más legibles. Las siguientes consultas proporcionan algunos ejemplos adicionales de criterios compuestos.

SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice BETWEEN 2 and 15 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ListPrice >= 2 AND ListPrice <= 15 OR ListPrice = 0 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE (ListPrice >= 2 AND ListPrice <= 15) OR ListPrice = 0 SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE (ListPrice BETWEEN 2 AND 15) OR (ListPrice BETWEEN 18 AND 50) SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE (ListPrice BETWEEN 2 AND 15) AND (ListPrice BETWEEN 18 AND 50)

La siguiente consulta muestra otro ejemplo de la igualdad, en la que se ha especificado a propósito un criterio imposible. Usted ha especificado una consulta sintácticamente correcta, pero el criterio de consulta no tiene que ser posible. A pesar de que no escribiría una consulta como la del siguiente ejemplo, proporciona un atajo rápido para devolver la lista de columnas en una tabla cuando no está utilizando las características de IntelliSense de SQL Server Management Studio (SSMS).

select * from Production.Product where 1 = 2

www.detodoprogramacion.com

Page 147: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8 Recuperación de datos 129

T-SQL no reconoce o permite el uso de una matriz, pero se puede especificar una lista de valores utilizando la palabra clave IN de la siguiente manera:

SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE ProductSubCategoryID IN (1,2,3)

Con frecuencia las aplicaciones buscarán datos de carácter basados en un fragmento de una cadena. Los operadores de desigualdad no proporcionan el tipo de función de búsqueda para manejar fragmentos de cadena. El operador LIKE en conjunto con los caracteres comodín, permite buscar filas basándose en un fragmento de cadena. T-SQL tiene dos caracteres comodines, como se muestra a continuación:

 

 

Percent (%)—Usado para especificar cualquier cantidad de caracteres

Underscore (_)—Usado para especificar un único caracter

Los comodines se pueden utilizar en cualquier lugar dentro de la cadena de búsqueda. Por ejemplo, LIKE 'A%q_e%e' devolvería los valores que comienzan con "A", le siguen cualquier número de caracteres, luego una "q" y "e" separado por cualquier carácter, seguido de cualquier número de caracteres, y finalmente que termina en "e". Las consultas siguientes muestran ejemplos del uso de LIKE.

SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Name LIKE 'M%' SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Name LIKE 'Mountain%' SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Name LIKE 'Mountain__0%' SELECT ProductID, Name, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Name LIKE '%ountain__0%'

La primera tarea al escribir cualquier aplicación es producir código que cumpla con los requerimientos del negocio (es decir, que produzca los resultados deseados). La segunda tarea es hacer que el código se ejecute lo más rápido que sea posible. El elemento principal de rendimiento dentro de un servidor de base de datos es un diseño adecuado de índice. Los índices sólo pueden utilizarse para buscar, cuando SQL Server puede coincidir un valor específico contra una clave de índice.

Los comodines se pueden utilizar para encontrar los resultados deseados a la vez que toma ventaja de los índices. Sin embargo, los índices sólo se pueden utilizar si el SARG comienza con un valor discreto. Las tres primeras consultas en el ejemplo anterior pueden utilizar un índice en la columna Nombre, porque el SARG comienza con un valor discreto. La cuarta consulta es muy ineficiente y muy desalentadora, ya que requiere de SQL Server para escanear todas las filas de una tabla.

www.detodoprogramacion.com

Page 148: Microsoft SQL Server 2008 Español - Mike Hotek

130 Parte III Recuperar y manipular datos

Hasta este punto, se han tratado de encontrar registros basados en valores discretos. Sin embargo, usted tiene un elemento dentro de las tablas que también tendrá que encontrar y que desafiará todo lo que ha aprendido hasta el momento, este elemento es el valor NULL. Es posible encontrar todas las filas en una tabla donde un valor no existe para una columna especificada. El primer intento que la mayoría de la gente hace es:

SELECT ProductID, Name, Color, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Color = NULL

Esta consulta no devuelve ninguna fila de la tabla Product. Como recordará de la discusión de valores NULL en el capítulo 5, "Diseño de tablas", un valor NULL no es igual a otro NULL y un valor NULL no es igual a un valor. Por lo tanto, cuando se crea una consulta con "= NULL," usted está pidiéndole a SQL Server que encuentre las filas que son equivalentes a un NULL. Dado que es imposible que algo sea equivalente a la inexistencia de un valor, la consulta no devuelve ninguna fila.

Con el fin de devolver correctamente los resultados, cuando usted está buscando las filas donde no se ha introducido un valor, utilice IS NULL como sigue:

SELECT ProductID, Name, Color, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Color IS NULL

También puede utilizar la palabra clave NOT para obtener la comparación negativa de la siguiente manera:

SELECT ProductID, Name, Color, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product WHERE Color IS NOT NULL

Si sólo quería regresar las primeras filas en un conjunto de resultados, puede utilizar el operador TOP como sigue:

SELECT TOP 10 ProductID, Name, Color, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product SELECT TOP 10 PERCENT ProductID, Name, Color, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product SELECT TOP 10 ProductID, Name, Color, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product ORDER BY Color SELECT TOP 10 ProductID, Name, Color, ProductNumber, ListPrice, DaysToManufacture FROM Production.Product ORDER BY Color DESC

Aunque T-SQL sólo devolverá las primeras filas de un conjunto de resultados según el TOP especificado, también se puede obtener el conjunto de filas de abajo, dentro de un conjunto de resultados, mediante la aplicación de la Cláusula ORDER BY. Las consultas tercera y cuarta en el ejemplo anterior, devuelven los primeros 10 y los últimos 10 productos, respectivamente, basados en el campo color.

www.detodoprogramacion.com

Page 149: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8 Recuperación de datos 131

Recuperación de más de una tabla

Hasta este punto, todas las consultas han sido contra una sola tabla. Sin embargo, en la mayoría de las bases de datos, tendrá que combinar los datos de más de una tabla en una sola consulta a fin de devolver los resultados requeridos por una aplicación. La combinación de más de una tabla en una consulta se lleva a cabo mediante el uso de un operador de combinación en la cláusula FROM. Hay cinco operadores válidos de combinación: INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN y

CROSS JOIN.

Las combinaciones de tablas le permiten combinar datos de más de una tabla, mientras que al mismo tiempo proporcionan una capacidad de filtro. Un INNER JOIN combina dos tablas en función de los criterios establecidos en la cláusula ON, al mismo tiempo que elimina las filas de ambas tablas que no cumplen con los criterios. La siguiente consulta devuelve el nombre de un empleado, junto con su título correspondiente. Tenga en cuenta que la siguiente consulta devuelve sólo las filas donde el campo ContactID “matchea” entre las dos tablas.

SELECT a.FirstName, a.LastName, b.Title FROM Person.Contact a INNER JOIN HumanResources.Employee b on a.ContactID = b.ContactID

T-SQL le permite poner SARGs en la cláusula join. Sin embargo, se recomienda dejar todas las SARGs en la cláusula WHERE. Las siguientes consultas devolverán resultados equivalente, aunque el primer ejemplo no es una práctica recomendada.

SELECT a.ProductID, a.Name, b.SalesOrderID FROM Production.Product a INNER JOIN Sales.SalesOrderDetail b

ON a.ProductID = b.ProductID AND a.Color = 'Black' SELECT a.ProductID, a.Name, b.SalesOrderID FROM Production.Product a INNER JOIN Sales.SalesOrderDetail b

ON a.ProductID = b.ProductID WHERE a.Color = 'Black'

Los OUTER JOIN son usados para combinar dos tablas juntas, preservando todas las filas de un lado de la unión. Un LEFT OUTER JOIN preservará todas las filas de la tabla de la izquierda y sólo añadir valores que existen en la tabla de la derecha. Un RIGHT OUTER JOIN conserva todas las filas de la tabla de la derecha y anexa los valores únicos que existen en la tabla de la izquierda. Es posible convertir cada LEFT OUTER JOIN en un RIGHT OUTER JOIN, por lo que se recomienda que elija una de las opciones y la utilice en cualquier lugar que necesite un outer join. Las siguientes consultas muestran el uso de una combinación externa, sin embargo, producen el mismo conjunto de resultados.

SELECT a.ProductID, a.Name, b.SalesOrderID FROM Production.Product a LEFT OUTER JOIN Sales.SalesOrderDetail b

ON a.ProductID = b.ProductID WHERE a.Color = 'Black' ORDER BY 1 SELECT a.ProductID, a.Name, b.SalesOrderID FROM Sales.SalesOrderDetail b RIGHT OUTER JOIN Production.Product a

ON a.ProductID = b.ProductID WHERE a.Color = 'Black' ORDER BY 1

www.detodoprogramacion.com

Page 150: Microsoft SQL Server 2008 Español - Mike Hotek

132 Parte III Recuperar y manipular datos

Aunque es una sintaxis válida incluir una instrucción SELECT dentro de la cláusula SELECT, usted produciría el mismo resultado utilizando un LEFT OUTER JOIN y con mucha menos confusión. Las siguientes consultas son equivalentes, aunque la primera de ellas es mucho más comprensible.

SELECT a.FirstName, a.LastName, b.Title FROM Person.Contact a LEFT OUTER JOIN HumanResources.Employee b on a.ContactID = b.ContactID SELECT a.FirstName, a.LastName,

(SELECT e.Title FROM HumanResources.Employee e WHERE a.ContactID = e.ContactID) AS Title

FROM Person.Contact a

Un FULL OUTER JOIN preservará el contenido de ambas tablas de izquierda y derecha. Donde

no exista un “matcheo” de registros, aparecerá un valor NULL en el conjunto de resultados.

SELECT a.ProductID, a.Name, b.SalesOrderID FROM Production.Product a FULL OUTER JOIN Sales.SalesOrderDetail b

ON a.ProductID = b.ProductID WHERE a.Color = 'Black' ORDER BY 1

El último tipo de unión debe evitarse si es posible. Si ve que necesita escribir una CROSS JOIN con el fin de obtener los resultados correctos, necesita volver al capítulo 5 de este libro y volver a evaluar el diseño de base de datos. Una CROSS JOIN producirá el producto vectorial de las dos tablas que se unen. En la siguiente consulta, se devolverá un conjunto de resultados que incluye cada fila de la tabla Contact combinadas con cada fila de la tabla Employee. Aunque un FULL OUTER JOIN, conservando todas las filas en ambos lados de la combinación produciría aproximadamente 20.000 filas, un CROSS JOIN producirá más de 3.000.000 de filas.

SELECT a.FirstName, a.LastName, b.Title FROM Person.Contact a CROSS JOIN HumanResources.Employee b

Aunque hay casos muy raros donde una CROSS JOIN es la solución válida para un requisito del negocio, cada caso similar que he tenido que afrontar en los últimos casi 20 años, ha sido el resultado de un diseño de la base de datos ineficiente.

Los JOINs no se limitan a tablas diferentes. Usted puede hacer JOIN a una tabla consigo misma (referido como un self join o autocombinación). La consulta siguiente devuelve una lista de los empleados con sus títulos junto con el empleado gerente y el título del gerente.

SELECT a.EmployeeID, c.FirstName, c.LastName, a.Title EmployeeTitle, d.FirstName,

d.LastName, b.ManagerID, b.Title ManagerTitle FROM HumanResources.Employee a INNER JOIN HumanResources.Employee b

ON a.ManagerID = b.EmployeeID INNER JOIN Person.Contact c on a.ContactID = c.ContactID INNER JOIN Person.Contact d on b.ContactID = d.ContactID

ORDER BY ManagerID

www.detodoprogramacion.com

Page 151: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8 Recuperación de datos 133

La combinación más común es un “equality join”, sin embargo los join no se limitan a un signo igual. Usted también puede construir “nonequal joins”, como lo muestran las siguientes consultas. La primera consulta devolverá el precio de venta de los productos que se han vendido por debajo del costo. La segunda consulta devolverá la lista de los productos que se venden por más de un vendedor.

SELECT b.ProductID, b.Name, b.ListPrice, a.UnitPrice AS 'Sales Price' FROM Sales.SalesOrderDetail AS a

JOIN Production.Product AS b ON a.ProductID = b.ProductID AND a.UnitPrice < b.ListPrice

WHERE b.ProductID = 718 SELECT p1.VendorID, p1.ProductID FROM Purchasing.ProductVendor p1

INNER JOIN Purchasing.ProductVendor p2 ON p1.ProductID = p2.ProductID

WHERE p1.VendorID <> p2.VendorID ORDER BY p1.ProductID

Además, puede incrustar las instrucciones SELECT dentro de otras instrucciones SELECT, también conocidas como sub-consultas.

Un sub-query regular trata cada SELECT de forma independiente. La siguiente consulta devuelve todos los

productos con un precio de lista superior al precio de lista promedio para todos los productos.

SELECT a.ProductID, a.Name, a.ListPrice FROM Production.Product a WHERE a.ListPrice > (SELECT AVG(b.ListPrice) FROM Production.Product b)

En una subconsulta correlacionada, la consulta interna depende de los valores de la consulta externa. Esto provoca que la consulta interna sea ejecutada repetidamente basada en la entrada de la consulta externa.

SELECT a.ProductID, a.ListPrice FROM Production.Product a WHERE EXISTS (SELECT 1 FROM Sales.SalesOrderDetail b

WHERE b.ProductID = a.ProductID)

Además de utilizar una subconsulta correlacionada, la consulta anterior aprovecha una opción adicional de filtrado: EXISTS. Aunque un INNER JOIN devolvería todas las filas que coinciden basándose en la combinación y una cláusula WHERE retornaría todas las filas que coinciden con el SARG, no todas las consultas necesitan devolver todas las filas coincidentes. La consulta anterior devuelve los productos y su lista de precios correspondiente a todos los productos que se han vendido. Utilizando una join o cualquier otra cláusula WHERE, devolvería el producto cada vez que se vendió, sin embargo, eso respondería a la pregunta de “cuántas veces se vendió un producto” en lugar de pedir simplemente los productos que se han vendido por lo menos una vez. El argumento EXISTS también mejora el rendimiento de la consulta, ya que SQL Server sólo tiene que encontrar una sola aparición en la tabla para que la cláusula WHERE sea verdadera. Tan pronto como se encuentra un valor, SQL Server deja de mirar el resto de las filas, dado que el valor de retorno no cambiaría desde ese momento en adelante.

www.detodoprogramacion.com

Page 152: Microsoft SQL Server 2008 Español - Mike Hotek

134 Parte III Recuperar y manipular datos

Recuperación de resultados únicos

Aunque las consultas previamente ejecutadas para uniones desiguales devuelve un conjunto de resultados, debería haberse dado cuenta de que determinadas filas se repitieron en el conjunto de resultados. Si sólo desea devolver las filas únicas de una consulta, puede utilizar la palabra clave DISTINCT.

SELECT b.ProductID, b.Name, b.ListPrice, a.UnitPrice AS 'Sales Price' FROM Sales.SalesOrderDetail AS a

JOIN Production.Product AS b ON a.ProductID = b.ProductID AND a.UnitPrice < b.ListPrice

WHERE b.ProductID = 718 SELECT DISTINCT b.ProductID, b.Name, b.ListPrice, a.UnitPrice AS 'Sales Price' FROM Sales.SalesOrderDetail AS a

JOIN Production.Product AS b ON a.ProductID = b.ProductID AND a.UnitPrice < b.ListPrice

WHERE b.ProductID = 718 SELECT p1.VendorID, p1.ProductID FROM Purchasing.ProductVendor p1

INNER JOIN Purchasing.ProductVendor p2 ON p1.ProductID = p2.ProductID

WHERE p1.VendorID <> p2.VendorID ORDER BY p1.ProductID SELECT DISTINCT p1.VendorID, p1.ProductID FROM Purchasing.ProductVendor p1

INNER JOIN Purchasing.ProductVendor p2 ON p1.ProductID = p2.ProductID

WHERE p1.VendorID <> p2.VendorID ORDER BY p1.ProductID

DISTINCT se aplica a todas las columnas de la lista del SELECT. DISTINCT también se puede combinar con la

función COUNT para devolver el número de filas en lugar de los datos de una tabla. La primera consulta que sigue devolverá el número de empleados dentro de la base de datos AdventureWorks. La segunda consulta devolverá el número de empleados con un gerente. Usted notará que este último valor es menor que el número de empleados, debido a que el CEO de la empresa no cuenta con un gerente.

SELECT COUNT(*) FROM HumanResources.Employee SELECT COUNT(ManagerID) FROM HumanResources.Employee

DISTINCT se vuelve un poco más complicado cuando se trata de contar el número de ocurrencias distintas dentro de una tabla. Si desea devolver el número de empleados que son un gerente, usted puede intentar con esta consulta:

SELECT DISTINCT COUNT (ManagerID) DE HumanResources.Employee

Esto no devuelve la respuesta correcta a su pregunta. SQL Server primero realiza un recuento de las filas de la tabla de empleados que tienen un ManagerID. El resultado del recuento es un valor único, al que SQL Server aplica un DISTINCT y puesto que hay sólo una fila, se obtiene el mismo

www.detodoprogramacion.com

Page 153: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 8 Recuperación de datos

resultado, como lo haría si el DISTINCT no se hubiera incluido. Moviendo el DISTINCT dentro de la función count, SQL Server primero devuelve una lista de los ManagerID únicos y luego cuenta la lista.

Para Haga lo siguiente

Añadir las palabras clave TOP o TOP PERCENT a la cláusula SELECT

Agregue la palabra clave DISTINCT a la cláusula SELECT

Incluir una cláusula ORDER BY

Utilizar un INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN o FULL OUTER JOIN en la cláusula FROM

Incluir una cláusula WHERE

Utilice una sentencia SELECT con una cláusula FROM

Devolver un subconjunto con las filas iniciales en un conjunto de resultados

Devolver el conjunto de filas únicas

Ordenar el conjunto de resultados

Mostrar los resultados de más de una tabla

Devolver datos de una tabla

Filtrar resultados basados en un SARG

Capítulo 8 Referencia Rápida

SELECT COUNT (DISTINCT ManagerID) DE HumanResources.Employee

www.detodoprogramacion.com

Page 154: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9

Después de completar este capítulo, usted será capaz de

En el capítulo 8, "Recuperación de datos", aprendió acerca de las cláusulas básicas para una

sentencia SELECT que se puede utilizar para resolver una variedad de problemas

empresariales. En este capítulo, vamos a profundizar en características avanzadas y

extensiones recientes de la declaración SELECT, que le permiten calcular agregaciones,

obtener conjuntos de resultados agregados, manipular jerarquías, buscar filas

coincidentes/no coincidentes entre tablas, y consultar datos XML.

Nota: Cada capítulo de este libro tiene múltiples procedimientos a seguir. En este capítulo se apartará ligeramente del formato normal de capítulos de un libro paso a paso. Porque no hay mejor sustituto del aprendizaje que el “hacer”; los capítulos 8 y 9 están construidos como un ejercicio de aprendizaje de gran tamaño. Yo lo guiaré para que sepa cómo construir declaraciones SELECT para satisfacer sus necesidades comenzando con consultas muy simples y progresando a través de ejemplos más complejos. Al final de este capítulo, estará preparado para escribir todas las diversas consultas que sus aplicaciones necesitarán. Con el fin de demostrar la más amplia variedad de la declaración SELECT, todos los ejemplos se basarán sobre la base de datos de ejemplo AdventureWorks. Se recomienda llevar a cabo cada una de las consultas de ejemplo contra la base de datos AdventureWorks y observar los resultados. Todos los ejemplos se pueden encontrar en el archivo Chapter09\ code1.sql.

Recuperación avanzada de datos

 

Agregar filtros.  

 

 

 

 

 

Buscar filas coincidentes entre dos tablas

Agregar datos.

  Consultar las expresiones de tabla comunes.

Combinar varios conjuntos de resultados

Buscar filas que existen en una tabla y no en otra.

Calcular varios niveles agregados

Consultar datos XML

Declaración General de SELECT

Como vimos en el capítulo 8, la sintaxis genérica para una declaración SELECT es la siguiente:

SELECT statement ::= [WITH <common_table_expression> [,...n]] <query_expression> [ ORDER BY { order_by_expression | column_position [ ASC | DESC ] }

137137137137 www.detodoprogramacion.com

Page 155: Microsoft SQL Server 2008 Español - Mike Hotek

138 Parte III Recuperar y manipular datos

[ ,...n ] ]

[ COMPUTE { { AVG | COUNT | MAX | MIN | SUM } ( expression ) } [ ,...n ] [ BY expression [ ,...n ] ] ] [ <FOR Clause>]

[ OPTION ( <query_hint> [ ,...n ] ) ] <query expression> ::=

{ <query specification> | ( <query expression> ) } [ { UNION [ ALL ] | EXCEPT | INTERSECT } <query specification> | ( <query expression> ) [...n ] ]

<query specification> ::= SELECT [ ALL | DISTINCT ]

[TOP expression [PERCENT] [ WITH TIES ] ] < select_list > [ INTO new_table ] [ FROM { <table_source> } [ ,...n ] ] [ WHERE <search_condition> ] [ GROUP BY [ ALL ] group_by_expression [ ,...n ] [ WITH { CUBE | ROLLUP } ] ] [ HAVING < search_condition > ]

La cláusula SELECT define las columnas de datos a ser devueltas, y puede incluir los operadoresTOP y DISTINCT. La cláusula FROM define una o más tablas para la recuperación, basada en la especificación “join”. Los argumentos de búsqueda o subconsultas se pueden aplicar dentro de una cláusula WHERE para limitar los resultados devueltos. Cuando se desea que los resultados devueltos tengan un orden específico, se puede aplicar un ORDER BY al conjunto de resultados. Las cláusulas básicas-SELECT, FROM, WHERE y ORDER BY-sólo arañan la superficie de lo que se puede hacer en una sentencia SELECT.

Agregación de datos

Un agregado simple devolverá un valor único para toda la tabla. Aunque un pequeño número de requerimientos pueden ser satisfechos simplemente sumando todas las filas de una tabla, muchas consultas de agregación necesitan resumir datos en cubos de análisis, tales como las ventas por mes o defectos por línea de producto.

Las funciones de agregación más comunes son:

 

 

 

 

 

COUNT (número de ítems)

MIN (valor mínimo)

MAX (valor máximo)

AVG (valor promedio)

SUM (total de todos los valores)

www.detodoprogramacion.com

Page 156: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9 Recuperación avanzada de datos 139

La siguiente consulta devuelve el número de empleados que ocupen un puesto de trabajo en particular.

SELECT JobTitle, count(*) FROM HumanResources.Employee GROUP BY JobTitle

Tablas derivadas

Si desea obtener una lista de los empleados junto con el número de empleados que tienen ell mismo título, podría tratar de ejecutar la siguiente consulta:

SELECT BusinessEntityID, JobTitle, count(*) FROM HumanResources.Employee GROUP BY JobTitle

Sin embargo, recibirá un error de sintaxis. Cuando usted está agregando los datos, todas las columnas en la lista SELECT que no son agregados deben ser incluidos en la cláusula GROUP BY. Por lo tanto, la sintaxis correcta para la consulta anterior es:

SELECT BusinessEntityID, JobTitle, count(*) FROM HumanResources.Employee GROUP BY BusinessEntityID, JobTitle

La consulta anterior presenta un problema adicional. Usted quiere calcular el número de los empleados con un puesto de trabajo determinado y luego devolver una lista de los empleados junto con cuántos otros empleados tienen el mismo cargo. Con el fin de cumplir los requisitos del GROUP BY, usted tiene que incluir todas las columnas no agregadas dentro de la cláusula GROUP BY. Se enfrenta a un dilema donde parece que la consulta no puede ser satisfecha.

El problema con la consulta, es debido al orden de las operaciones. Usted tiene que calcular primero el número de personas con un puesto de trabajo determinado. Entonces con base en ese resultado, volver a hacer join a la tabla de empleados para obtener una lista de empleados y la cantidad de otros empleados que tienen el mismo título.

Usted podría hacer esto en una operación de dos pasos usando un SELECT INTO que genera una nueva tabla que contiene los títulos de los puestos y el recuento y luego hacer join entre esta tabla y la tabla de empleados. Sin embargo, usted tendría que limpiar la tabla recién creada, así como hacer frente a problemas de concurrencia, cuando más de una persona está tratando de ejecutar la misma consulta.

T-SQL puede solucionar este dilema al tomar ventaja de una característica interesante de la cláusula FROM. Si se hace referencia de nuevo a la sintaxis general de una declaración SELECT, la cláusula FROM aceptará una tabla de origen. Una tabla está construida de filas y columnas. Cuando se ejecuta una declaración SELECT, se obtiene un conjunto de resultados, que consiste en filas y columnas. Por lo tanto, parece posible que se pueda poner una declaración SELECT entera dentro de la cláusula FROM dado que el único requisito es tener un origen que tenga la estructura de una tabla.

www.detodoprogramacion.com

Page 157: Microsoft SQL Server 2008 Español - Mike Hotek

140 Parte III Recuperar y manipular datos

Cuando incrusta una declaración SELECT en una cláusula FROM, usted está utilizandouna característica llamada tablas derivadas o tablas virtuales. Una instrucción SELECT devuelve un conjunto de resultados, pero no existe nombre para el conjunto de resultados al que se hace referencia dentro de una consulta. Todos los elementos dentro de un consulta deben tener un nombre de referencia. Usted consigue este requisito, encerrando la totalidad de la declaración SELECT entre paréntesis y especificando un alias. La solución al problema original queda así:

SELECT b.BusinessEntityID, b.JobTitle, a.numtitles FROM (SELECT JobTitle, count(*) numtitles

FROM HumanResources.Employee GROUP BY JobTitle) a

INNER JOIN HumanResources.Employee b ON a.JobTitle = b.JobTitle

SQL Server ejecutará primero el SELECT. . . GROUP BY, carga los resultados en la memoria, y "etiqueta" los resultados con el alias especificado. A continuación, puede hacer referencia a cualquier columna dentro de la tabla derivada en el resto de la declaración SELECT, como si estuviera trabajando con una tabla física. Tenga en cuenta que cualquier agregado, concatenación, o cálculo dentro de la tabla derivada debe tener un alias especificado ya que no es posible construir una tabla con una columna que no tiene nombre.

La ventaja principal de una tabla derivada es que el conjunto de resultados reside completamente en memoria. Usted se encontrará con muchas aplicaciones que utilizan tablas temporales para almacenar resultados intermedios como la tabla derivada anterior. Las tablas temporales requieren que escriba en el disco, y eso es una operación costosa. En todos los casos donde se encuentra con una tabla temporal, se puede sustituir con una tabla derivada y casi siempre mejorará dramáticamente el rendimiento de la consulta.

Aunque pueda parecer que el conjunto de resultados está ordena al aplicar una cláusula GROUP BY, el orden no está garantizado, a menos que se especifique una cláusula ORDER BY.

SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail sod GROUP BY SalesOrderID ORDER BY SalesOrderID

Es posible tener valores nulos dentro del conjunto de datos que está tratando de agrupar. Aunque un NULL no es igual a otro NULL, SQL Server no puede arbitrariamente eliminar filas de un conjunto de resultados. Con el fin de retener todas las filas de un conjunto de resultados, SQL Server combina todos los valores NULL juntos.

SELECT Color, COUNT(*) FROM Production.Product GROUP BY Color

Agregación de múltiples permutaciones

Las consultas de agregación se usan frecuentemente para resolver problemas analíticos dentro de una organización. Un gerente de ventas podría tener que analizar las ventas a través del tiempo, las ventas a través del tiempo desglosadas por vendedor, las ventas a través del tiempo desglosadas por el cliente, las ventas a través del tiempo desglosadas por territorios, etc

www.detodoprogramacion.com

Page 158: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9 Recuperación avanzada de datos 141

Cada análisis requiere de una cláusula GROUP BY diferente para devolver los datos apropiados. Sin embargo, el análisis se agota rápidamente en cuestiones de escala de negocios donde el número de consultas solicitadas, rápidamente excede la capacidad de entregar las consultas apropiadas.

Con el fin de satisfacer una variedad de requisitos de análisis, se podría pensar en construir una aplicación que pueda calcular todas las posibles permutaciones de las agregaciones. Si tuvo éxito en la construcción de este tipo de aplicación, usted tendría que construir algo muy similar a la funcionalidad básica en Analysis Services, tema que usted aprenderá en el capítulo 26, "Analysis Services de SQL Server." No todas las aplicaciones necesitan la potencia y la flexibilidad de Analysis Services, pero aún así, es necesario proporcionar un conjunto flexible de agregaciones para satisfacer el análisis del negocio.

El operador CUBE se puede agregar a su declaración SELECT con el fin de calcular todas las posibles permutaciones de una consulta. Por ejemplo, es posible tener los clientes, vendedores, territorios, el año de una orden, el mes de una orden, y el total de la orden. El operador CUBE calcularía el total de la orden para todas las permutaciones posibles de las otras cinco columnas.

SELECT CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate) OrderYear, MONTH(OrderDate) OrderMonth, sum(TotalDue) Total FROM Sales.SalesOrderHeader GROUP BY CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate), MONTH(OrderDate) WITH CUBE

Dentro del conjunto de resultados de la consulta anterior, notará muchos agregados con un gran número de valores NULL. El operador CUBE tiene que calcular todas las permutaciones posibles, mientras que también proporcionar un conjunto de resultados unificado. Con el fin de producir un solo conjunto de resultados, un NULL se utiliza como un marcador de posición en los resultados. Así, cuando un agregado se calcula para un cliente por sí mismo, vendedor, territorio, año y mes, contendrán un NULL. Lo mismo ocurre para un vendedor, territorio, año y mes sólo. Cuando el cliente y año se combinan para calcular un agregado, todas las otras columnas contendrán un NULL. Basado en los valores distintos dentro de una fila determinada, usted sabe a que nivel de agregación se aplica una agregación en particular.

Dentro del conjunto de resultados de una operación CUBE, se genera un valor NULL como marcador de posición en el sentido de todos los valores. Si tiene un NULL real en el conjunto de datos que se agregan, termina con resultados ambiguos. El valor NULL en el conjunto de resultados podría significar todos los valores o podría significar la inexistencia de un valor. Por lo tanto, usted necesita una manera de decir la diferencia entre un valor NULL en los datos de origen de los NULL generados por el operador CUBE, como un marcador de posición. La función GROUPING se utiliza para distinguir entre los nulos dentro del conjunto de resultados. Si el NULL corresponde a la agregación de los valores NULL en los datos de origen, el resultado de la función GROUPING será 1. Si el valor NULL se genera como parte de la operación CUBE en el sentido de todos los valores, el resultado de la función GROUPING será 0.

SELECT CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate) OrderYear, MONTH(OrderDate) OrderMonth, sum(TotalDue) Total, GROUPING(SalesPersonID) SalesPersonGroup FROM Sales.SalesOrderHeader GROUP BY CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate), MONTH(OrderDate) WITH CUBE

www.detodoprogramacion.com

Page 159: Microsoft SQL Server 2008 Español - Mike Hotek

142 Parte III Recuperar y manipular datos

El operador CUBE trata a todas las columnas de forma independiente en el cálculo de todas las permutaciones. Sin embargo, el cálculo de todas las permutaciones no siempre es lo que usted quiere. Por ejemplo, calcular los meses independientemente de los años no siempre tiene sentido. El operador ROLLUP puede ser utilizado para hacerle frente a las jerarquías. ROLLUP es un caso especial del operador CUBE que excluye todos los casos que no siguen una jerarquía dentro de los resultados. Por ejemplo, la siguiente consulta eliminaría todos los casos que incluyen años o meses que intenten agregar el mismo mes a través de varios años.

SELECT CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate) OrderYear, MONTH(OrderDate) OrderMonth, SUM(TotalDue) Total FROM Sales.SalesOrderHeader GROUP BY CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate), MONTH(OrderDate) WITH ROLLUP SELECT CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate) OrderYear, MONTH(OrderDate) OrderMonth, SUM(TotalDue) Total, GROUPING(YEAR(OrderDate)) YearGroup FROM Sales.SalesOrderHeader GROUP BY CustomerID, SalesPersonID, TerritoryID, YEAR(OrderDate), MONTH(OrderDate) WITH ROLLUP

SQL Server 2008 introduce una nueva característica para GROUP BY, GROUPING SETS, que le permite devolver múltiples niveles de agregación en un solo conjunto de resultados. Sin embargo, en lugar de devolver todas las permutaciones posibles, como CUBE y ROLLUP, GROUPING SETS le permite especificar las agrupaciones específicas que le gustaría obtener.

SELECT S.Name StoreName, ST.Name TerritoryName, ST.CountryRegionCode, ST.[Group], P.FirstName + ' ' + P.LastName SalesPerson, SUM(SH.TotalDue) SalesTotal FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID

INNER JOIN Sales.SalesTerritory ST ON C.TerritoryID = ST.TerritoryID INNER JOIN Sales.SalesPerson SP ON S.SalesPersonID = SP.BusinessEntityID INNER JOIN Person.Person P ON S.SalesPersonID = P.BusinessEntityID INNER JOIN Sales.SalesOrderHeader SH ON C.CustomerID = SH.CustomerID

GROUP BY GROUPING SETS((P.FirstName + ' ' + P.LastName),(S.Name),(ST.Name), (ST.Name,ST.CountryRegionCode), (ST.[Group]))

La consulta anterior sustituye a las siguientes cinco consultas:

SELECT P.FirstName + ' ' + P.LastName SalesPerson, SUM(SH.TotalDue) SalesTotal FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID

INNER JOIN Sales.SalesTerritory ST ON C.TerritoryID = ST.TerritoryID INNER JOIN Sales.SalesPerson SP ON S.SalesPersonID = SP.BusinessEntityID INNER JOIN Person.Person P ON S.SalesPersonID = P.BusinessEntityID INNER JOIN Sales.SalesOrderHeader SH ON C.CustomerID = SH.CustomerID

GROUP BY P.FirstName + ' ' + P.LastName

SELECT S.Name StoreName, SUM(SH.TotalDue) SalesTotal FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID

INNER JOIN Sales.SalesTerritory ST ON C.TerritoryID = ST.TerritoryID INNER JOIN Sales.SalesPerson SP ON S.SalesPersonID = SP.BusinessEntityID INNER JOIN Person.Person P ON S.SalesPersonID = P.BusinessEntityID INNER JOIN Sales.SalesOrderHeader SH ON C.CustomerID = SH.CustomerID

GROUP BY S.Name

www.detodoprogramacion.com

Page 160: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9 Recuperación avanzada de datos

SELECT ST.Name TerritoryName, SUM(SH.TotalDue) SalesTotal FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID

INNER JOIN Sales.SalesTerritory ST ON C.TerritoryID = ST.TerritoryID INNER JOIN Sales.SalesPerson SP ON S.SalesPersonID = SP.BusinessEntityID INNER JOIN Person.Person P ON S.SalesPersonID = P.BusinessEntityID INNER JOIN Sales.SalesOrderHeader SH ON C.CustomerID = SH.CustomerID

GROUP BY ST.Name

SELECT ST.Name TerritoryName, ST.CountryRegionCode, SUM(SH.TotalDue) SalesTotal FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID

INNER JOIN Sales.SalesTerritory ST ON C.TerritoryID = ST.TerritoryID INNER JOIN Sales.SalesPerson SP ON S.SalesPersonID = SP.BusinessEntityID INNER JOIN Person.Person P ON S.SalesPersonID = P.BusinessEntityID INNER JOIN Sales.SalesOrderHeader SH ON C.CustomerID = SH.CustomerID

GROUP BY ST.Name,ST.CountryRegionCode

SELECT ST.[Group], SUM(SH.TotalDue) SalesTotal FROM Sales.Customer C INNER JOIN Sales.Store S ON C.StoreID = S.BusinessEntityID

INNER JOIN Sales.SalesTerritory ST ON C.TerritoryID = ST.TerritoryID INNER JOIN Sales.SalesPerson SP ON S.SalesPersonID = SP.BusinessEntityID INNER JOIN Person.Person P ON S.SalesPersonID = P.BusinessEntityID INNER JOIN Sales.SalesOrderHeader SH ON C.CustomerID = SH.CustomerID

GROUP BY ST.[Group]

143

Filtrado de agrupaciones

Previamente aprendió a utilizar una cláusula WHERE para filtrar los resultados. Así que, cuando sus requerimientos son filtrar una agrupación, usted podría asumir que todo lo que tendría que hacer es especificar la cláusula WHERE apropiada. Por ejemplo, si desea recuperar todos los pedidos que superaron los $ 30.000, puede ser que intente la siguiente consulta:

SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail WHERE LineTotal > 30000 GROUP BY SalesOrderID ORDER BY SalesOrderID

Esta consulta devuelve un conjunto de resultados y, a menos que se vean muy de cerca los números, podría pensar que tiene los resultados correctos. Lamentablemente, usted ha construido la consulta incorrecta. Cuando SQL Server ejecuta una consulta, la cláusula WHERE se aplica primero antes de que se produzca cualquier agrupación y agregación. Así que, aunque piense que estaba construyendo una consulta que devolvía todos los pedidos que superaron los $ 30.000, en realidad devolvió todos los pedidos que tenían por lo menos una línea de elemento de más de $ 30.000. SQL Server primero aplica la cláusula WHERE y filtra todas las líneas menos de $ 30.000. Después de que el filtro haya sido aplicado, los elementos de línea restantes se agregan. Usted podría tener un pedido con varias partidas de menos de $ 30.000 las cuales sumadas serían superior de $ 30.000, pero la orden no sería devuelta por la consulta.

www.detodoprogramacion.com

Page 161: Microsoft SQL Server 2008 Español - Mike Hotek

144 Parte III Recuperar y manipular datos

En su lugar, necesita que SQL Server primero calcule el agregado y luego aplique un filtro al agregado. Como usted aprendió anteriormente en este capítulo, se podría aplicar una tabla derivada a este problema. Sin embargo, T-SQL tiene una forma mucho más simple. La cláusula HAVING se utiliza para aplicar un filtro después que se ha producido una agregación. Así, la consulta correcta para el problema del negocio sería:

SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING SUM(LineTotal) > 30000

Aunque esta consulta muestra un agregado en la cláusula HAVING, se puede utilizar cualquier columna agregada o no agregada en la cláusula HAVING. Si usted quisiera devolver el total de órdenes para todos los pedidos de ventas con ID > 45.000, usted puede ejecutar la siguiente consulta y devolver resultados válidos.

SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail GROUP BY SalesOrderID HAVING SalesOrderID > 45000 ORDER BY SalesOrderID ;

Aunque la consulta anterior devuelve los resultados correctos, es extremadamente ineficiente. SQL Server calcularía el subtotal de la orden de todos los pedidos y luego filtraría todas las órdenes de ID menores de 45.000. Si usted va a filtrar pedidos de menos con ID < 45.000, no hay ninguna razón para gastar los recursos en la máquina para calcular un agregado para las filas que no se van a devolver. Por esta razón, no se deben colocar columnas no agregadas en la cláusula HAVING. La manera más eficaz de satisfacer los requisitos para las órdenes mayores de 45.000 es utilizar una cláusula WHERE que filtrará todos los pedidos menores de 45,000 antes de que SQL Server calcule el agregado.

SELECT SalesOrderID, SUM(LineTotal) AS SubTotal FROM Sales.SalesOrderDetail WHERE SalesOrderID > 45000 GROUP BY SalesOrderID ORDER BY SalesOrderID ;

Ejecutando agregados

Mediante la combinación de agregados con joins de “desigualdad”, se puede calcular una variedad de agregados acumulados. La siguiente consulta devuelve un conjunto acumulado de los pedidos de cada vendedor.

SELECT SH3.SalesPersonID, SH3.OrderDate, SH3.DailyTotal, SUM(SH4.DailyTotal) RunningTotal FROM (SELECT SH1.SalesPersonID, SH1.OrderDate, SUM(SH1.TotalDue) DailyTotal

FROM Sales.SalesOrderHeader SH1 WHERE SH1.SalesPersonID IS NOT NULL GROUP BY SH1.SalesPersonID, SH1.OrderDate) SH3

INNER JOIN (SELECT SH2.SalesPersonID, SH2.OrderDate, SUM(SH2.TotalDue) DailyTotal FROM Sales.SalesOrderHeader SH2

www.detodoprogramacion.com

Page 162: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9 Recuperación avanzada de datos

WHERE SH2.SalesPersonID IS NOT NULL GROUP BY SH2.SalesPersonID, SH2.OrderDate) SH4

ON SH3.SalesPersonID = SH4.SalesPersonID AND SH3.OrderDate >= SH4.OrderDate

GROUP BY SH3.SalesPersonID, SH3.OrderDate, SH3.DailyTotal ORDER BY SH3.SalesPersonID, SH3.OrderDate

145

Las tablas derivadas se utilizan para combinar todos los pedidos juntos por vendedor, quienes tienen más de una orden en un solo día. El join con SalesPersonID asegura que está acumulando registros para un solo vendedor. El join de desigualdad le permite a la agregación, considerar sólo las filas de un vendedor donde la fecha del pedido es menor que la fecha de la orden que actualmente se considera dentro del conjunto de resultados.

Mediante la adición de una cláusula HAVING, se puede ampliar un agregado para incluir una variedad de situaciones como la que muestra el total acumulado de ventas sólo por vendedor, quienes ya tienen cumplido con su cuota de ventas, o agregados a través de una ventana deslizante.

El cálculo de las tablas dinámicas (pivot)

La estructura de fila y columna dentro de su base de datos no siempre responde a las necesidades de una aplicación. Algunas aplicaciones necesitan girar filas de datos en columnas, por lo general, mientras realiza un agregado. Las tablas pivote se pueden calcular mediante el operador PIVOT.

SELECT VendorID, [2001], [2002], [2003], [2004] FROM (SELECT VendorID, PurchaseOrderID, YEAR(OrderDate) ChangeYear

FROM Purchasing.PurchaseOrderHeader) r PIVOT (COUNT(r.PurchaseOrderID)

FOR ChangeYear IN ([2001],[2002],[2003],[2004]))

AS Results ORDER BY VendorID

Dentro de la cláusula FROM, se especifica el origen de su pivote, así como la consulta general. El operador PIVOT permite especificar el conjunto a calcular cuando los datos son pivotados.

Si desea restringir el cálculo, puede modificar la cláusula IN para especificar las columnas a través de las cuales se calcula el agregado.

SELECT VendorID, [2003] FROM (SELECT VendorID, PurchaseOrderID, YEAR(OrderDate) ChangeYear

FROM Purchasing.PurchaseOrderHeader) r PIVOT (COUNT(r.PurchaseOrderID)

FOR ChangeYear IN ([2003]))

AS Results ORDER BY VendorID

www.detodoprogramacion.com

Page 163: Microsoft SQL Server 2008 Español - Mike Hotek

146 Parte III Recuperar y manipular datos

Clasificación de datos

Muchas aplicaciones devuelven más resultados que se pueden mostrar en un formato de fácil consumo, así los resultados se suelen dividir en varias páginas para facilitar la navegación.

La función ROW_NUMBER () numera secuencialmente el conjunto de resultados del 1 a n basado en un orden especificado por el usuario.

SELECT p.FirstName, p.LastName, ROW_NUMBER() OVER(ORDER BY s.SalesYTD DESC) AS 'RowNumber', s.SalesYTD, a.PostalCode

FROM Sales.SalesPerson s INNER JOIN Person.Person p ON s.BusinessEntityID = p.BusinessEntityID

INNER JOIN Person.BusinessEntityAddress ba ON p.BusinessEntityID = ba.BusinessEntityID INNER JOIN Person.Address a ON a.AddressID = ba.AddressID

WHERE s.TerritoryID IS NOT NULL

Usted puede partir los resultados en grupos y el número de las filas dentro de un grupo mediante la aplicación de la cláusula PARTITION BY de la siguiente manera:

SELECT p.FirstName, p.LastName, ROW_NUMBER() OVER (PARTITION BY s.TerritoryID ORDER BY SalesYTD DESC) AS 'RowNumber', s.SalesYTD, s.TerritoryID

FROM Sales.SalesPerson s INNER JOIN Person.Person p ON s.BusinessEntityID = p.BusinessEntityID

INNER JOIN Person.BusinessEntityAddress ba ON p.BusinessEntityID = ba.BusinessEntityID INNER JOIN Person.Address a ON a.AddressID = ba.AddressID

WHERE s.TerritoryID IS NOT NULL

La función ROW_NUMBER no siempre devuelve los mismos resultados si hay valores duplicados dentro de la cláusula ORDER BY especificada. Con el fin de manejar las relaciones como un conjunto de resultados rankeados, se puede utilizar la función RANK. Los valores duplicados recibirán el valor mismo de rango, pero se producirán huecos en la secuencia cuando existan vinculos.

SELECT a.ProductID, b.Name, a.LocationID, a.Quantity, RANK() OVER (PARTITION BY a.LocationID ORDER BY a.Quantity DESC) AS 'Rank'

FROM Production.ProductInventory a INNER JOIN Production.Product b ON a.ProductID = b.ProductID

ORDER BY b.Name SELECT a.ProductID, b.Name, a.LocationID, a.Quantity,

RANK() OVER (PARTITION BY a.LocationID ORDER BY a.Quantity DESC) AS 'Rank' FROM Production.ProductInventory a INNER JOIN Production.Product b

ON a.ProductID = b.ProductID ORDER BY 'Rank'

La función DENSE_RANK númera un conjunto de resultados, dando valores duplicados del mismo rango. Sin embargo, ninguno de los huecos en la secuencia de rango son eliminados.

SELECT a.ProductID, b.Name, a.LocationID, a.Quantity, DENSE_RANK() OVER (PARTITION BY a.LocationID ORDER BY a.Quantity DESC) AS 'DenseRank'

FROM Production.ProductInventory a INNER JOIN Production.Product b ON a.ProductID = b.ProductID

ORDER BY b.Name

www.detodoprogramacion.com

Page 164: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9 Recuperación avanzada de datos

SELECT a.ProductID, b.Name, a.LocationID, a.Quantity, DENSE_RANK() OVER (PARTITION BY a.LocationID ORDER BY a.Quantity DESC) AS DenseRank

FROM Production.ProductInventory a INNER JOIN Production.Product b ON a.ProductID = b.ProductID

ORDER BY DenseRank

147

NTILE se utiliza para dividir un conjunto de resultados en N cubos de tamaño aproximadamente igual.

SELECT p.FirstName, p.LastName,

NTILE(4) OVER(ORDER BY s.SalesYTD DESC) AS QuarterGroup, s.SalesYTD, a.PostalCode

FROM Sales.SalesPerson s INNER JOIN Person.Person p ON s.BusinessEntityID = p.BusinessEntityID

INNER JOIN Person.BusinessEntityAddress ba ON p.BusinessEntityID = ba.BusinessEntityID INNER JOIN Person.Address a ON a.AddressID = ba.AddressID

WHERE s.TerritoryID IS NOT NULL SELECT p.FirstName, p.LastName,

NTILE(2) OVER(PARTITION BY s.TerritoryID ORDER BY s.SalesYTD DESC) AS QuarterGroup, s.SalesYTD, s.TerritoryID

FROM Sales.SalesPerson s INNER JOIN Person.Person p ON s.BusinessEntityID = p.BusinessEntityID

INNER JOIN Person.BusinessEntityAddress ba ON p.BusinessEntityID = ba.BusinessEntityID INNER JOIN Person.Address a ON a.AddressID = ba.AddressID

WHERE s.TerritoryID IS NOT NULL

Agregar conjuntos de resultados Usted puede devolver varios resultados de un solo lote, pero las aplicaciones necesitan trabajar con cada conjunto de resultados de forma independiente. Siempre y cuando los conjuntos de resultados tengan la misma estructura, se pueden combinar todos los resultados en un único conjunto de resultados mediante el uso de UNION / UNION ALL.

UNION combinará el conjuntos de resultados, eliminando los duplicados. UNION ALL combinará el conjunto de resultados preservando los valores duplicados.

SELECT p.LastName, p.FirstName

FROM Person.Person p JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2 UNION SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2 UNION SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2

www.detodoprogramacion.com

Page 165: Microsoft SQL Server 2008 Español - Mike Hotek

148 Parte III Recuperar y manipular datos

SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2 UNION ALL SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2 UNION ALL SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2 SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2 UNION SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2 UNION ALL SELECT p.LastName, p.FirstName FROM Person.Person p JOIN HumanResources.Employee e

ON p.BusinessEntityID = e.BusinessEntityID WHERE e.BusinessEntityID = 2

Las aplicaciones que combinan datos de múltiples fuentes se enfrentan a varios desafíos. Más allá del volumen de datos que deben ser procesados, por lo general, necesitan encontrar todas las filas que todavía no han sido recibidas. T-SQL tiene dos operadores diseñados para comparar rápidamente dos conjuntos de resultados. INTERSECT devolverá resultados en los que “matchean” las filas en el lado izquierdo y derecho. EXCEPT devolverá las filas de la izquierda que no existen en el lado derecho.

SELECT ProductID FROM Production.Product INTERSECT SELECT ProductID FROM Production.ProductDocument

www.detodoprogramacion.com

Page 166: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9 Recuperación avanzada de datos 149

La consulta anterior es equivalente al siguiente join.

SELECT a.ProductID FROM Production.Product a INNER JOIN Production.ProductDocument b

ON a.ProductID = b.ProductID

La siguiente consulta encontrará todos los productos que no cuentan con un documento.

SELECT ProductID FROM Production.Product EXCEPT SELECT ProductID FROM Production.ProductDocument

Aunque un INTERSECT normalmente puede ser reemplazado por un INNER JOIN, un EXCEPT no es tan simple. Usted puede intentar usar una join de desigualdad en lugar de un EXCEPT. Por desgracia, cada ProductID no es igual a cualquier otro ProductID, por lo que la unión desigual en realidad va a producir un

conjunto de resultados que es cada fila de la tabla de productos vinculada a cada fila de la tabla ProductDocument donde el campo ProductID no es el mismo.

SELECT a.ProductID FROM Production.Product a INNER JOIN Production.ProductDocument b

ON a.ProductID != b.ProductID

Expresiones de tabla comunes

Las expresiones de tabla comunes (CTE) se introdujeron en SQL Server 2005 para incluir la posibilidad de embeber rutinas iterativas en T-SQL. Una CTE se compone de dos partes:

  Una rutina que contiene una consulta de anclaje contra la cual una segunda consulta recursiva es ejecutada

Una consulta externa que hace referencia a la rutina y especifica el número de niveles de recursividad

 

La siguiente consulta devuelve los empleados, junto con el gerente correspondiente a través un máximo de 25 niveles de la organización.

WITH EMP_cte(BusinessEntityID, OrganizationNode, FirstName, LastName, JobTitle, RecursionLevel)

AS (SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName, e.JobTitle, 0 FROM HumanResources.Employee e INNER JOIN Person.Person as p

ON p.BusinessEntityID = e.BusinessEntityID UNION ALL SELECT e.BusinessEntityID, e.OrganizationNode, p.FirstName, p.LastName,

e.JobTitle, RecursionLevel + 1 FROM HumanResources.Employee e

INNER JOIN EMP_cte ON e.OrganizationNode = EMP_cte.OrganizationNode.GetAncestor(1) INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID)

www.detodoprogramacion.com

Page 167: Microsoft SQL Server 2008 Español - Mike Hotek

150 Parte III Recuperar y manipular datos

SELECT EMP_cte.RecursionLevel, EMP_cte.BusinessEntityID, EMP_cte.FirstName, EMP_cte.LastName, EMP_cte.OrganizationNode.ToString() AS OrganizationNode, p.FirstName AS ManagerFirstName, p.LastName AS ManagerLastName FROM EMP_cte INNER JOIN HumanResources.Employee e

ON EMP_cte.OrganizationNode.GetAncestor(1) = e.OrganizationNode INNER JOIN Person.Person p ON p.BusinessEntityID = e.BusinessEntityID

ORDER BY RecursionLevel, EMP_cte.OrganizationNode.ToString() OPTION (MAXRECURSION 25)

Además de ser un CTE, la consulta anterior también aprovecha el nuevo tipo de datos HierarchyID mediante el uso de las funciones ToString () y GetAncestor ().

Consulta de datos XML

SQL Server proporciona un tipo de datos que almacena los datos XML, así como proporciona acceso completo a consultar los datos XML. Están disponibles una variedad de métodos para devolver resultados como XML. Si sólo desea devolver un documento XML almacenado en una tabla, es suficiente con incluir la columna en la lista del SELECT.

SELECT a.Name, a.ProductNumber, b.Instructions FROM Production.Product a INNER JOIN Production.ProductModel b

ON a.ProductModelID = b.ProductModelID WHERE b.Instructions IS NOT NULL

Si quiere una devolución de las filas que coinciden con un criterio especificado, puede utilizar el método query (). La consulta siguiente devuelve todos los productos que requieren más de 2,5 horas de máquina para fabricarse.

SELECT a.Name, a.ProductNumber, b.Instructions.query('declare namespace AW="http://schemas.microsoft.com/sqlserver/2004/07/

adventure-works/ProductModelManuInstructions"; AW:root/AW:Location[@MachineHours>2.5]') Locations

FROM Production.Product a INNER JOIN Production.ProductModel b ON a.ProductModelID = b.ProductModelID

WHERE b.Instructions IS NOT NULL

Independientemente de la configuración de intercalación (collation) de una base de datos, todos los elementos XML distinguen mayúsculas y minúsculas, como se muestra en la siguiente consulta:

SELECT a.Name, a.ProductNumber,

b.Instructions.query('declare namespace AW="http://schemas.microsoft.com/sqlserver/2004/07/

adventure-works/ProductModelManuInstructions"; AW:root/AW:Location[@machineHours>2.5]') Locations

FROM Production.Product a INNER JOIN Production.ProductModel b ON a.ProductModelID = b.ProductModelID

WHERE b.Instructions IS NOT NULL

www.detodoprogramacion.com

Page 168: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 9 Recuperación avanzada de datos 151

Hay cuatro cláusulas que se pueden utilizar para dar formato a los datos XML: RAW, AUTO, EXPLICIT, y PATH.

SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID IN (119,122) FOR XML RAW;

Al incluir la opción ELEMENTS, los resultados se devolverán como XML centrados en elementos.

SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID IN (119,122) FOR XML RAW, ELEMENTS;

Si su aplicación requiere que el documento XML se devuelva como un tipo de datos XML en lugar de una cadena de caracteres, es necesario especificar la directiva TYPE.

SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID IN (119,122) FOR XML RAW, ELEMENTS, TYPE;

Al devolver los resultados XML, los valores NULL se descartan automáticamente. Esto puede causar problemas para las aplicaciones de lectura de la estructura XML, ya que no todos los elementos están incluidos.

SELECT ProductID, Name, Color FROM Production.Product FOR XML RAW, ELEMENTS;

Si necesita conservar todos los elementos del documento resultante, es necesario especificar la directiva XSNIL.

SELECT ProductID, Name, Color FROM Production.Product FOR XML RAW, ELEMENTS XSINIL

La cláusula FOR XML también se puede utilizar para devolver un esquema XML (XSD). Esto puede ser muy útil en la definición de una colección de esquema.

SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID IN (119,122) FOR XML RAW, XMLSCHEMA

La directiva AUTO proporciona una manera simple y directa para devolver datos en un formato XML centrado en atributos.

SELECT ProductModelID, Name FROM Production.ProductModel WHERE ProductModelID IN (119,122) FOR XML AUTO

La opción PATH y el modo EXPLICIT permiten moldear el formato de un documento XML para adaptarse a cualquier requerimiento.

www.detodoprogramacion.com

Page 169: Microsoft SQL Server 2008 Español - Mike Hotek

152 Parte III Recuperar y manipular datos

Capítulo 9 Referencia Rápida

Para

Proporcionar agregados simples en un conjunto de resultados

Incluir múltiples niveles de agregación en un conjunto de resultados

Filtrar un agregado

Devolver resultados como tabla dinámica

Rankear los resultados dentro de un conjunto de resultado

Combinar varios resultados juntos

Hacer lo siguiente

Utilizar una cláusula GROUP BY

Añadir los operadores GROUPING SETS, CUBE, ROLLUP a un GROUP BY

Especifique los criterios de filtro para una agregación en la cláusula HAVING

Utilice el operador PIVOT

Utilice los operadores ROW_NUMBER (), RANK (), DENSE_RANK (), y NTILE () para numerar los resultados basados en un orden de clasificación

 

 

 

 

Usar UNION para devolver sólo las filas únicas entre el conjunto de resultados

Utilice UNION ALL para devolver todas las filas entre los conjuntos de resultados, incluyendo los duplicados

Utilice INTERSECT para devolver sólo las filas que coinciden en el lado izquierda y derecho del operador INTERSECT

Uso, EXCEPT para devolver sólo las filas de la izquierda que no existen en el lado derecho

Ejecutar consultas recursivas optimizadas

Consultar un documento XML

Devolver resultados formateados como XML

Especifique una “expresión de tabla común” (CTE)

Utilice el método query ()

Especifique la cláusula FOR XML utilizando las directivas AUTO, PATH RAW, o EXPLÍCIT dependiendo del formato que necesita.

www.detodoprogramacion.com

Page 170: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10

Manipulación de datos

Después de completar este capítulo, usted será capaz de

 

 

 

Emitir comandos INSERT, UPDATE, DELETE, y MERGE

Administrar transacciones

Configurar y utilizar el seguimiento de cambios (change tracking)

En este capítulo, usted aprenderá cómo agregar, modificar y eliminar filas de una tabla. También aprenderá a crear una nueva tabla e insertar datos en una sola operación. Lo básico para la capacidad de manipular los datos es gestionar las operaciones y el bloqueo dentro de una base de datos. Finalmente, usted aprenderá acerca de las nuevas características de seguimiento de cambio de datos en SQL Server 2008.

Insertando datos

SQL Server proporciona varias maneras de agregar e insertar datos en una tabla. En esta sección, usted aprenderá cómo construir una instrucción INSERT básica que especifica los datos que se introducen en una tabla. Usted también aprenderá cómo insertar datos utilizando alto rendimiento, minimizando las operaciones de log.

INSERT

La sintaxis general para INSERT es:

INSERT

[ TOP ( expression ) [ PERCENT ] ] [ INTO ] { <object> | rowset_function_limited

[ WITH ( <Table_Hint_Limited> [ ...n ] ) ] } { [ ( column_list ) ]

[ <OUTPUT Clause> ] { VALUES ( ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] ) | derived_table | execute_statement | <dml_table_source> | DEFAULT VALUES } }

<object> ::= {[ server_name . database_name . schema_name . | database_name .[ schema_name ] .

| schema_name. ] table_or_view_name} <dml_table_source> ::=

SELECT <select_list> FROM ( <dml_statement_with_output_clause> )

[AS] table_alias [ ( column_alias [ ,...n ] ) ] [ WHERE <search_condition> ]

[ OPTION ( <query_hint> [ ,...n ] ) ]

153

www.detodoprogramacion.com

Page 171: Microsoft SQL Server 2008 Español - Mike Hotek

154 Parte III Recuperar y manipular datos

La forma más común de una declaración INSERT es la siguiente:

INSERT INTO <table> (<column list>) VALUES (<value>, <value>, <value>, . . .n)

La lista de columnas para una declaración INSERT es opcional, siempre y cuando se especifique un valor para todas las columnas en la tabla. Sin embargo, al igual que la escritura SELECT * , la omisión de la lista de columnas se considera un descuido de programación y no se recomienda. Los valores de datos se insertan en las columnas de la tabla en base a la posición dentro de la cláusula VALUES. Si una columna tiene una restricción predeterminada definida, en lugar de proporcionar un valor, se puede especificar la palabra clave DEFAULT para hacer que el valor definido por la restricción sea suministrado para la columna.

Antes de SQL Server 2008, sólo se podía insertar una fila a la vez en una tabla cuando se utiliza la cláusula

VALUES. Ahora se pueden realizar inserciones de varias filas repitiendo el conjunto de valores de datos.

Mediante la sustitución de la cláusula VALUES con cualquiera declaración SELECT válida, puede insertar datos en una tabla basados en datos que ya existen en una o más tablas.

Nota Puede insertar en una tabla un conjunto de resultados devuelto por un procedimiento almacenado mediante el uso de INSERT INTO <nombre de tabla> EXEC <nombre del procedimiento >. Usted aprenderá más acerca de los procedimientos almacenados en el capítulo 13, "Funciones".

En el siguiente ejercicio, llenará varias tablas del tipo lookup, agregará las ProductOptions e insertará un nuevo cliente.

Insertar datos

1. Abra una nueva ventana de consulta y ejecute el siguiente código para llenar los tipos de direcciones (El código está en el archivo Capítulo10\code1.sql):

INSERT INTO LookupTables.AddressType (AddressType) VALUES('Corporate'),('Warehouse'),('Home'),('Work') GO SELECT AddressTypeID, AddressType FROM LookupTables.AddressType GO

2. Ejecute el siguiente código para llenar las categorías de productos (el código está en el archivo de muestra Capítulo10\code1.sql):

INSERT INTO LookupTables.ProductCategory (Category) VALUES ('Power Tools'),('Clothing'),('Accessories') GO SELECT CategoryID, Category FROM LookupTables.ProductCategory GO

www.detodoprogramacion.com

Page 172: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 155

3. Ejecute el siguiente código para llenar las subcategorías de productos (el código está en el archivo

Capítulo10\code1.sql de las muestras que acompañan el libro):

DECLARE @CategoryID INT SELECT @CategoryID = CategoryID FROM LookupTables.ProductCategory WHERE Category = 'Power Tools' INSERT INTO LookupTables.ProductSubCategory (CategoryID, SubcategoryName) VALUES (@CategoryID,'Router'),(@CategoryID,'Table Saw'),

(@CategoryID,'Drill Press'),(@CategoryID,'Belt Sander'), (@CategoryID,'Jointer')

GO DECLARE @CategoryID INT SELECT @CategoryID = CategoryID FROM LookupTables.ProductCategory WHERE Category = 'Accessories' INSERT INTO LookupTables.ProductSubCategory (CategoryID, SubcategoryName) VALUES (@CategoryID,'Saw Blade'),(@CategoryID,'Drill Bit'),

(@CategoryID,'Router Bit') GO SELECT SubcategoryID, CategoryID, SubcategoryName FROM LookupTables.ProductSubCategory GO

4. Ejecute el siguiente código para llenar los países en base a los datos de la Base de datos de ejemplo AdventureWorks (el código está en el archivo Capítulo10\code1.sql):

INSERT INTO LookupTables.Country (CountryName) SELECT Name FROM AdventureWorks.Person.CountryRegion GO SELECT CountryID, CountryName FROM LookupTables.Country GO

5. Ejecute el siguiente código para llenar los estados/provincias en base a los datos de la Base de datos AdventureWorks (el código está en el archivo Capítulo 10\ code1.sql:

DECLARE @CountryID INT SELECT @CountryID = CountryID FROM LookupTables.Country WHERE CountryName = 'United States'

www.detodoprogramacion.com

Page 173: Microsoft SQL Server 2008 Español - Mike Hotek

156 Parte III Recuperar y manipular datos

INSERT INTO LookupTables.StateProvince (CountryID, StateProvince, StateProvinceAbbrev) SELECT @CountryID, Name, StateProvinceCode FROM AdventureWorks.Person.StateProvince WHERE CountryRegionCode = 'US' GO DECLARE @CountryID INT SELECT @CountryID = CountryID FROM LookupTables.Country WHERE CountryName = 'Canada' INSERT INTO LookupTables.StateProvince (CountryID, StateProvince, StateProvinceAbbrev) SELECT @CountryID, Name, StateProvinceCode FROM AdventureWorks.Person.StateProvince WHERE CountryRegionCode = 'CA' GO DECLARE @CountryID INT SELECT @CountryID = CountryID FROM LookupTables.Country WHERE CountryName = 'France' INSERT INTO LookupTables.StateProvince (CountryID, StateProvince, StateProvinceAbbrev) SELECT @CountryID, Name, StateProvinceCode FROM AdventureWorks.Person.StateProvince WHERE CountryRegionCode = 'FR' GO DECLARE @CountryID INT SELECT @CountryID = CountryID FROM LookupTables.Country WHERE CountryName = 'Australia' INSERT INTO LookupTables.StateProvince (CountryID, StateProvince, StateProvinceAbbrev) SELECT @CountryID, Name, LEFT(StateProvinceCode,2) FROM AdventureWorks.Person.StateProvince WHERE CountryRegionCode = 'AU' GO DECLARE @CountryID INT SELECT @CountryID = CountryID FROM LookupTables.Country WHERE CountryName = 'Germany' INSERT INTO LookupTables.StateProvince (CountryID, StateProvince, StateProvinceAbbrev) SELECT @CountryID, Name, StateProvinceCode FROM AdventureWorks.Person.StateProvince WHERE CountryRegionCode = 'DE' GO

www.detodoprogramacion.com

Page 174: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos

SELECT StateProvinceID, CountryID, StateProvince, StateProvinceAbbrev FROM LookupTables.StateProvince GO

157

6. Ejecute el siguiente código para agregar un nuevo cliente (el código está en el archivo Capítulo 10\ code1.sql de los ejemplos que acompañan el libro):

INSERT INTO Customers.Customer (CompanyName) VALUES('Wide World Importers') GO SELECT CustomerID, CompanyName, FirstName, LastName, ModifiedDate FROM Customers.Customer GO

7. Ejecute el siguiente código para agregar las direcciones de los clientes (el código está en el archivo Capítulo 10\ code1.sql:

DECLARE @CustomerID INT, @AddressTypeID INT, @StateProvinceID INT, @CountryID INT --Retrieve IDs for Customer, Address Type, StateProvince, and Country SELECT @CustomerID = CustomerID FROM Customers.Customer WHERE CompanyName = 'Wide World Importers' SELECT @AddressTypeID = AddressTypeID FROM LookupTables.AddressType WHERE AddressType = 'Warehouse' SELECT @StateProvinceID = StateProvinceID FROM LookupTables.StateProvince WHERE StateProvinceAbbrev = 'WA' SELECT @CountryID = CountryID FROM LookupTables.Country WHERE CountryName = 'United States' INSERT INTO Customers.CustomerAddress (CustomerID, AddressTypeID, AddressLine1, AddressLine2, AddressLine3, City, StateProvinceID, CountryID) VALUES (@CustomerID, @AddressTypeID, '123 Elm St.', NULL, NULL, 'Seattle', @StateProvinceID, @CountryID) GO SELECT AddressID, CustomerID, AddressTypeID, AddressLine1, AddressLine2, AddressLine3, City, StateProvinceID, CountryID FROM Customers.CustomerAddress GO

www.detodoprogramacion.com

Page 175: Microsoft SQL Server 2008 Español - Mike Hotek

158 Parte III Recuperar y manipular datos

Nota Si se ejecuta el INSERT en la tabla de clientes en el mismo lote que el INSERT en la tabla de direcciones de cliente, puede utilizar la función SCOPE_IDENTITY () para almacenar el valor CustomerID en la variable @CustomerID. Sin embargo, usted tendría que asegurarse de que la declaración INSERT de la tabla de clientes sólo inserta una única fila para que SCOPE_IDENTITY () esté válidamente almacenado en una variable ya que la variable @CustomerID sólo puede almacenar un único valor.

8. Ejecute el siguiente código para crear la tabla ProductOptions (el código está en el archivo Capítulo 10\code1.sql):

CREATE TABLE Products.ProductOptions (SKU CHAR(10) NOT NULL, ProductID INT NOT NULL, OptionDesc VARCHAR(50) NOT NULL, UnitPrice MONEY NOT NULL,

CONSTRAINT pk_productoptions PRIMARY KEY CLUSTERED (SKU)) GO ALTER TABLE Orders.OrderDetail ADD CONSTRAINT fk_productoptionstoorderdetail FOREIGN KEY (SKU) REFERENCES Products.ProductOptions (SKU) GO

9. Ejecute el siguiente código para agregar varios productos nuevos (el código está en el archivo Capítulo 10 \ code1.sql):

DECLARE @Subcategory INT SELECT @Subcategory = SubcategoryID FROM LookupTables.ProductSubCategory WHERE SubcategoryName = 'Router Bit' INSERT INTO Products.Product (SubcategoryID, ProductName, ProductCost, ListPrice) VALUES (@Subcategory, '1/4" Shank Round Over', 2.64, 4.99),

(@Subcategory, '1/2" Shank Round Over', 3.11, 5.99) SELECT @Subcategory = SubcategoryID FROM LookupTables.ProductSubCategory WHERE SubcategoryName = 'Saw Blade' INSERT INTO Products.Product (SubcategoryID, ProductName, ProductCost, ListPrice) VALUES (@Subcategory, '10"x40Tx5/8" Combination Blade', 21.58, 47.99),

(@Subcategory, '10"x50Tx5/8 Thin Kerf Combination Blade', 22.65, 58.99) GO SELECT ProductID, SubcategoryID, ProductName, ProductCost, ListPrice,

ProductMargin, ProductDescription FROM Products.Product GO

www.detodoprogramacion.com

Page 176: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 159

10. Ejecute el siguiente código para agregar varias filas a la tabla de opciones de productos (el código está en el archivo Capítulo10\code1.sql):

DECLARE @ProductID INT SELECT @ProductID = ProductID FROM Products.Product WHERE ProductName = '1/4" Shank Round Over' INSERT INTO Products.ProductOptions (SKU, ProductID, OptionDesc, UnitPrice) VALUES('1-4RB1-2RO',@ProductID, '1/2" Radius Round Over Bit', 4.99), ('1-4RB1-4RO',@ProductID, '1/4" Radius Round Over Bit', 4.99) GO DECLARE @ProductID INT SELECT @ProductID = ProductID FROM Products.Product WHERE ProductName = '1/2" Shank Round Over' INSERT INTO Products.ProductOptions (SKU, ProductID, OptionDesc, UnitPrice) VALUES('1-2RB1-2RO',@ProductID, '1/2" Radius Round Over Bit', 5.99), ('1-2RB1-4RO',@ProductID, '1/4" Radius Round Over Bit', 5.99), ('1-2RB3-4RO',@ProductID, '3/4" Radius Round Over Bit', 7.99) GO SELECT SKU, ProductID, OptionDesc, UnitPrice FROM Products.ProductOptions GO

SELECT INTO

La declaración SELECT INTO combina SELECT, INSERT, y CREATE TABLE en una sola declaración. El SELECT define el conjunto de resultados a devolver desde una consulta. En base a los nombres de Columna y los tipos de datos, SQL Server crea una nueva tabla con el nombre definido por la cláusula INTO. La tabla recién creada también heredará las propiedades de nulabilidad y de identidad de las columnas de las tablas de base de la cláusula SELECT. Una vez creada, el contenido del conjunto de resultados son insertados en la nueva tabla. Un ejemplo de una declaración SELECT INTO es:

SELECT CustomerID, CompanyName, FirstName, LastName, ModifiedDate INTO #Customer FROM Customers.Customer GO

Actualización de los datos

Con el fin de modificar los datos que se almacenan en una tabla, es necesario utilizar una declaración UPDATE, la cual tiene la siguiente sintaxis general:

www.detodoprogramacion.com

Page 177: Microsoft SQL Server 2008 Español - Mike Hotek

160 Parte III Recuperar y manipular datos

UPDATE

[ TOP ( expression ) [ PERCENT ] ] { <object> | rowset_function_limited [ WITH ( <Table_Hint_Limited> [ ...n ] ) ] }

SET { column_name = { expression | DEFAULT | NULL } | { udt_column_name.{ { property_name = expression | field_name = expression } | method_name ( argument [ ,...n ] ) } } | column_name { .WRITE ( expression , @Offset , @Length ) } | @variable = expression | @variable = column = expression | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression}

[ ,...n ] [ <OUTPUT Clause> ] [ FROM{ <table_source> } [ ,...n ] ] [ WHERE { <search_condition>

| { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name}]}}] [ OPTION ( <query_hint> [ ,...n ] ) ][ ; ]

La forma más simple de una declaración UPDATE utiliza las cláusulas UPDATE y SET como se muestra en el siguiente ejemplo:

UPDATE Products.Product SET ListPrice = 10 GO

A menos que las filas afectadas por un UPDATE estén restringidas por las cláusulas FROM y/o WHERE, cada fila de la tabla se modificará. Dado que rara vez se desean modificar todas las filas en una tabla, se deben restringir las filas que aplican a un UPDATE a través de las cláusulas FROM y WHERE. La cláusula SET define la columna(s) a modificar. El nuevo valor de la columna a modificar puede ser:

 

 

 

 

Un valor estático

El resultado de un cálculo

Una variable

Una columna de una tabla o una función

En el siguiente ejercicio, usted hará cambios en las tablas OrderHeader y Product.

Actualización de Datos

1. Ejecute la siguiente consulta para aumentar el precio unitario de todas las opciones del producto en un 10% (El código está en el archivo Capítulo10\code1.sql):

UPDATE Products.ProductOptions SET UnitPrice = UnitPrice * 1.1 GO

www.detodoprogramacion.com

Page 178: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 161

2. Ejecute la siguiente consulta para aumentar el precio de lista de todos los productos con un precio de lista entre $ 4,99 y $ 5,99 (el código está en el archivo Capítulo 10\code1.sql):

UPDATE Products.Product SET ListPrice = ListPrice * 1.1 WHERE ListPrice BETWEEN 4.99 AND 5.99 GO

3. Debido a un gran aumento en el costo del acero, es necesario aumentar el costo de todas las hojas de sierra en un 30%. Marketing ha determinado que los clientes sólo pagarán un 10% adicional para las hojas de sierra. Ejecute la siguiente consulta para hacer los ajustes necesarios (El código está en el archivo Capítulo10\code1.sql):

UPDATE a SET a.ProductCost = a.ProductCost * 1.3,

a.ListPrice = a.ListPrice * 1.1 FROM Products.Product a INNER JOIN LookupTables.ProductSubCategory b

ON a.SubcategoryID = b.SubcategoryID WHERE b.SubcategoryName = 'Saw Blade' GO

4. Después de hacer los ajustes, usted quiere establecer el precio de todas las brocas redondas de 1/4" al nuevo precio de lista (el código está en el archivo Capítulo10\code1.sql):

UPDATE a SET a.UnitPrice = b.ListPrice FROM Products.ProductOptions a INNER JOIN Products.Product b ON a.ProductID = b.ProductID WHERE b.ProductName LIKE '1/4" Shank%' GO

Eliminación de datos

Si usted necesita eliminar los datos de una tabla, puede ejecutar una declaración DELETE, que tiene esta sintaxis general:

DELETE [ TOP ( expression ) [ PERCENT ] ]

[ FROM ] { <object> | rowset_function_limited [ WITH ( <table_hint_limited> [ ...n ] ) ]}

[ <OUTPUT Clause> ]

[ FROM <table_source> [ ,...n ] ] [ WHERE { <search_condition>

| { [ CURRENT OF { { [ GLOBAL ] cursor_name } | cursor_variable_name }]}}] [ OPTION ( <Query Hint> [ ,...n ] ) ]

La forma más simple de una declaración DELETE sólo requiere un nombre de tabla con la palabra clave FROM opcional. Por lo tanto, DELETE Products.Product es equivalente a DELETE FROM Products.Product. Se recomienda que utilice la palabra clave FROM, tanto para claridad

www.detodoprogramacion.com

Page 179: Microsoft SQL Server 2008 Español - Mike Hotek

162 Parte III Recuperar y manipular datos

como para legibilidad, de modo que alguien que lea el código no tenga la impresión de que está eliminando, “DROP”, la tabla.

Al igual que se vio con la declaración UPDATE, si no restringe las filas afectadas por la declaración DELETE utilizando una cláusula WHERE o FROM, usted hará DELETE a todas las filas de una tabla.

Nota Tenga en cuenta que si su declaración UPDATE o DELETE causara que una FOREIGN KEY sea

violada, toda la declaración falla y ninguna de las filas se verán afectadas.

En el siguiente ejercicio, se eliminarán los datos de varias tablas dentro de la base de datos SQL2008SBS. Puesto que los datos que usted quiere borrar de la base de datos no han sido introducidos, vamos a insertar algunos datos de prueba para realizar luego las operaciones de borrado. Este es un proceso común por el que pasará cuando pruebe una aplicación de base de datos.

Eliminar datos

1. Ejecute la siguiente consulta para agregar una fila a la tabla ProductOptions (el código está en el archivo Capítulo 10\code1.sql):

INSERT INTO Products.ProductOptions (SKU, ProductID, OptionDesc, UnitPrice) VALUES('123SKU',1,'Dummy description',1.99) GO SELECT SKU, ProductID, OptionDesc, UnitPrice FROM Products.ProductOptions WHERE SKU = '123SKU' GO

2. Ejecute la siguiente consulta para eliminar la fila que acaba de agregar a la tabla ProductOptions

(el código está en el archivo Capítulo10 \code1.sql):

DELETE FROM Products.ProductOptions WHERE SKU = '123SKU' GO SELECT SKU, ProductID, OptionDesc, UnitPrice FROM Products.ProductOptions WHERE SKU = '123SKU' GO

3. Ejecute la siguiente consulta para agregar filas a las tablas OrderHeader y OrderDetail (El código está en el archivo Capítulo10 \code1.sql):

DECLARE @OrderID INT INSERT INTO Orders.OrderHeader (CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, FinalShipDate) VALUES(1,'7/18/2008',100.83,0,5.00,'7/18/2008')

www.detodoprogramacion.com

Page 180: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos

SET @OrderID = SCOPE_IDENTITY() INSERT INTO Orders.OrderDetail (OrderID, SKU, Quantity, UnitPrice, ShipDate) VALUES(@OrderID,'1-4RB1-2RO',1,4.99,'7/18/2008'),(@OrderID,'1-2RB1- 2RO',16,5.99,'7/18/2008') GO SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, GrandTotal, FinalShipDate FROM Orders.OrderHeader SELECT OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate FROM Orders.OrderDetail GO

163

4. Ejecute la siguiente consulta para mover las filas, para archivar (histórico) los pedidos completados y eliminarlos de las tablas OrderHeader y OrderDetail (el código está en el archivo Capítulo 10\code1.sql en las muestras que acompañan el libro):

INSERT INTO Archive.OrderHeader (OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, FinalShipDate) SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, FinalShipDate FROM Orders.OrderHeader WHERE FinalShipDate IS NOT NULL GO INSERT INTO Archive.OrderDetail (OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate) SELECT a.OrderDetailID, a.OrderID, a.SKU, a.Quantity, a.UnitPrice, a.ShipDate FROM Orders.OrderDetail a INNER JOIN Orders.OrderHeader b ON a.OrderID = b.OrderID WHERE b.FinalShipDate IS NOT NULL GO SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, GrandTotal, FinalShipDate FROM Archive.OrderHeader SELECT OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate FROM Archive.OrderDetail GO DELETE FROM a FROM Orders.OrderDetail a INNER JOIN Archive.OrderDetail b ON a.OrderDetailID = b.OrderDetailID GO DELETE FROM a FROM Orders.OrderHeader a INNER JOIN Archive.OrderHeader b ON a.OrderID = b.OrderID GO SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, GrandTotal, FinalShipDate FROM Orders.OrderHeader

www.detodoprogramacion.com

Page 181: Microsoft SQL Server 2008 Español - Mike Hotek

164 Parte III Recuperar y manipular datos

SELECT OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate FROM Orders.OrderDetail GO

TRUNCAR

Si tiene que eliminar todas las filas de una tabla mediante una forma rápida y eficiente, TRUNCATE proporciona un mejor rendimiento que el uso de un DELETE sin una cláusula WHERE. La sintaxis general de TRUNCATE es:

TRUNCATE TABLE [ { database_name.[ schema_name ]. | schema_name . } ] table_name

TRUNCATE TABLE sólo se puede utilizar para eliminar todas las filas de una tabla. No se puede eliminar sólo una parte de las filas. TRUNCATE TABLE sólo se puede ejecutar en tablas que no son referenciadas por una FOREIGN KEY.

En el siguiente ejercicio, creará una copia de la tabla de productos con SELECT INTO y luego aplicará TRUNCATE a la tabla que acaba de crear.

Truncar datos

1. Ejecute la siguiente consulta para generar una copia de la tabla Product y luego hacer el TRUNCATE a la tabla:

SELECT ProductID, SubcategoryID, ProductName, ProductCost, ListPrice, ProductMargin, ProductDescription INTO dbo.TestProduct FROM Products.Product GO SELECT ProductID, SubcategoryID, ProductName, ProductCost, ListPrice, ProductMargin, ProductDescription FROM dbo.TestProduct GO TRUNCATE TABLE dbo.TestProduct GO SELECT ProductID, SubcategoryID, ProductName, ProductCost, ListPrice, ProductMargin, ProductDescription FROM dbo.TestProduct GO DROP TABLE dbo.TestProduct GO

Sentencia MERGE

Nuevo en SQL Server 2008, MERGE le permite realizar múltiples INSERT, UPDATE y DELETE en una sola sentencia. Basado en los criterios de selección especificados en la declaración MERGE, usted puede aplicar condicionalmente declaraciones INSERT, UPDATE, y DELETE a la tabla.

www.detodoprogramacion.com

Page 182: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 165

Por ejemplo, es posible que desee actualizar una fila si ya existía o insertar la fila si es que todavía no está en la tabla. También puede ser que desee sincronizar el contenido de dos tablas.

La sintaxis general para MERGE es:

MERGE [ TOP ( expression ) [ PERCENT ] ] [ INTO ] target_table [ [ AS ] table_alias ]

[ WITH ( <merge_hint> ) ] USING <table_source> ON <search_condition> [ WHEN MATCHED [ AND <search_condition> ]

THEN <merge_matched> ] [ WHEN [TARGET] NOT MATCHED [ AND <search_condition> ]

THEN <merge_not_matched> ] [ WHEN SOURCE NOT MATCHED [ AND <search_condition> ]

THEN <merge_ matched> ] <output_clause> <merge_matched>::= { UPDATE SET <set_clause> | DELETE } <merge_not_matched>::= INSERT [ ( <column_list> ) ] { VALUES ( <values_list> )

| DEFAULT VALUES }

La cláusula INTO especifica la tabla destino para las operaciones INSERT, UPDATE y DELETE. La cláusula USING ... ON especifica la tabla o consulta para aplicar como condición de búsqueda para los criterios de coincidencia (matching). Las cláusulas WHEN especifican las acciones a realizar en función de sihubo o no coincidencia en los criterios de búsqueda.

En el siguiente ejercicio, también se creará una tabla ProductInventory para realizar un seguimiento del inventario de los productos a través de una tabla ProductShipment para la recepción de nuevo inventario. Al final de cada día, se ejecuta un proceso para mantener la tabla ProductInventory en base a nuevos envíos. Si el producto ya existe en la tabla ProductInventory, agregará el inventario a la fila existente, de lo contrario insertará una nueva fila.

Realizar múltiples operaciones basadas en condiciones

1. Ejecute la siguiente consulta para crear las tablas ProductInventory y FinishedProduct (El código está en el archivo Capítulo10\code1.sql):

CREATE TABLE Products.ProductInventory (ProductID INT NOT NULL, Quantity INT NOT NULL, CONSTRAINT pk_productinventory PRIMARY KEY CLUSTERED (ProductID)) GO ALTER TABLE Products.ProductInventory ADD CONSTRAINT fk_producttoproductinventory FOREIGN KEY (ProductID) REFERENCES Products.Product (ProductID) GO

www.detodoprogramacion.com

Page 183: Microsoft SQL Server 2008 Español - Mike Hotek

166 Parte III Recuperar y manipular datos

CREATE TABLE Products.ProductShipment (ProductID INT NOT NULL, Quantity INT NOT NULL, ReceiveDate DATE NOT NULL CONSTRAINT df_productshipment_receivedate DEFAULT GETDATE(), CONSTRAINT pk_productshipment PRIMARY KEY CLUSTERED (ProductID)) ALTER TABLE Products.ProductShipment

ADD CONSTRAINT fk_producttoproductshipment FOREIGN KEY (ProductID) REFERENCES Products.Product (ProductID)

GO

2. Ejecute la siguiente consulta para gestionar la tabla ProductInventory (el código está en el archivo Capítulo 10\code1.sql):

INSERT INTO Products.ProductInventory (ProductID, Quantity) VALUES(1,100) GO INSERT INTO Products.ProductShipment (ProductID, Quantity, ReceiveDate) VALUES(1,25,GETDATE()),(2,50,GETDATE()) GO SELECT ProductID, Quantity FROM Products.ProductInventory SELECT ProductID, Quantity, ReceiveDate FROM Products.ProductShipment GO MERGE Products.ProductInventory AS target USING (SELECT ProductID, Quantity

FROM Products.ProductShipment WHERE ReceiveDate = CAST(GETDATE() AS DATE)) AS source

ON (target.ProductID = source.ProductID) WHEN MATCHED

THEN UPDATE SET target.Quantity = target.Quantity + source.Quantity WHEN NOT MATCHED BY TARGET THEN

INSERT (ProductID, Quantity) VALUES(source.ProductID, source.Quantity);

GO SELECT ProductID, Quantity FROM Products.ProductInventory SELECT ProductID, Quantity, ReceiveDate FROM Products.ProductShipment GO

Cláusula OUTPUT

En el curso de las operaciones DML, es posible que necesite recuperar el estado de las filas que están siendo modificadas. En el marco de las operaciones de DML, SQL Server ofrece dos tablas especiales denominadas inserted y deleted . Estas tablas son creadas automáticamente

www.detodoprogramacion.com

Page 184: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 167

y gestionadas por el servidor de SQL con la misma estructura de la tabla que está siendo modificada. Las tablas inserted y deleted están en el ámbito de una conexión y no pueden ser accedidas por cualquier otro usuario. Estas tablas existen siempre que una modificación de datos está en curso, la transacción está abierta, y además son válidas sólo para la modificación de los datos que actualmente está siendo ejecutada.

La tabla inserted contiene el estado de la(s) fila(s) modificada(s) después que ya se producido la modificación, denominado como “la imagen después”. La tabla deleted contiene el estado de la(s) fila(s) modificada(s) antes de la modificación de los datos, conocida como “la imagen antes”.

Dado que una declaración INSERT es sólo la adición de nuevas filas a una tabla, la tabla deleted siempre estará vacía. Cuando se ejecuta una instrucción DELETE, las filas se eliminan de la tabla, y la tabla inserted siempre estará vacía. Una declaración UPDATE, dado que modifica una fila ya existente, tendrá entradas tanto en la tabla inserted como en deleted . Para una declaración MERGE, las tablas inserted y deleted , se rellenan en función de si se ejecuta un INSERT, UPDATE, o DELETE desde la sentencia MERGE.

Antes de SQL Server 2005, sólo se podía acceder a las tablas inserted y deleted desde dentro un trigger. Ahora puede acceder a estas dos tablas directamente en el ámbito de una declaración INSERT, UPDATE, DELETE, o MERGE mediante la utilización de la cláusula OUTPUT.

La cláusula OUTPUT se puede utilizar de dos maneras dentro de una operación DML:

1. Para devolver como resultado el contenido de las tablas insertadas o eliminados directamente a una aplicación.

2. Para insertar el contenido de las tablas inserted y/o deleted en una tabla o variable de tabla.

Gestión de Transacción

Los Motores de base de datos no están diseñados para simplemente almacenar datos. Una característica fundamental de cualquier motor de base de datos es garantizar la consistencia de datos al tiempo que permite el máximo acceso simultáneo a los mismos. Si nunca cambiaran los datos dentro de las bases de datos de SQL Server, el tema de la consistencia nunca ocurriría. Sin embargo, un usuario puede cambiar los datos mientras otros usuarios están intentando leer los mismos datos.

Cada vez que un usuario realiza un cambio a los datos, puede decidir ya sea guardarlos, COMMIT, o descartarlos, ROLLBACK. SQL Server tiene que garantizar que los usuarios que leen los datos siempre reciban datos que se han confirmado en la base (commit), con el fin de asegurar resultados consistentes.

Cada unidad de trabajo que usted envíe a SQL Server es una transacción. Cada transacción está delimitada ya sea implícita o explícitamente. Una transacción se construye con BEGIN TRAN, seguido por uno o más comandos a ejecutar. La operación es finalizada por un COMMIT TRAN o ROLLBACK TRAN. Una transacción explícita se produce cuando usted escribe el código BEGIN TRAN. . . COMMIT TRAN / ROLLBACK TRAN. Una transacción implícita se produce cuando sólo hay que ejecutar un comando tal como un INSERT, UPDATE, o DELETE y deja en manos de SQL Server anteponer el o los

www.detodoprogramacion.com

Page 185: Microsoft SQL Server 2008 Español - Mike Hotek

168 Parte III Recuperar y manipular datos

comando(s) con un BEGIN TRAN y finalizar el lote con un COMMIT TRAN. Por ejemplo, todos los lotes que se han presentado hasta ahora en este libro ha sido una transacción implícita.

Las transacciones se pueden anidar. Por ejemplo:

BEGIN TRAN <do something> BEGIN TRAN <do something> BEGIN TRAN <do something> COMMIT TRAN COMMIT TRAN COMMIT TRAN

BEGIN TRAN iniciará una nueva transacción. COMMIT TRAN guarda la transacción más interna. ROLLBACK TRAN revertirá todas las transacciones para la conexión, deshaciendo cualquier cambio que se haya hecho, y liberando todos los bloqueos.

BEGIN TRAN y COMMIT TRAN delimitan una transacción. SQL Server aplica bloqueos sobre los datos para asegurar que las aplicaciones siempre puedan recuperar un conjunto de datos consistente. Los bloqueos se apoderan de un recurso cuando comienza la transacción y se libera cuando la transacción se confirma o se revierte. Los tipos de bloqueo utilizados por SQL Server son:

 

 

 

Compartido (shared)

Exclusivo (exclusive)

Actualización (update)

El tipo de bloqueo que se asigna depende de la operación que se realiza. Usted sólo puede tener un tipo de bloqueo asignado a un recurso a la vez. Por ejemplo, si usted tiene un bloqueo compartido en una fila de datos, no se puede asignar un bloqueo exclusivo sobre la misma fila.

Un bloqueo compartido se asigna para una sentencia SELECT. Dado que una declaración SELECT no modifica ningún dato, puede tener varios bloqueos compartidos sobre un solo recurso en cualquier momento. Un bloqueo compartido evitará que ocurra un bloqueo exclusivo.

Un bloqueo exclusivo se obtiene en un recurso cuando se ejecuta un INSERT o DELETE. El bloqueo exclusivo evitará que cualquier otra conexión acceda al recurso bloqueado hasta que la transacción se haya completado. Por su propia naturaleza, sólo puede tener un único bloqueo exclusivo sobre un recurso en cualquier momento.

Un bloqueo de actualización en realidad es un caso especial de un bloqueo compartido junto con un bloqueo exclusivo. Con el fin de realizar una actualización, SQL Server tiene que localizar la fila en la tabla. Una declaración UPDATE se inicia con la adquisición de un bloqueo de actualización de SQL Server mientras se localiza la fila (s) que desea modificar y a continuación, una vez que todas las filas afectadas han sido localizadas, cambia el bloqueo en un bloqueo exclusivo.

www.detodoprogramacion.com

Page 186: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 169

Los bloqueos también se pueden asignar a tres niveles diferentes:

 

 

 

Fila

Página

Tabla

SQL Server administra automáticamente el nivel de recursos para un bloqueo, en base a la minimización de los recursos requeridos para mantener un bloqueo. Por ejemplo, si tiene que acceder a un 50% de las filas en una página, se requieren menos recursos para SQL Server para aplicar un bloqueo en la página de lo que costaría aplicar y mantener decenas o cientos de bloqueos en varias filas.

SQL Server realiza una suposición sobre el nivel de bloqueo necesario, basándose en las estadísticas proporcionadas por el optimizador. Aunque desearíamos que la primera aproximación sea siempre precisa, las estadísticas del optimizador no son siempre exactas para cada tipo de consulta. Por lo tanto, SQL Server tiene la capacidad de promover bloqueos utilizando un mecanismo llamado “extensión de bloqueo” (lock escalation). La extensión de bloqueo puede promover un bloqueo a nivel de fila a un bloqueo a nivel de tabla o un bloqueo a nivel de página a un bloqueo de tabla.

El bloqueo y la extensión de bloqueo se basan en una regla de 2%. Si las estadísticas del optimizador determinan que sus transacciones afectan a más del 2% de las filas en una página, pero menos del 2% de las páginas de una tabla, todas sus transacciones tendrán un bloqueo a nivel de página. Si el optimizador determina que afectará a menos del 2% de las filas en una página, adquirirá un bloqueo a nivel de fila. Sin embargo, si durante el transcurso de la transacción, SQL Server determina que en realidad se está afectando más del 2% de las filas o 2% de las páginas, el bloqueo se escalará a nivel de tabla.

La granularidad de un bloqueo es muy importante para la concurrencia en una aplicación. Si usted tiene adquirido un bloqueo de tabla exclusivo, todas las solicitudes para acceder a la tabla tendrán que esperar hasta que se libere el bloqueo. Obviamente, uno siempre quiere adquirir el bloqueo lo más granular posible. Sin embargo, la granularidad del bloqueo no es la única métrica importante. La cantidad de tiempo que se mantiene un bloqueo es tan importante como la granularidad del mismo.

La extensión de bloqueo en SQL Server está diseñada para adquirir bloqueos por el menor tiempo posible. Por lo tanto, el hecho de que SQL Server adquiera un bloqueo exclusivo de tabla, no significa que usted tiene un problema de simultaneidad, siempre y cuando el bloqueo no se mantenga durante un largo período de tiempo. El desafío de un desarrollador de aplicaciones es diseñar transacciones que cumplan los requisitos de negocio, mientras que también se minimiza la cantidad de tiempo de los bloqueos que se llevan a cabo dentro de la base de datos.

Cuando un recurso se bloquea y otra conexión necesita adquirir un bloqueo en el mismo recurso, pero con un bloqueo que compite, la segunda conexión tendrá que esperar a que el anterior bloqueo sea liberado. Por ejemplo, connectionA tiene un bloqueo de fila compartida y connectionB quiere adquirir un bloqueo exclusivo en la misma fila. Cuando una conexión tiene que esperar que un bloqueo sea liberado, la conexión que está esperando está bloqueada. Bajo ciertas circunstancias, es posible para dos conexiones crear una situación de bloqueo, donde la primera conexión necesita acceso exclusivo a los recursos que una segunda conexión tiene con un bloqueo compartido, mientras que al mismo tiempo

www.detodoprogramacion.com

Page 187: Microsoft SQL Server 2008 Español - Mike Hotek

170 Parte III Recuperar y manipular datos

la segunda conexión requiere un bloqueo exclusivo sobre los recursos que la primera conexión tiene con un

bloqueo compartido. Cuando las conexiones requieren dos bloqueos por los que compiten sobre los recursos de tal manera que no pueden adquirir los bloqueos necesarios para completar una transacción, se produce un punto muerto (deadlock).

Nota El libro “Inside SQL Server 2008” y los “Libros en pantalla” contienen información detallada sobre bloqueo, blocking e interbloqueos.

La pieza final del rompecabezas de la gestión de transacciones es el nivel de aislamiento. Los niveles de aislamiento determinan qué tipos de bloqueos se realizan y cuando estos bloqueos pueden ser liberados durante la transacción. SQL Server 2008 tiene cinco niveles de aislamiento:

 

 

 

 

 

Lectura no confirmada (Read Uncommitted)

Lectura confirmada (Read Committed)

Lectura repetible (Repeatable read)

Serializable

Instantánea (Snapshot)

Lectura confirmada es el nivel de aislamiento predeterminado en SQL Server. Lectura confirmada impedirá una conexión de lectura de datos que están en proceso de cambio. Los bloqueos compartidos son liberados tan pronto como SQL Server ha leído los datos.

El nivel de aislamiento “Lectura no confirmada” le permite a una conexión leer los datos que están en el proceso de cambio. En este nivel de aislamiento, se pueden leer datos que luego se deshacen después de la lectura. Ser capaz de leer los datos a los que todavía no se les aplicó el commit, se denomina una "lectura sucia." En la mayoría de las circunstancias, usted no desea leer los datos que no han sido confirmados. Sólo debería utilizar un nivel de aislamiento de lectura no confirmada, cuando sus requerimientos de negocio permitan la posibilidad de que los datos sean inexactos. Por ejemplo, usted puede querer saber el inventario del ProductX, y obtener un valor aproximado es suficientemente bueno para satisfacer sus necesidades en lugar de tener el valor exacto.

El nivel de aislamiento “Lectura repetible” no permite lecturas sucias a la vez que se mantienen los bloqueos compartidos hasta que la transacción se confirma. Manteniendo bloqueos exclusivos y compartidos para la duración de la transacción, “Lectura Repetible” intenta asegurar que cualquier instrucción DML devolverá los mismos resultados hasta que se complete la transacción.

El nivel de aislamiento “Serializable” mantiene bloqueos compartidos y exclusivos para la duración de una transacción abordando al mismo tiempo una transacción de anomalía no manejada por la “Lectura repetible”. Aunque “Lectura repetible” asegura que las operaciones DML devuelven los mismos datos dentro de una transacción, la inserción de nuevas filas después que la transacción se inicia crea una anomalía llamada “lectura fantasma”. El nivel “Serializable” impide la lectura fantasma, garantizando que los datos de la tabla no se pueden cambiar dentro del alcance de la transacción que está siendo ejecutado. Configurar una conexión con nivel de aislamiento serializable incluso impedirá la inserción de nuevos datos en la tabla si los datos nuevos caen dentro del rango que ha sido accedido.

www.detodoprogramacion.com

Page 188: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 171

El nivel de aislamiento “Instantánea” permite leer filas que están en el proceso de ser modificadas así como cambiar las filas que están en el proceso de lectura. Sin embargo, usted no recibe ningún dato a los que aun no se le realizado el “commit”. El nivel de aislamiento de instantánea se asegura de que sólo reciba datos confirmados, mientras que también no están siendo bloqueados mediante el aprovechamiento de la funcionalidad de control de versiones de fila en el motor de almacenamiento. Cuando intenta leer una fila que está en proceso de ser escrita, SQL Server devolverá la versión de la fila que existía antes de la modificación.

Nota Una discusión completa de los niveles de aislamiento y los efectos sobre el locking y blocking va más allá del alcance de este libro. “Inside SQL Server 2008” tiene un amplio debate acerca de los niveles de aislamiento.

Seguimiento de cambios

Con frecuencia las aplicaciones tienen requerimientos para auditar cambios en una o más tablas. Anterior a SQL Server 2008, los desarrolladores tenían que crear triggers DML y tablas para iniciar la auditoría de la información. SQL Server 2008 incluye dos nuevas características para realizar un seguimiento automático del cambio de datos: “seguimiento de cambios” (change tracking) y captura de datos modificados (change data capture).

El seguimiento de cambios captura el hecho de que una fila se ha cambiado en una tabla, pero no registra el dato real que se ha cambiado. La captura de datos capta el hecho de que una fila se cambió en una tabla, así como los datos reales que se cambiaron.

Seguimiento de los cambios

El seguimiento de cambios está limitado a un registro de cambio que se le ha hecho a una fila dentro de una tabla. Después de habilitar el seguimiento de cambios a nivel de base de datos, para cada tabla en la que desea realizar el seguimiento, se habilita el seguimiento de cambios a nivel de tabla. Cada tabla de usuario con seguimiento de cambios habilitado, tendrá su propia tabla de seguimiento de cambios. Los cambios pueden ser rastreados a nivel de tabla o el nivel de columna.

Los cambios son capturados y registrados usando un proceso ligero, sincronizados y almacenados en una tabla de cambios. La sobrecarga asociada con el seguimiento de cambios es muy pequeña y la mayoría depende del tamaño de la clave primaria y el modo de control de cambios que está utilizando.

La tabla de seguimiento de cambios almacena la clave primaria, un número de versión para la creación de la fila, un número de versión para el último cambio a una fila, el tipo de operación ejecutada para el cambo, y las columnas modificadas durante una operación.

El control de cambios es una propiedad de base de datos que tiene que estar habilitada para poder configurar el seguimiento de cambios para una tabla individual. Además de permitir el control de cambios, también puede configurar la limpieza automática en base a un intervalo de retención con el fin de minimizar la cantidad de información de seguimiento que es almacenada.

www.detodoprogramacion.com

Page 189: Microsoft SQL Server 2008 Español - Mike Hotek

172 Parte III Recuperar y manipular datos

En el siguiente ejercicio, habilitará el seguimiento de cambios, realizará cambios a las tablas en la base de datos SQL2008SBS, y observará la correspondiente información de rastreo de cambio que es almacenada.

Trabajar con seguimiento de cambios

1. Ejecute el siguiente código para habilitar el seguimiento de cambios en la base de datos (el código está en el archivo Capítulo 10\code1.sql):

ALTER DATABASE SQL2008SBS SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 5 DAYS, AUTO_CLEANUP = ON) GO

2. Ejecute el siguiente código para habilitar el seguimiento de cambios en la tabla de empleados (el código está en el archivo Capítulo10\code1.sql):

USE SQL2008SBS GO ALTER TABLE HumanResources.Employee ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON) GO

3. Ejecute el siguiente código para devolver la versión de seguimiento de cambios e insertar una nueva fila (El código está en el archivo Capítulo10\code1.sql):

SELECT CHANGE_TRACKING_CURRENT_VERSION() GO INSERT INTO HumanResources.Employee (FirstName, LastName, JobTitle, BirthDate, HireDate) VALUES('Dan','Park','Engineer','1/1/1972','3/7/1994') GO SELECT CHANGE_TRACKING_CURRENT_VERSION() GO

4. Ejecute el siguiente código para ver la información de seguimiento de cambios (el código está en el archivo Capítulo 10\code1.sql):

--NULL returns the first change version --Specifying a version number return all changes since that version SELECT a.EmployeeID, a.SYS_CHANGE_VERSION, a.SYS_CHANGE_CREATION_VERSION, a.SYS_CHANGE_OPERATION, a.SYS_CHANGE_COLUMNS, a.SYS_CHANGE_CONTEXT FROM CHANGETABLE(CHANGES HumanResources.Employee, NULL) AS a SELECT a.EmployeeID, a.SYS_CHANGE_VERSION, a.SYS_CHANGE_CREATION_VERSION, a.SYS_CHANGE_OPERATION, a.SYS_CHANGE_COLUMNS, a.SYS_CHANGE_CONTEXT FROM CHANGETABLE(CHANGES HumanResources.Employee, 0) AS a GO

www.detodoprogramacion.com

Page 190: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 173

5. Ejecute el siguiente código para modificar una fila y ver el nuevo número de versión (el código está en el archivo Capítulo 10\code1.sql):

UPDATE HumanResources.Employee SET HireDate = '4/7/1996' WHERE FirstName = 'Dan' AND LastName = 'Park' GO SELECT CHANGE_TRACKING_CURRENT_VERSION() GO

6. Ejecute el siguiente código para ver la información de seguimiento de cambios (el código está en el archivo Capítulo 10\code1.sql):

SELECT a.EmployeeID, a.SYS_CHANGE_VERSION, a.SYS_CHANGE_CREATION_VERSION, a.SYS_CHANGE_OPERATION, a.SYS_CHANGE_COLUMNS, a.SYS_CHANGE_CONTEXT,

CASE WHEN CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('HumanResources.Employee'), 'HireDate', 'ColumnId')

,a.SYS_CHANGE_COLUMNS) = 1 THEN 'ColumnChanged' ELSE 'ColumnNotChanged' END HireDateChanged

FROM CHANGETABLE(CHANGES HumanResources.Employee, 1) AS a GO

7. Ejecute el siguiente código para deshabilitar el seguimiento de cambios:

ALTER TABLE HumanResources.Employee DISABLE CHANGE_TRACKING GO ALTER DATABASE SQL2008SBS SET CHANGE_TRACKING = OFF GO

Captura de datos modificados

Después de habilitar la captura de datos modificados mediante la ejecución del procedimiento almacenado sys.sp_cdc_enable_db, a continuación, puede habilitar tablas individuales para la captura de datos mediante la ejecución del procedimiento almacenado sys.sp_cdc_enable_table. Una vez habilitado, SQL Server capturará todos los cambios en la tabla habilitada mediante un proceso asincrónico basado en el registro de transacciones. Aunque la captura de cambio de datos tiene una sobrecarga mayor que el seguimiento de cambios debido a la información adicional almacenada, no afecta las transacciones ya que todos los cambios se registran utilizando un proceso separado.

La tabla de cambios contiene columnas para rastrear el LSN, un número de secuencia dentro de una transacción, la operación DML que causa el cambio, una columna de máscara de bits para realizar un seguimiento de qué columnas de la tabla de origen fueron modificadas durante una actualización, y las columnas de la tabla original.

Precauci ón La captura de datos se basa en el Agente SQL Server para administrar los LSN dentro de los metadatos de la captura de datos. Si usted no tiene el Agente SQL Server en ejecución, la captura de datos modificados no funcionará.

www.detodoprogramacion.com

Page 191: Microsoft SQL Server 2008 Español - Mike Hotek

174 Parte III Recuperar y manipular datos

En el siguiente ejemplo, habilitará la captura de datos modificados para la tabla HumanResources.Employee, realizará cambios y observará los resultados.

Trabajar con ”captura de datos modificados”

1. Ejecute el siguiente código para agregar un nuevo archivo y grupo de archivos a la base de datos SQL2008SBS que se utilizará para las tablas de registro de captura de datos de cambios (el código está en el archivo Capítulo 10\code1.sql):

ALTER DATABASE SQL2008SBS ADD FILEGROUP CDC

GO ALTER DATABASE SQL2008SBS

ADD FILE (NAME = CDC, FILENAME = 'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\CDC.ndf')

TO FILEGROUP CDC GO

2. Ejecute el siguiente código para habilitar la captura de datos modificados en la base de datos y en la tabla de Emplyee (el código está en el archivo Capítulo10\code1.sql):

USE SQL2008SBS GO EXEC sys.sp_cdc_enable_db GO EXEC sys.sp_cdc_enable_table @source_schema = N'HumanResources', @source_name = N'Employee', @role_name = NULL, @filegroup_name = N'CDC', @capture_instance = N'HumanResources_Employee', @supports_net_changes = 1 GO

3. Agregar una nueva fila a la tabla de empleados (el código está en el archivo Capítulo 10\code1.sql):

INSERT INTO HumanResources.Employee (FirstName, LastName, JobTitle, BirthDate, HireDate) VALUES ('Kim','Akers','Engineer','1/1/1968','3/6/2000') GO SELECT EmployeeID, FirstName, LastName, JobTitle, BirthDate, HireDate FROM HumanResources.Employee GO

www.detodoprogramacion.com

Page 192: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 10 Manipulación de datos 175

4. Revise la información de captura de datos modificados (el código está en el archivo Capítulo 10\code1.sql):

DECLARE @from_lsn binary(10), @to_lsn binary(10)

SET @from_lsn = sys.fn_cdc_get_min_lsn('HumanResources_Employee') SET @to_lsn = sys.fn_cdc_get_max_lsn() SELECT * FROM cdc.fn_cdc_get_all_changes_HumanResources_Employee

(@from_lsn, @to_lsn, N'all') GO

5. Modificar una fila en la tabla de empleados (el código está en el archivo Capítulo 10\ code1.sql):

UPDATE HumanResources.Employee SET HireDate = '4/6/2000' WHERE FirstName = 'Kim' AND LastName = 'Akers' GO SELECT EmployeeID, FirstName, LastName, JobTitle, BirthDate, HireDate FROM HumanResources.Employee GO

6. Revise la información de captura de datos modificados (el código está en el archivo Capítulo 10\code1.sql):

DECLARE @from_lsn binary(10), @to_lsn binary(10)

SET @from_lsn = sys.fn_cdc_get_min_lsn('HumanResources_Employee') SET @to_lsn = sys.fn_cdc_get_max_lsn() SELECT * FROM cdc.fn_cdc_get_all_changes_HumanResources_Employee (@from_lsn, @to_lsn, N'all') GO

7. Desactive la captura de datos en la tabla y la base de datos (el código está en el archivo Capítulo 10\code1.sql):

EXEC sys.sp_cdc_disable_table @source_schema = N'HumanResources', @source_name = N'Employee', @capture_instance = N'HumanResources_Employee' GO EXEC sys.sp_cdc_disable_db GO

www.detodoprogramacion.com

Page 193: Microsoft SQL Server 2008 Español - Mike Hotek

176 Parte III Recuperar y manipular datos

Capítulo 10 Referencia Rápida

Para

Añadir nuevas filas a una tabla

Generar una tabla nueva basada en

una declaración SELECT

Modificar las filas de una tabla

Eliminar las filas de una tabla

Eliminar todas las filas de una tabla en

una transacción de registro mínima

Condicionalmente agregar, modificar y eliminar filas de una tabla basado en un criterio de selección

Explícitamente iniciar una transacción

Explícitamente guardar todos los cambios realizados dentro de una transacción

Descartar todos los cambios realizados dentro de una transacción

Habilitar el seguimiento de cambios

Haga lo siguiente

Utilice una declaración INSERT

Utilice una declaración SELECT INTO

Utilice una declaración UPDATE

Utilice una declaración DELETE

Utilice la declaración TRUNCATE TABLE

Utilice una declaración MERGE

Emita una declaración BEGIN TRAN

Emitir una declaración COMMIT TRAN

Emitir una declaración ROLLBACK TRAN

ALTER DATABASE <database name> SET CHANGE_TRACKING = ON ALTER TABLE <table name> ENABLE CHANGE_TRACKING

Recuperar la información del seguimiento de cambios

Utilice las siguientes funciones de seguimiento de cambio: CHANGETABLE, CHANGE_TRACKING_MIN_VALID_VERSION, CHANGE_TRACKING_CURRENT_VERSION, and WITH_CHANGE_ TRACKING_CONTEXT

Ejecutar sys.sp_cdc_enable_db

Utilice los objetos en el esquema cdc junto con las funciones de metadatos sys.fn_cdc*

Habilitar la captura de datos

Acceder a la información sobre los cambios y metadatos para la captura de datos modificados

www.detodoprogramacion.com

Page 194: Microsoft SQL Server 2008 Español - Mike Hotek

Parte IV

Diseño avanzado de base de datos

Objetos

En esta parte: Capítulo 11: Vistas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

Capítulo 12: Procedimientos almacenados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

Capítulo 13: Funciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

Capítulo 14: Triggers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

Capítulo 15: Instantáneas de base de datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . 219

Capítulo 16: Service Broker. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

Capítulo 17: Indización de texto completo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

177

www.detodoprogramacion.com

Page 195: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 11

Vistas

Después de completar este capítulo, usted será capaz de

 

 

 

Crear una vista

Modificar datos a través de una vista

Crear una vista indexada

En el capítulo 8, "Recuperación de datos", y el Capítulo 9, "Recuperación avanzada de datos", aprendió sobre las diversas formas en que una declaración SELECT se podía construir para recuperar datos. Aunque algunas sentencias SELECT son relativamente simples, otras sentencias SELECT pueden ser extremadamente complejas, uniéndose muchas tablas con múltiples niveles de combinaciones y traducción de datos. SQL Server tiene un objeto llamado “vista” view, que le permite almacenar declaraciones SELECT complejas en su base de datos. En esta lección, aprenderá sobre cómo crear vistas, modificar datos mediante una vista, e indexar una vista a fin de mejorar el rendimiento de la consulta.

Creación de una vista

Una vista es simplemente una declaración SELECT a la que se le ha dado un nombre y almacenado en una base de datos. La principal ventaja de una vista es que una vez creada actúa como una tabla para cualquier otra declaración SELECT que se desea escribir.

La sintaxis genérica para crear una vista es:

CREATE VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ] [ WITH <view_attribute> [ ,...n ] ] AS select_statement [ WITH CHECK OPTION ] [ ; ]

Aunque una vista es un nombre almacenado para una declaración SELECT, el SELECT definido para la vista puede hacer referencia a otras tablas, vistas y funciones. La declaración SELECT no puede:

 

 

 

 

 

Contener las cláusulas COMPUTE o COMPUTE BY

Usar la palabra clave INTO

Usar una cláusula OPTION

Hacer referencia a una tabla temporal o variable o cualquier otro tipo.

Contener una cláusula ORDER BY a menos que se especifique un operador TOP

La vista puede contener varias declaraciones SELECT, siempre y cuando usted utilice los operadores UNION o UNION ALL.

179

www.detodoprogramacion.com

Page 196: Microsoft SQL Server 2008 Español - Mike Hotek

180 Parte IV Diseño de objetos de bases de datos avanzadas

En el siguiente ejercicio, creará vistas que combinan las tablas Customer, CustomerAddress, y OrderHeader juntas.

Creación de una vista

1. Ejecute el siguiente código contra la base de datos SQL2008SBS (el código está en el archivo Capítulo11\code1.sql):

CREATE VIEW Customers.CustomerOrders AS SELECT CASE WHEN a.CompanyName IS NOT NULL THEN a.CompanyName

ELSE a.FirstName + ' ' + a.LastName END CustomerName, b.AddressLine1, b.AddressLine2, b.AddressLine3, b.City, d.StateProvinceAbbrev, e.CountryName, c.OrderDate, c.GrandTotal, c.FinalShipDate FROM Customers.Customer a INNER JOIN Customers.CustomerAddress b

ON a.CustomerID = b.CustomerID INNER JOIN Orders.OrderHeader c ON a.CustomerID = c.CustomerID INNER JOIN LookupTables.StateProvince d ON b.StateProvinceID = d.StateProvinceID INNER JOIN LookupTables.Country e ON b.CountryID = e.CountryID GO

2. Ejecute la siguiente consulta para ver los resultados desde la vista que acaba de crear (El código está en el archivo Capítulo11\code1.sql):

SELECT CustomerName, AddressLine1, AddressLine2, AddressLine3, City, StateProvinceAbbrev, CountryName, OrderDate, GrandTotal, FinalShipDate FROM Customers.CustomerOrders GO

Sustitución de consulta

Cuando se hace referencia a una vista, SQL Server sustituye el nombre de la vista con la declaración SELECT definida por la vista, vuelve a escribir la consulta como si no hubiera referencia a la vista, y luego envía la consulta reescrita al optimizador.

Por lo tanto, aunque es posible que usted haya ejecutado:

SELECT CustomerName, AddressLine1, AddressLine2, AddressLine3, City, StateProvinceAbbrev, CountryName, OrderDate, GrandTotal, FinalShipDate FROM Customers.CustomerOrders GO

SQL Server realmente enviará la siguiente consulta al optimizador:

SELECT CASE WHEN a.CompanyName IS NOT NULL THEN a.CompanyName ELSE a.FirstName + ' ' + a.LastName END CustomerName,

b.AddressLine1, b.AddressLine2, b.AddressLine3, b.City, d.StateProvinceAbbrev, e.CountryName, c.OrderDate, c.GrandTotal, c.FinalShipDate FROM Customers.Customer a INNER JOIN Customers.CustomerAddress b

ON a.CustomerID = b.CustomerID

www.detodoprogramacion.com

Page 197: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 11 Vistas

INNER JOIN Orders.OrderHeader c ON a.CustomerID = c.CustomerID INNER JOIN LookupTables.StateProvince d ON b.StateProvinceID = d.StateProvinceID INNER JOIN LookupTables.Country e ON b.CountryID = e.CountryID GO

181

Modificar datos mediante una vista

Puede realizar modificaciones a los datos a través de una vista, siempre y cuando se cumplen los siguientes requisitos:

 

 

La modificación de los datos debe hacer referencia exactamente a una tabla

Las columnas de la vista deben hacer referencia directa a las columnas de una tabla

La columna no puede ser derivada desde una agregación

La columna no puede ser calculada como el resultado de un UNION / UNION ALL, CROSS

JOIN, EXCEPT o INTERSECT

  La columna que se está modificando no puede estar afectada por las cláusulas DISTINCT, GROUP BY, o HAVING.

No se usa el operador TOP  

Nota Si una vista no cumple con los requisitos para ser actualizable, puede crear un trigger INSTEAD OF sobre la vista. El desencadenador INSTEAD OF se ejecutará para la operación de DML que está realizando en lugar de enviar la DML a través de la vista. Usted aprenderá acerca de los disparadores en el Capítulo 14, "Triggers".

Dado que la definición de una vista puede contener una cláusula WHERE, es posible realizar una modificación a través de la vista que no está visible cuando se recuperan datos de la misma. La cláusula WITH CHECK OPTION obliga a que los únicos datos que pueden manipularse, a través de la vista, también deban poder ser recuperados cuando se realiza el SELECT desde la vista.

En el siguiente ejercicio, creará una vista que combina las tablas Employee y EmployeeAddress juntas, de tal manera que se pueden realizar modificaciones de datos.

Modificar mediante una vista

1. Ejecute el siguiente código en la base de datos SQL2008SBS (el código está en el archivo Capítulo11\code2.sql):

CREATE VIEW HumanResources.v_Employees AS SELECT a.EmployeeID, a.FirstName, a.LastName, a.JobTitle, a.BirthDate, a.HireDate, c.AddressType, b.AddressLine1, b.AddressLine2, b.AddressLine3, b.City, d.StateProvince, e.CountryName

www.detodoprogramacion.com

Page 198: Microsoft SQL Server 2008 Español - Mike Hotek

182 Parte IV Diseño de objetos de bases de datos avanzadas

FROM HumanResources.Employee a LEFT JOIN HumanResources.EmployeeAddress b ON a.EmployeeID = b.EmployeeID

LEFT JOIN LookupTables.AddressType c ON b.AddressTypeID = c.AddressTypeID LEFT JOIN LookupTables.StateProvince d ON b.StateProvinceID = d.StateProvinceID LEFT JOIN LookupTables.Country e ON b.CountryID = e.CountryID GO

2. Observe los resultados de la vista que acaba de crear, usando el siguiente SELECT (el código está en el archivo Capítulo11\code2.sql):

SELECT EmployeeID, FirstName, LastName, JobTitle, BirthDate, HireDate, AddressType, AddressLine1, AddressLine2, AddressLine3, City, StateProvince, CountryName FROM HumanResources.v_Employees GO

3. Insertar una fila en la vista usando la siguiente declaración INSERT (el código está en el archivo Capítulo11\code2.sql):

INSERT INTO HumanResources.v_Employees (FirstName, LastName, JobTitle, BirthDate, HireDate) VALUES('Diane','Prescott','Vice-President','4/11/1980','1/2/2008') GO

4. Observe los resultados de la instrucción INSERT ejecutando el siguiente SELECT (el código está en el archivo Capítulo11\code2.sql):

SELECT EmployeeID, FirstName, LastName, JobTitle, BirthDate, HireDate, AddressType, AddressLine1, AddressLine2, AddressLine3, City, StateProvince, CountryName FROM HumanResources.v_Employees GO

Creación de una vista indexada

Además de realizar modificaciones de datos a través de una vista, también se puede crear un índice en una vista.

Cuando es creada una vista normal, SQL Server sólo almacena la definición de la vista, que luego es sustituida por el optimizador de consultas para las sentencias SELECT emitidas contra dicha vista.

El índice se construye con una lista de valores en una columna. Cuando se indexa una vista, SQL Server ejecuta la declaración SELECT definida por la vista, almacena el conjunto de resultados, y luego construye el índice. Cualquier DML posterior emitida contra cualquiera de las tablas definidas en la vista, causará que SQL Server actualice incrementalmente el conjunto de resultados almacenados, así como mantener el índice, si es necesario. Dado que SQL Server almacena físicamente y mantiene el conjunto de resultados, o "materializa" los datos, una vista indexada a veces es conocida como una “vista materializada”.

Las vistas indexadas tienen una larga lista de requisitos para poder ser construidas. Los requisitos para una vista indexada derivan del hecho de que los datos han de ser materializados en disco en una manera que no cambia y los datos dentro del índice también tienen que ser fijos.

www.detodoprogramacion.com

Page 199: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 11 Vistas 183

Algunos de los requisitos para crear una vista indexada son:

 

 

 

 

 

La declaración SELECT no puede hacer referencia a otras vistas

Todas las funciones deben ser deterministas

No se permiten AVG, MIN, MAX, STDEV DESVESTP, VAR, y VARP

El índice creado debe ser a la vez clustered y unique

ANSI_NULLS debe haber sido configurado en ON, cuando se crearon la vista y cualquiera de las tablas referenciadas en la vista.

La vista debe ser creada con la opción SCHEMABINDING

La declaración SELECT no contiene subconsultas o outer joins, EXCEPT, INTERSECT

TOP, UNION, ORDER BY, DISTINCT, COMPUTE / COMPUTE BY, CROSS / OUTER APPLY, PIVOT, o UNPIVOT

 

 

Más información Todas las restricciones para la creación de una vista indexada se pueden encontrar en el Artículo de los Books Online "Creación de vistas indizadas."

El cumplimiento de los requisitos para crear una vista indexada, pueden parecer prohibitivos. Sin embargo, la principal ventaja de una vista indexada es que los datos ya están materializadas y no tienen que ser calculados sobre la marcha como en una vista regular. Las vistas indexadas pueden proporcionar una significativa ganancia de rendimiento cuando se realizan consultas que combinan grandes volúmenes de datos en conjunto, tales como agregados. Las vistas indexadas tienen que ser mantenidas cuando se producen cambios en las tablas subyacentes, por lo que una vista indexada no debería crearse contra tablas que reciben grandes volúmenes de modificaciones de datos.

En el siguiente ejercicio, creará una vista indexada contra las tablas Archive.OrderHeader y Archive.OrderDetail.

Crear una vista indexada

1. Ejecute el siguiente código en la base de datos SQL2008SBS (el código está en el archivo Capítulo11\code3.sql):

CREATE VIEW Archive.v_OrderItems WITH SCHEMABINDING AS SELECT a.OrderID, a.CustomerID, a.OrderDate, a.SubTotal, a.TaxAmount, a.ShippingAmount, a.GrandTotal, a.FinalShipDate, b.OrderDetailID, b.SKU, b.Quantity, b.UnitPrice, b.Quantity + b.UnitPrice LineItemTotal FROM Archive.OrderHeader a INNER JOIN Archive.OrderDetail b ON a.OrderID = b.OrderID GO

www.detodoprogramacion.com

Page 200: Microsoft SQL Server 2008 Español - Mike Hotek

184 Parte IV Diseño de objetos de bases de datos avanzadas

2. Ahora cree el índice sobre la vista ejecutando el siguiente código (el código está en el archivo Capítulo11\code3.sql):

CREATE UNIQUE CLUSTERED INDEX iucx_orderitems ON Archive.v_OrderItems (OrderID, OrderDetailID) GO

3. Realice un SELECT de la vista.

Sustitución de consultas

Cuando se crea un índice en una vista, el dato está materializado. Las consultas que hacen referencia a la vista indexada no sustituyen a la definición de la vista, sino que devuelven los resultados directamente desde la vista indexada. Los resultados pueden ser devueltos directamente, porque en términos de almacenamiento, la vista indexada es de hecho una tabla que mantiene el motor de almacenamiento.

En la edición Enterprise de SQL Server, la sustitución de consulta va un paso más allá cuando está presente una vista indexada. Normalmente, el optimizador seleccionará los índices creados sobre las tablas referenciadas en una consulta si se determina que un determinado índice mejorará el rendimiento de la consulta. En la edición Enterprise de SQL Server, si el optimizador de consultas determina que los datos pueden ser recuperados de manera más eficiente a través de la vista indexada, entonces construye un plan de consulta que recupera los datos de la vista indexada en lugar de las tablas.

En la práctica anterior, se creó una vista indexada sobre las tablas Archive.OrderHeader y Archive.OrderDetail. Si se va a ejecutar la consulta siguiente, en lugar de utilizar las tablas Archive.OrderHeader y Archive.OrderDetail, SQL Server realmente utiliza Archive.v_OrderItems para satisfacer la siguiente consulta (el código está en el archivo Capítulo11\code4.sql):

SELECT a.OrderID, CASE WHEN a.CompanyName IS NOT NULL THEN a.CompanyName ELSE a.FirstName + ' ' + a.LastName END CustomerName,

a.OrderDate, a.SubTotal, a.TaxAmount, a.ShippingAmount, a.GrandTotal, a.FinalShipDate, b.OrderDetailID, b.SKU, b.Quantity, b.UnitPrice, b.Quantity + b.UnitPrice LineItemTotal FROM Archive.OrderHeader a INNER JOIN Archive.OrderDetail b ON a.OrderID = b.OrderID INNER JOIN Customers.Customer c ON a.CustomerID = c.CustomerID GO O

Capítulo 11 Referencia Rápida

Para

Almacenar una declaración SELECT en una base de datos para uso futuro

Índexar una vista

Haga lo siguiente

Ejecute un comando CREATE VIEW

Crear un índice clustered y unique sobre una vista

www.detodoprogramacion.com

Page 201: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 12

Procedimientos almacenados

Después de completar este capítulo, usted será capaz de

¦ Crear procedimientos almacenados

¦ Especificar parámetros entrada/salida

¦ Trabajar con variables

¦ Construir rutinas estructuradas de control de errores

Si se va a buscar el objeto “caballo de batalla” dentro de SQL Server, este sería un procedimiento

almacenado. Los procedimientos almacenados son la columna vertebral y la interfaz de base de

datos para prácticamente todas las aplicaciones de SQL Server en el mundo. En este capítulo, usted

aprenderá cómo crear procedimientos almacenados para administrar su entorno, así como

proporcionar la interfaz de programación necesaria para la escritura de aplicaciones de bases de

datos eficientes y de fácil mantenimiento. Todos los ejemplos de código contenidos en este capítulo,

a menos que se indique, se pueden encontrar en el archivo Capítulo 12\code1.sql.

Crear procedimientos almacenados Cada declaración que usted ejecute en un servidor SQL se puede encapsular dentro de un

procedimiento almacenado. En pocas palabras, un procedimiento almacenado no es más que un lote

de T-SQL al que se le ha dado un nombre y se almacenó dentro de una base de datos.

La sintaxis genérica para crear un procedimiento almacenado es la siguiente:

Lo que diferencia a un procedimiento almacenado de un simple lote de T-SQL son todas las

estructuras de código que pueden ser empleadas, tales como variables, parametrización, manejo

de error, y construcciones de flujo de control.

185

CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ] [ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY] ] [ ,...n ] [ WITH <procedure_option> [ ,...n ] ] [ FOR REPLICATION ] AS { <sql_statement> [;][ ...n ] | <method_specifier> } [;] <procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE AS Clause ]

www.detodoprogramacion.com

Page 202: Microsoft SQL Server 2008 Español - Mike Hotek

186 Parte IV diseño de objetos de bases de datos avanzadas

Comentando Código

Una de las características de un código bien construido, es el de los comentarios que simplifican el mantenimiento futuro. T-SQL tiene dos construcciones diferentes para comentar código:

--This is a single line comment /* This is a multi-line comment *

Variables, parámetros y códigos de retorno

Variables

Las variables proporcionan una manera de manipular, almacenar y transmitir datos dentro de un procedimiento almacenado, así como entre los procedimientos almacenados y funciones. SQL Server tiene dos tipos de variables: local y global. La variable local se designa mediante un solo símbolo @, mientras que una variable global se designa con un doble símbolo @@. Además, puede crear, leer y escribir variables locales mientras que no puede crear o escribir variables globales. La Tabla 12-1 enumera algunas de los variables globales más comunes.

TABLA 12-1 Variables globales

Definición

Código de error de la última sentencia ejecutada

Valor del último número de identidad insertada dentro de la conexión

El número de filas afectadas por la última instrucción

El número de transacciones abiertas dentro de la conexión

La versión de SQL Server

Variable Global

@ @ ERROR

@ @ IDENTITY

@ @ ROWCOUNT

@ @ TRANCOUNT

@ @ VERSION

Usted instancia una variable con la cláusula DECLARE donde se especifica el nombre y el tipo de datos de la variable. Una variable puede ser definida usando cualquier tipo de datos excepto text, ntext e image. Por ejemplo:

DECLARE @intvariable INT, @datevvariable DATE

DECLARE @tablevar TABLE (ID INT NOT NULL, Customer VARCHAR(50) NOT NULL)

Nota Los tipos de datos text, ntext e image han quedado en desuso y no deben ser utilizados.

www.detodoprogramacion.com

Page 203: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 12 Procedimientos Almacenados 187

Aunque una sola declaración DECLARE se puede utilizar para crear instancias de múltiples variables, la instanciación de una variable de tabla tiene que estar en una DECLARE separada.

Se puede asignar a una variable un valor estático o un valor único devuelto desde una declaración SELECT. Cualquiera de las dos SET o SELECT se puede utilizar para asignar un valor, sin embargo, si se está ejecutando una consulta para asignar un valor, debe utilizar una sentencia SELECT. SELECT también se utiliza para devolver el valor de una variable. Una variable puede ser utilizada para realizar cálculos, procesamiento de control, o como una SARG en una consulta.

Además de asignar un valor utilizando una declaración SET o SELECT, también se le puede asignar un valor en el momento que una variable es instanciada.

DECLARE @intvariable INT = 2, @datevvariable DATE = GETDATE(), @maxorderdate DATE = (SELECT MAX(OrderDate) FROM Orders.OrderHeader), @counter1 INT, @counter2 INT

SET @counter1 = 1 SELECT @counter2 = -1 SELECT @intvariable, @datevariable, @maxorderdate, @counter1, @counter2

Se pueden realizar cálculos con variables utilizando ya sea una sentencia SET o SELECT. SQL Server 2008 introduce una forma más compacta para la asignación de valores a las variables utilizando un cálculo.

--SQL Server 2005 and below DECLARE @var INT SET @var = 1 SET @var = @var + 1 SELECT @var SET @var = @var * 2 SELECT @var SET @var = @var / 4 SELECT @var GO --SQL Server 2008 DECLARE @var INT SET @var = 1 SET @var += 1 SELECT @var SET @var *= 2 SELECT @var SET @var /= 4 SELECT @var GO

www.detodoprogramacion.com

Page 204: Microsoft SQL Server 2008 Español - Mike Hotek

188 Parte IV diseño de objetos de bases de datos avanzadas

Importante Con la excepción de una variable de tabla, todas las otras variables contienen un solo valor. Aunque se puede asignar el resultado de una declaración SELECT a una variable, si hay más de una fila devuelta desde la declaración SELECT, usted no recibirá un error. La variable contendrá sólo el último valor del conjunto de resultados. Cualquier otro valor será descartado.

Parámetros

Los parámetros son variables locales que se utilizan para pasar valores en un procedimiento almacenado cuando es ejecutado. Durante la ejecución, los parámetros se utilizan igual que las variables y se pueden leer y escribir.

CREATE PROCEDURE <procedure name> @parm1 INT, @parm2 VARCHAR(20) = 'Default value' AS --Code block

Se pueden crear dos tipos de parámetros: de entrada y de salida. Un parámetro de salida es designado mediante la palabra clave OUTPUT.

CREATE PROCEDURE <procedure name> @parm1 INT, @parm2 VARCHAR(20) = 'Default value', @orderid INT OUTPUT

AS --Code block

Los parámetros de salida se utilizan cuando se necesita devolver un valor simple para una aplicación. Si usted necesita devolver un conjunto de resultados completo, entonces se incluye una declaración SELECT en el procedimiento almacenado, que genera los resultados y devuelve el conjunto de resultados para la aplicación.

CREATE PROCEDURE <procedure name> @parm1 INT, @parm2 VARCHAR(20) = 'Default value' AS

--This will return the results of this query to an application SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, GrandTotal FROM Orders.OrderHeader

Códigos de retorno

Se le puede pasar un código de retorno a una aplicación con el fin de determinar el estado de ejecución del procedimiento. Los códigos de retorno no están destinados a enviar datos, pero se utilizan para informar el estado de ejecución.

CREATE PROCEDURE <procedure name> @parm1 INT, @parm2 VARCHAR(20) = 'Default value' AS

--This will return the value 1 back to the caller RETURN 1

www.detodoprogramacion.com

Page 205: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 12 Procedimientos Almacenados 189

Ejecutar procedimientos almacenados

Se accede a un procedimiento almacenado mediante una sentencia EXEC. Si un procedimiento almacenado no tiene parámetros de entrada, el único código que se requiere es:

EXEC <stored procedure>

Si un procedimiento almacenado tiene parámetros de entrada, se pueden pasar los parámetros por nombre o por la posición.

--Execute by name EXEC <stored procedure> @parm1=<value>, @parm2=<value>,. . . --Execute by position EXEC <stored procedure> <value>, <value>,. . .

Ejecutar un procedimiento almacenado por posición se hace con un código que es más compacto, sin embargo, es más propenso a errores. Si el orden de los parámetros en un procedimiento se cambia, el código no se verá afectado si se está ejecutando un procedimiento y pasando los parámetros por nombre.

Para utilizar un parámetro de salida, debe especificar la palabra clave OUT o OUTPUT, después de cada parámetro de salida.

--Using output parameters DECLARE @variable1 <data type>,

@variable2 <data type> ...

EXEC <stored procedure> @parameter1, @variable1 OUTPUT, @variable2 OUT

Si usted necesita capturar el código de retorno de un procedimiento almacenado, debe guardarlo en un variable como sigue:

--Capturing a return code DECLARE @variable1 <data type>,

@variable2 <data type>, @returncode INT

EXEC @returncode = <stored procedure> @parameter1, @variable1 OUTPUT, @variable2 OUT

Constructores de flujo de control Los procedimientos almacenados tienen varios constructores de flujo de control que se pueden utilizar:

 

 

 

 

RETURN

IF. . . ELSE

BEGIN. . . END

WHILE

www.detodoprogramacion.com

Page 206: Microsoft SQL Server 2008 Español - Mike Hotek

190 Parte IV diseño de objetos de bases de datos avanzadas

 

 

 

BREAK/ CONTINUE

WAITFOR

GOTO

RETURN se utiliza para terminar la ejecución del procedimiento y devolver el control a la aplicación que lo llamó. Cualquier código después de la sentencia RETURN no se ejecutará.

CREATE PROCEDURE <procedure name> @parm1 INT, @parm2 VARCHAR(20) = 'Default value' AS

--This will return the value 1 back to the caller RETURN 1

--Any code from this point on will not be executed

IF. . . ELSE proporciona la capacidad de ejecutar código condicionalmente. La declaración IF comprobará la condición suministrada y ejecutará el siguiente bloque de código cuando la condición sea verdadera. La sentencia opcional ELSE permite ejecutar código cuando el chequeo de la condición es falso.

DECLARE @var INT SET @var = 1 IF @var = 1

PRINT 'This is the code executed when true.' ELSE

PRINT 'This is the code executed when false.'

Independientemente de la rama que toma el código para un IF. . . ELSE, sólo la declaración siguiente se ejecutada condicionalmente.

DECLARE @var INT SET @var = 1 IF @var = 2

PRINT 'This is the code executed when true.' PRINT 'This will always execute.'

Dado que una declaración IF condicionalmente ejecutará solo la siguiente línea de código, usted tiene un problema cuando quiere ejecutar un bloque de código condicional. El BEGIN. . . END permite delimitar bloques de código que se ejecutan como una unidad.

DECLARE @var INT SET @var = 1 IF @var = 2 BEGIN

PRINT 'This is the code executed when true.' PRINT 'This code will also execute only when the conditional is true.'

END

www.detodoprogramacion.com

Page 207: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 12 Procedimientos Almacenados 191

Nota Uno de los mayores errores que usted puede cometer al escribir bloques de código que usan un IF o WHILE es olvidar que SQL Server sólo ejecutará condicionalmente la siguiente instrucción. Para evitar los errores más comunes de codificación, es muy recomendable que utilice siempre un BEGIN. . . END con un IF o WHILE, incluso cuando sólo se va a ejecutar condicionalmente una sola línea de código. No sólo hace que el código sea más fácil de leer, sino que también evita errores cuando su código es modificado en el futuro.

WHILE se utiliza para ejecutar iterativamente un bloque de código mientras una condición especificada sea verdadera. DECLARE @var1 INT,

@var2 VARCHAR(30) SET @var1 = 1 WHILE @var1 <= 10 BEGIN

SET @var2 = 'Iteration #' + CAST(@var1 AS VARCHAR(2)) PRINT @var2 SET @var1 += 1

BREAK se utiliza junto con un bucle while. Si usted necesita terminar la ejecución en un bucle WHILE, puede utilizar la declaración BREAK para poner fin a la repetición del bucle. Una vez que BREAK es ejecutada, el código seguirá ejecutando, desde la siguiente línea de código que sigue al bucle WHILE. CONTINUE se utiliza dentro de un bucle WHILE para que el código se siga ejecutando dentro del bucle.

Nota BREAK/CONTINUE casi nunca se utilizan. Un bucle while terminará tan pronto como la condición para el bucle WHILE ya no es verdadera. En lugar de incorporar una prueba condicional junto con una declaración BREAK, los bucles WHILE son controlados normalmente mediante el uso de un adecuado condicional para el WHILE. Mientras el condicional para el WHILE es verdadero, el bucle continuará en ejecución. Por lo tanto, nunca debe tener la necesidad de utilizar una sentencia CONTINUE.

WAITFOR se utiliza para permitir que en la ejecución de código se haga una pausa. WAITFOR tiene tres permutaciones diferentes: WAITFOR DELAY, WAITFOR TIME y WAITFOR RECEIVE. WAITFOR RECEIVE se utiliza junto con el Agente de servicio (Service Broker), sobre el que usted aprenderá en el Capítulo 16, "Service Broker. " WAITFOR TIME detiene la ejecución de código hasta que se alcanza una hora determinada. WAITFOR DELAY interrumpe la ejecución de código por un intervalo de tiempo especificado.

DECLARE @var1 INT, @var2 VARCHAR(30)

SET @var1 = 1 --Pause for 2 seconds WAITFOR DELAY '00:00:02'

www.detodoprogramacion.com

Page 208: Microsoft SQL Server 2008 Español - Mike Hotek

192 Parte IV diseño de objetos de bases de datos avanzadas

WHILE @var1 <= 10 BEGIN

SET @var2 = 'Iteration #' + CAST(@var1 AS VARCHAR(2))

PRINT @var2

SET @var1 += 1 END

GOTO permite pasar la ejecución a una etiqueta incorporada dentro del procedimiento. En ningún código que pueda encontrar, es aconsejable incluir construcciones tales como GOTO.

Control de errores

En un mundo perfecto, cada bloque de código que se ejecuta siempre se ejecute sin errores. Sin embargo, todo código siempre estará sujeto a fallos. Por lo tanto, es necesario incluir un manejo de errores en los procedimientos almacenados.

Antes de SQL Server 2005, la única manera de realizar el tratamiento de errores era poner a prueba el valor de la variable global @@ Error. Ahora tiene una forma de realizar un control de errores estructurado similar a otros lenguajes de programación, mediante la utilización de un bloque TRY. . . CATCH.

El bloque TRY. . . CATCH tiene dos componentes. El bloque TRY se utiliza para englobar cualquier código que puede recibir un error y que se desea atrapar y manejar. El bloque CATCH se utiliza para controlar el error.

El siguiente código crea un error debido a la violación de una restricción de clave primaria. Usted puede ser que espere que este código deje la tabla vacía debido al error en la transacción, sin embargo, usted encontrará que las instrucciones insert primera y tercera se ejecutan con éxito y dejan dos filas en la tabla.

--Transaction errors CREATE TABLE dbo.mytable (ID INT NOT NULL PRIMARY KEY) BEGIN TRAN

INSERT INTO dbo.mytable VALUES(1) INSERT INTO dbo.mytable VALUES(1) INSERT INTO dbo.mytable VALUES(2)

COMMIT TRAN SELECT * FROM dbo.mytable

La razón por la que tiene dos filas insertadas en la tabla se debe a que de forma predeterminada, SQL Server no revierte una transacción que tiene un error. Si desea que la transacción sea completada en su totalidad o que falle toda la tansacción completa, se puede utilizar el comando SET para cambiar la configuración del parámetro XACT_ABORT de la conexión, de la siguiente manera:

www.detodoprogramacion.com

Page 209: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 12 Procedimientos Almacenados

SET XACT_ABORT ON; BEGIN TRAN

INSERT INTO dbo.mytable VALUES(1) INSERT INTO dbo.mytable VALUES(1) INSERT INTO dbo.mytable VALUES(2)

COMMIT TRAN SET XACT_ABORT OFF; SELECT * FROM dbo.mytable

193

Aunque la declaración SET logra su objetivo, al cambiar la configuración de una conexión, puede tener resultados impredecibles para una aplicación si el código no reinicia correctamente las opciones. Una mejor solución es usar un controlador estructurado de errores para atrapar y decidir cómo manejar el error.

--TRY...CATCH TRUNCATE TABLE dbo.mytable BEGIN TRY

BEGIN TRAN INSERT INTO dbo.mytable VALUES(1) INSERT INTO dbo.mytable VALUES(1) INSERT INTO dbo.mytable VALUES(2)

COMMIT TRAN END TRY BEGIN CATCH

ROLLBACK TRAN PRINT 'Catch'

END CATCH

Además de proporcionar una rutina de control de errores estructurada, también puede eliminar la devolución de códigos de error fatal que podrían hacer que el código falle inesperadamente. Usted notará en el código anterior que, si bien aún se lanza un error, el bloque CATH atrapa el error, se encarga del manejo del problema y, a continuación, devuelve el control sin el mensaje de error, que ha visto antes en los dos bloques de código.

Ejecución dinámica

Aunque la ejecución de comandos dinámica es muy rara dentro de procedimientos almacenados que usan las aplicaciones, muchos de los procedimientos administrativos necesitan construir los comandos y dinámicamente ejecutarlos. T-SQL tiene dos formas de ejecutar sentencias construidas dinámicamente: EXEC(<command>) y sp_executesql <command>.

EXEC('SELECT OrderID, CustomerID FROM Orders.OrderHeader WHERE OrderID = 1') GO

www.detodoprogramacion.com

Page 210: Microsoft SQL Server 2008 Español - Mike Hotek

194 Parte IV diseño de objetos de bases de datos avanzadas

DECLARE @var VARCHAR(MAX) SET @var = 'SELECT OrderID, CustomerID FROM Orders.OrderHeader WHERE OrderID = 1' EXEC(@var) GO EXEC sp_executesql N'SELECT OrderID, CustomerID FROM Orders.OrderHeader WHERE OrderID = 1' GO DECLARE @var NVARCHAR(MAX) SET @var = 'SELECT OrderID, CustomerID FROM Orders.OrderHeader WHERE OrderID = 1' EXEC sp_executesql @var GO

Importante Cada vez que usted está construyendo una cadena para su ejecución dinámica, tiene el potencial de un ataque de inyección SQL. La inyección de SQL va más allá del alcance de este libro, pero usted debe leer muchos artículos publicados sobre la inyección SQL y entender los riesgos, antes de escribir código para la ejecución dinámica.

Cursores

SQL Server está diseñado para procesar conjuntos de datos. Sin embargo, hay ocasiones en que es necesario el proceso de datos de una fila a la vez. Los cursores le permiten recuperar un conjunto de filas y luego procesarlas de a una fila a la vez.

Nota SQL Server está construido y optimizado para operaciones basadas en conjunto. Un cursor hace que el motor realice el procesamiento basado en fila. Un cursor nunca rendirá tan bien como un proceso equivalente basado en conjuntos.

Los cursores tienen cinco componentes. DECLARE se usa para definir la declaración SELECT que es la base para las filas en el cursor. OPEN hace que la sentencia SELECT sea ejecutada y carga las filas en una estructura de memoria. FETCH se utiliza para recuperar desde el cursor una fila a la vez. CLOSE se utiliza para cerrar el procesamiento en el cursor. DEALLOCATE se utiliza para eliminar el cursor y liberar las estructuras de memoria que contienen el conjunto de resultados del cursor.

Nota Si escribe un cursor que lleva a cabo la misma operación sobre cada fila recuperada por el cursor, debería re escribir el proceso para utilizar una operación más eficiente basada en conjunto.

La sintaxis genérica para la declaración de un cursor es:

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]

www.detodoprogramacion.com

Page 211: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 12 Procedimientos Almacenados

[ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ]

195

Las siguientes instrucciones muestran tres formas diferentes de declarar el mismo cursor.

DECLARE curproducts CURSOR FAST_FORWARD FOR SELECT ProductID, ProductName, ListPrice FROM Products.Product GO DECLARE curproducts CURSOR READ_ONLY FOR SELECT ProductID, ProductName, ListPrice FROM Products.Product GO DECLARE curproducts CURSOR FOR SELECT ProductID, ProductName, ListPrice FROM Products.Product FOR READ ONLY GO

Una vez que el cursor se ha declarado, se emite un comando OPEN para ejecutar la sentencia SELECT.

OPEN curproducts

A continuación, deberá recuperar los datos de la fila del cursor mediante el uso de una sentencia FETCH. Cuando ejecuta FETCH por primera vez, un puntero se coloca en la primera fila en el resultado del cursor. Cada vez que un se ejecuta FETCH, el puntero del cursor avanza una fila en el conjunto de resultados hasta que se acaben las filas del conjunto de resultados. Cada ejecución de FETCH también establece un valor para la variable global @@FETCH_STATUS. Por lo general, utilizará un bucle WHILE para iterar a través del cursor, yendo a buscar (fetching) una fila en cada iteración a través del bucle. Usted iterará a través del bucle WHILE siempre y cuando @@FETCH_STATUS = 0.

DECLARE @ProductID INT, @ProductName VARCHAR(50), @ListPrice MONEY

DECLARE curproducts CURSOR FOR SELECT ProductID, ProductName, ListPrice FROM Products.Product FOR READ ONLY OPEN curproducts FETCH curproducts INTO @ProductID, @ProductName, @ListPrice WHILE @@FETCH_STATUS = 0 BEGIN

SELECT @ProductID, @ProductName, @ListPrice FETCH curproducts INTO @ProductID, @ProductName, @ListPrice

END CLOSE curproducts DEALLOCATE curproducts

www.detodoprogramacion.com

Page 212: Microsoft SQL Server 2008 Español - Mike Hotek

196 Parte IV diseño de objetos de bases de datos avanzadas

Nota Si va a escribir procedimientos almacenados que tienen cursores y especialmente cursores en multi-nivel, usted debe reevaluar el proceso que está intentando escribir. Usted probablemente puede reemplazar los cursores con un proceso basado en conjuntos, que es más eficiente.

Procedimientos CLR

Hasta ahora sólo hemos discutido un tipo de procedimiento almacenado en este capítulo. En lugar de escribir un procedimiento almacenado mediante T-SQL, puede escribir un procedimiento almacenado utilizando cualquier lenguaje compatible. NET.

La rutina está escrita en un lenguaje como C #. NET o Visual Basic. NET y compilada en una biblioteca de vínculos dinámicos (DLL). El archivo DLL se carga en SQL Server. Una vez cargado, puede definir un procedimiento almacenado para cualquier método público dentro de la DLL.

Nota Puede crear cualquiera de los objetos de código de SQL Server, funciones, triggers, y procedimientos almacenados, utilizando una rutina CLR

Construcción de un Procedimiento Administrativo

En el capítulo 6, aprendió sobre los índices. Una de las tareas administrativas de rutina que deben llevarse a cabo sobre las bases de datos es defragmentar índices. Usted podría ejecutar un Reingex manualmente, pero es mucho más fácil encapsular el código dentro de un procedimiento almacenado que puede ser ejecutado sobre una base automatizada.

El siguiente procedimiento almacenado reúne muchos de los elementos referidos en este capítulo: asignación de variables, parámetros, cursores, ejecución dinámica, bucles WHILE y manejo de errores estructurado. (El código siguiente está en el archivo Capítulo 12\code2.sql)

--Create our database for administrative objects CREATE DATABASE DBAdmin GO USE DBAdmin GO CREATE PROCEDURE dbo.asp_reindex @database SYSNAME, @fragpercent INT AS DECLARE @cmd NVARCHAR(max),

@table SYSNAME, @schema SYSNAME

www.detodoprogramacion.com

Page 213: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 12 Procedimientos Almacenados

--Using a cursor for demonstration purposes. --Could also do this with a table variable and a WHILE loop DECLARE curtable CURSOR FOR SELECT DISTINCT OBJECT_SCHEMA_NAME(object_id, database_id) SchemaName,

OBJECT_NAME(object_id,database_id) TableName FROM sys.dm_db_index_physical_stats (DB_ID(@database),NULL,NULL,NULL,'SAMPLED') WHERE avg_fragmentation_in_percent >= @fragpercent

FOR READ ONLY OPEN curtable FETCH curtable INTO @schema, @table WHILE @@FETCH_STATUS = 0 BEGIN

SET @cmd = 'ALTER INDEX ALL ON ' + @database + '.' + @schema + '.' + @table + ' REBUILD WITH (ONLINE = ON)' --Try ONLINE build first, if failure, change to OFFLINE build. --Offline rebuild using the ALL keyword is required if the table has XML or -- SPATIAL indexes --Offline rebuild is also required for tables with indexes on image, text, ntext, -- varchar(max), nvarchar(max), varbinary(max), and xml data types. --We are using the ALL keyword so that we do not have to change database -- context in order to retrieve the index name, since a function does not exist -- to get the name outside of the database context for an index. If you need -- to maximize the online build operations, you will need to modify this proc -- to change context to the database to pick up the index name, check the -- index column data types and then substitute the index name for the ALL keyword. BEGIN TRY

EXEC sp_executesql @cmd END TRY BEGIN CATCH

BEGIN SET @cmd = 'ALTER INDEX ALL ON ' + @database + '.' + @schema + '.' + @table + ' REBUILD WITH (ONLINE = OFF)' EXEC sp_executesql @cmd

END END CATCH FETCH curtable INTO @schema, @table

END CLOSE curtable DEALLOCATE curtable GO --Test --Fragmentation percent of 0 will rebuild every index exec dbo.asp_reindex 'SQL2008SBS',0 exec dbo.asp_reindex 'SQL2008SBSFS',0

197

www.detodoprogramacion.com

Page 214: Microsoft SQL Server 2008 Español - Mike Hotek

198 Parte IV diseño de objetos de bases de datos avanzadas

Capítulo 12 Referencia Rápida

Para

Pasar un valor a un procedimiento almacenado

Haga lo siguiente

Utilice un parámetro INPUT. Puede pasar parámetros por posición o por nombre. Si se especifica un valor predeterminado para el parámetro INPUT, el parámetro es opcional y se utilizará el valor por defecto especificado, si no se le pasa un valor de entrada en el procedimiento almacenado.

Utilice un parámetro OUTPUT. Puede tener múltiples parámetros OUTPUT para un solo procedimiento almacenado. Si usted necesita devolver un conjunto de resultados, entonces debe especificar una sentencia SELECT en el procedimiento.

Si el procedimiento es el primer comando en un batch, puede especificar sólo el nombre del procedimiento. De lo contrario, es necesario utilizar el comando EXEC.

IF. . . ELSE se utiliza para ejecutar la instrucción que le sigue o bien un bloque de instrucciones en el procedimiento. WHILE se utiliza para ejecutar un bloque de código muchas veces.

Utilice EXEC(<command>) o sp_executesql <command>

Encierre el bloque de código en un bloque TRY. . . CATCH

Utilice un CURSOR

Devolver un valor simple desde un procedimiento almacenado

Ejecutar un procedimiento almacenado

Ejecutar código condicionalmente

Dinámicamente ejecutar un comando

Atrapar y controlar los errores

Procesar un conjunto de resultados de a una fila por vez

www.detodoprogramacion.com

Page 215: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 13

Funciones

Después de completar este capítulo, usted será capaz de

 

 

Recuperar datos desde una función de usuario o de sistema

Crear una función usando T-SQL

Las funciones se utilizan para realizar cálculos que se le pueden devolver a una aplicación de llamada o estar integrada en un conjunto de resultados. En este capítulo, usted aprenderá acerca de la variedad de funciones del sistema que se incluyen con SQL Server. También aprenderá a crear sus propias funciones mediante T-SQL.

Nota Puede crear triggers, funciones y procedimientos almacenados a través del lenguaje común en tiempo de ejecución (CLR). Construir módulos de código en un lenguaje CLR-compatible, como C#. NET o Visual Basic.NET está más allá del alcance de este libro.

Funciones del sistema

SQL server viene con una amplia gama de funciones que se pueden utilizar para realizar muchas operaciones. Las funciones integradas se pueden dividir en 15 categorías diferentes, como se muestra en la Tabla 13-1.

Nota Usted aprendió sobre las variables locales y globales en el Capítulo 12, "Procedimientos almacenados". Aunque una variable global devuelve un valor escalar, muchas de las variables globales son en realidad funciones.

TABLA 13-1 Funciones del sistema

Propósito

Combinan varios valores tales como SUM, AVG, COUNT_BIG, y VAR

Devuelven la información de configuración del sistema, tales como @@VERSION, @@SERVERNAME y @@LANGUAGE

Función para soportar el cifrado y descifrado, sobre las que usted aprenderá más en el capítulo 18, "Seguridad"

Devuelven información acerca del estado de un cursor como @@FETCH_STATUS y @@CURSOR_ROWS

Devuelven partes de una fecha/hora o calcula fechas y horas, como DATEADD, DATEPART, DATEDIFF y GETDATE

Retornan información para manejar porciones de SQL Server, como sys.dm_db_index_physical_stats, y sys.dm_db_index_operational_stats y fn_trace_gettable

Opción

Aggregates

Configuration

Cryptographic

Cursor

Date and time

Management

199

www.detodoprogramacion.com

Page 216: Microsoft SQL Server 2008 Español - Mike Hotek

200 Parte IV diseño de objetos de bases de datos avanzadas

TABLA 13-1 Funciones del sistema

Propósito

Realizar operaciones matemáticas, tales como SIN, COS, TAN, LOG, PI, y ROUND

Devuelven información acerca de los objetos de base de datos tales como OBJECT_NAME, OBJECT_ID, DATABASEPROPERTYEX y DB_NAME

Devuelve valores usados en un conjuntos de resultados clasificados (ranking), tal como se describió en el capítulo 9, " Recuperación avanzada de datos "

Devuelven un conjunto de resultados que se pueden unir a otras tablas, por ejemplo, CONTAINS y FREETEXT, como se describe en el Capítulo 17, "Indexación de texto completo"

Retornan información de seguridad acerca de los usuarios y roles, como SUSER_SNAME, Has_perms_by_name y USER_NAME

Manipular datos CHAR y VARCHAR, como POS, CHARINDEX, SOUNDEX, REPLACE, STUFF y RTRIM

Devuelven información sobre una variedad de configuraciones de sistema, bases de datos y objetos así como datos, tales como DATALENGTH, HOST_NAME, ISDATE, ISNULL, SCOPE_IDENTITY, CAST y CONVERT

Devuelven información operativa sobre una instancia, tales como fn_virtualfilestats y @@CONNECTIONS

Manipular datos de texto e imagen, tales como TEXTPTR o TEXTVALID. Los tipos de datos texto e imagen están en desuso, y no debería utilizar ninguna de estas funciones en las aplicaciones.

Opción

Mathematical

Metadata

Ranking

Rowset

Security

String

System

System statistics

Text and image

Creación de una Función

Aunque las funciones se utilizan para realizar cálculos, una función no puede cambiar el estado de una base de datos o instancia. Las funciones no pueden:

 

 

 

 

 

Realizar una acción que cambie el estado de una instancia o base de datos.

Modificar datos en una tabla.

Llamar a una función que tiene un efecto externo, tal como la función RAND ().

Crear o acceder a tablas temporales.

Ejecutar código dinámicamente.

Las funciones pueden devolver un valor escalar o una tabla. Con valores de tabla las funciones pueden ser de dos diferentes tipos: en línea (inline) y multi-declaración (multi-statement).

La sintaxis general de una función escalar es:

CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type

[ = default ] [ READONLY ] } [ ,...n ] ]) RETURNS return_data_type

[ WITH <function_option> [ ,...n ] ] [ AS]

www.detodoprogramacion.com

Page 217: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 13 Funciones

BEGIN function_body

RETURN scalar_expression END

201

Una función con valores de tabla en línea (inline) contiene una única sentencia SELECT que devuelve una tabla. Puesto que una función con valores de tabla en línea no realiza ninguna otra operación, el optimizador la trata igual que una vista.

La sintaxis general de una función con valores de tabla en línea (inline) es la siguiente:

CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type

[ = default ] [ READONLY ] } [ ,...n ] ]) RETURNS TABLE

[ WITH <function_option> [ ,...n ] ] [ AS ] RETURN [ ( ] select_stmt [ ) ][

La sintaxis general para una función múlt-sentencia con valores de tabla es la siguiente:

CREATE FUNCTION [ schema_name. ] function_name ( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type

[ = default ] [READONLY] } [ ,...n ] ]) RETURNS @return_variable TABLE <table_type_definition>

[ WITH <function_option> [ ,...n ] ] [ AS ] BEGIN

function_body RETURN

END

Sin importar el tipo de función, hay cuatro opciones que se pueden especificar: ENCRYPTION, SCHEMABINDING, RETURNS NULL ON NULL INPUT / CALLED ON NULL INPUT, y EXECUTE AS. ENCRYPTION, SCHEMABINDING y EXECUTE AS son opciones que también están disponibles para procedimientos almacenados. ENCRYPTION y SCHEMABINDING pueden además usarse para triggers y vistas.

Cuando se especifica la opción ENCRYPTION, SQL Server aplicará un OR bit a bit al código del objeto. La opción ENCRYPTION es un remanente de las primeras versiones de SQL Server y la opción causa un poco de confusión. Cuando se especifica la opción ENCRYPTION, no está aplicando una rutina de cifrado para ocultar su código. El algoritmo que utiliza SQL Server es un simple OR bit a bit que sólo ofusca el código en el objeto (lo hace ininteligible). Si nos fijamos en la definición del objeto, aparecerá como ininteligible, sin embargo, una rutina muy simple invertirá la ofuscación en menos de un segundo. SQL Server no le permitirá ocultar el código en triggers, funciones, vistas, procedimientos almacenados y cualquiera con autoridad VIEW DEFINITION sobre el objeto puede recuperar el código que usted ha escrito. SQL Server no es una solución del tipo “gestión digital de derechos” (Digital Rights Management - DRM).

www.detodoprogramacion.com

Page 218: Microsoft SQL Server 2008 Español - Mike Hotek

202 Parte IV diseño de objetos de bases de datos avanzadas

Nota Los triggers, funciones, vistas y procedimientos almacenados se denominan colectivamente como objetos programables.

La opción SCHEMABINDING se aplica para asegurar que no se puedan eliminar objetos dependientes. Por ejemplo, si desea crear una función que realiza un SELECT sobre la taba Orders.OrderHeader, normalmente debería ser posible eliminar la tabla sin recibir un mensaje de error. La próxima vez que se ejecute la función, se recibirá un error diciendo que la tabla Orders.OrderHeader no existe. Para evitar que los objetos, a los que un objeto programable hace referencia, se eliminen o modifiquen, debe especificar la opción SCHEMABINDING. Si intenta eliminar o modificar el objeto dependiente, SQL Server evitaría el cambio. Para llevar a cabo la eliminación o modificación de un objeto dependiente, usted tendría que eliminar primero el objeto programable que depende del objeto que desea eliminar o modificar.

Las funciones y los procedimientos almacenados le permiten modificar el contexto de seguridad del objeto que se está ejecutando a través de la opción EXECUTE AS. EXECUTE tiene tres argumentos posibles:

 

 

LOGIN Ejecuta bajo el contexto de un “login” especifico.

USUARIO Ejecuta bajo el contexto de seguridad del usuario de base de datos especificado. Esta cuenta

no puede ser un rol, group, certificate o clave asimétrica (asymmetric key).

CALLER Se ejecuta bajo el contexto de seguridad de la rutina que llamó al módulo.

 

La cláusula EXECUTE AS también tiene dos argumentos adicionales: NO REVERT y COOKIE INTO. La opción NO REVERT especifica que una vez que se cambia el contexto de seguridad, no puede ser cambiado de nuevo. La opción COOKIE INTO establece una cookie que le permite al contexto de seguridad ser devuelto a un contexto de seguridad específico, anterior.

Nota Los objetos de Seguridad y la suplantación (impersonation) se tratarán en el capítulo 18.

La opción que es única para una función es RETURNS NULL ON NULL INPUT o CALLED ON NULL INPUT. El valor por defecto es CALLED ON NULL INPUT. En la configuración predeterminada, si especifica una parámetro NULL, la función se llamará igual y se ejecutará cualquier código dentro de la función. Si se especifica el valor RETURNS NULL ON NULL INPUT, cuando se especifica un NULL como parámetro de entrada, SQL Server no ejecuta la función, e inmediatamente devuelve un valor NULL a la rutina de llamada. Si tiene una función que sólo debe ejecutarse si se pasó un valor no NULL como parámetro, debe especificar la opción RETURNS NULL ON NULL INPUT para que usted pueda evitar la ejecución de código extraño.

En el siguiente ejercicio, creará una función para recuperar la orden más vieja no enviada.

www.detodoprogramacion.com

Page 219: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 13 Funciones 203

Crear una función escalar

1. Ejecute el siguiente código (el código puede encontrarse en el archivo Capítulo 13\ code1.sql):

CREATE FUNCTION Orders.fn_oldestopenorder() RETURNS INT AS BEGIN

DECLARE @OrderID INT, @MinOrderDate DATE

SELECT @MinOrderDate = MIN(OrderDate) FROM Orders.OrderHeader WHERE FinalShipDate IS NULL SELECT @OrderID = MIN(OrderID) FROM Orders.OrderHeader WHERE OrderDate = @MinOrderDate RETURN @OrderID

END GO

En el siguiente ejercicio, creará una función para recuperar la lista de pedidos más viejos que un número especificado de días que no se han enviado todavía.

Crear una función con valores de tabla

1. Ejecute el siguiente código (que puede encontrarse en el archivo Capítulo 13\ code1.sql):

CREATE FUNCTION Orders.fn_openorders (@NumDays INT) RETURNS TABLE AS RETURN (SELECT OrderID, CustomerID, OrderDate FROM Orders.OrderHeader WHERE OrderDate <= DATEADD(dd,@NumDays,GETDATE())

AND FinalShipDate IS NULL) GO

En el siguiente ejercicio, creará una función para recuperar la lista de pedidos más viejos que un número especificado de días y que no se han enviado todavía. Usted sólo quiere devolver la lista de órdenes que tiene suficiente inventario para satisfacer.

Crear una función multi-declaración con valores de tabla

1. Ejecute el siguiente código (que puede encontrarse en el archivo Capítulo 13\ code1.sql):

CREATE FUNCTION Orders.fn_openshippableorders(@NumDays INT) RETURNS @ShippableOrders TABLE

www.detodoprogramacion.com

Page 220: Microsoft SQL Server 2008 Español - Mike Hotek

204 Parte IV diseño de objetos de bases de datos avanzadas

(OrderID INT NOT NULL, CustomerID INT NOT NULL, OrderDate DATE NOT NULL) AS BEGIN

DECLARE @OpenOrders TABLE (OrderID INT NOT NULL, CustomerID INT NOT NULL, OrderDate DATE NOT NULL)

INSERT INTO @OpenOrders (OrderID, CustomerID, OrderDate) SELECT OrderID, CustomerID, OrderDate FROM Orders.fn_openorders(@NumDays)

INSERT INTO @ShippableOrders (OrderID, CustomerID, OrderDate) SELECT a.OrderID, a.CustomerID, a.OrderDate FROM @OpenOrders a INNER JOIN

(SELECT OrderID FROM Orders.OrderDetail EXCEPT SELECT OrderID FROM Orders.OrderDetail c INNER JOIN Products.ProductOptions d ON c.SKU = d.SKU INNER JOIN Products.ProductInventory e ON d.ProductID = e.ProductID WHERE c.Quantity >= e.Quantity) b ON a.OrderID = b.OrderID

RETURN END GO

Recuperación de datos desde una función

Usted recupera los datos desde una función mediante el uso de una sentencia SELECT. Las funciones pueden usarse en:

 

 

 

 

 

Una cláusula SELECT

Una cláusula WHERE

Expresión

Restricciones CHECK o DEFAULT

Cláusula FROM con la función CROSS / OUTER APPLY

Según como se utiliza una función, puede tener un impacto dramático en el rendimiento de las consultas que

se ejecutan.

Una función en la lista SELECT se utiliza para calcular un agregado o realizar un cálculo en una o más columnas de las tablas de la cláusula FROM.

Una función en la cláusula WHERE se utiliza para restringir un conjunto de resultados basados en el resultado de la función. Usted no debería crear consultas que utilizan una función en la cláusula WHERE, porque la función se tiene que ejecutar una vez por cada fila en el conjunto de resultados, con el fin de determinar si la fila “matchea” o coincide con el criterio de búsqueda.

www.detodoprogramacion.com

Page 221: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 13 Funciones 205

Por ejemplo, si usted fuera a utilizar la función Orders.fn_olderstopenorder en una cláusula WHERE, la función tendría que ejecutar para cada potencial fila que retornó la cláusula FROM. Si el join fue entre las tablas OrderHeader y OrderDetail que produjeron 100 registros coincidentes con el join, Órdenes.fn_oldestopenorder sería ejecutada 100 veces. Si el resultado del join produjo 10.000 filas, la función sería ejecutado 10.000 veces. Sin embargo, si tuviera que volver a escribir la consulta para eliminar la función, se eliminarían todas las consultas repetitivas que eran ejecutadas.

Cuando una función es usada dentro de una expresión, está apilando múltiples cálculos juntos con el fin de llegar a un resultado final. Por ejemplo, es muy común ver en código de análisis de cadenas que se ven algo similar a lo siguiente: DATALENGTH(POS(CHARINDEX. . .(REPLACE. . .(. . .)))).

Las funciones en las restricciones CHECK y DEFAULT se utilizan para extender los cálculos estáticos disponibles. Por ejemplo, si desea validar el código de área para un número de teléfono contra una lista de códigos de área almacenados dentro de una tabla, puede utilizar una función para realizar la validación que normalmente no sería posible, ya que una restricción CHECK no acepta una sentencia SELECT.

Usted va a ver un ejemplo de la utilización de una función con las funciones CROSS / OUTER APPLY en el Capítulo 22, "Vistas de administración dinámica".

En el siguiente ejercicio, recuperará los datos de las tres funciones que se han creado anteriormente en este capítulo.

Nota A lo largo de este libro, he utilizado el código en lugar de capturas de pantalla siempre que sea posible, ya que no sólo proporciona una mejor experiencia de aprendizaje, sino que también reduce el número de páginas para obtener el punto de vista. También he dejado deliberadamente fuera del texto los conjuntos de resultados, ya que los conjuntos de resultados tienden a añadir páginas, sin proporcionar una experiencia de aprendizaje significativa para compensar. En casi todos los casos, se puede ejecutar el código contra las bases de datos creadas en este libro o en la base de datos AdventureWorks de muestra y ver los resultados de una manera más flexible. Sin embargo, estoy incluyendo conjuntos de resultados dentro de los siguientes ejercicios con el fin de proporcionar una comparación con el código ya que los datos de la base de datos serán diferentes. Cada orden que entró en mi base de datos no han sido aun enviadas, por lo que todos los pedidos se consideran todavía abiertos.

Recuperar datos desde una Función

1. Ejecute el siguiente código para ver el contenido de la tabla Orders.OrderHeader (el código se puede encontrar en el archivo Capítulo 13\ code1.sql y el conjunto de resultados en el archivo Capítulo 13\result1.csv):

SELECT OrderID, CustomerID, OrderDate FROM Orders.OrderHeader

www.detodoprogramacion.com

Page 222: Microsoft SQL Server 2008 Español - Mike Hotek

206 Parte IV Diseño de objetos de bases de datos avanzadas

OrderID

1

2

3

4

5

6

7

8

9

13

14

15

16

CustomerID

1

1

1

1

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

08/18/2008

08/18/2008

08/18/2008

08/18/2008

2. Ejecute el siguiente código para ver el contenido de la tabla Orders.OrderDetail (el código se puede encontrar en el archivo Capítulo 13\ code1.sql y el conjunto de resultados en el archivo Capítulo 13\result2.csv):

SELECT OrderID, OrderDetailID, SKU, Quantity FROM Orders.OrderDetail

OrderID

1

1

2

2

3

3

4

4

5

5

6

6

7

7

8

8

9

9

OrderDetailID

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

SKU

1-4RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

1-2RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

1-2RB1-2RO

1-4RB1-2RO

Cantidad

1

16

1

16

10

10

10

10

10

10

10

10

10

10

10

10

10

10

www.detodoprogramacion.com

Page 223: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 13 Funciones 207

OrderID

14

15

16

OrderDetailID

22

23

24

SKU

1-2RB1-4RO

1-2RB1-4RO

1-2RB1-4RO

Cantidad

5

5

5

3. Ejecute el siguiente código para ver la cantidad de cada SKU en la base de datos (el código se puede encontrar en el archivo Capítulo 13\code1.sql y el conjunto de resultados en el archivo Capítulo 13\result3.csv):

SELECT a.SKU, a.ProductID, b.Quantity FROM Products.ProductOptions a INNER JOIN Products.ProductInventory b

ON a.ProductID = b.ProductID

SKU

1-2RB1-2RO

1-2RB1-4RO

1-2RB3-4RO

1-4RB1-2RO

1-4RB1-4RO

ProductID

2

2

2

1

1

Cantidad

50

50

50

50

50

4. Ejecute la siguiente consulta para recuperar los resultados de la función escalar creada anteriormente:

SELECT Orders.fn_oldestopenorder()

5. Ejecute el siguiente código para ver los pedidos pendientes mayores de 1 día (el código se encuentra en el Capítulo 13\ code1.sql y el conjunto de resultados en el archivo Capítulo 13\result4.csv):

SELECT * FROM Orders.fn_openorders(1)

OrderID

1

2

3

4

5

6

7

8

9

13

14

15

16

CustomerID

1

1

1

1

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

08/18/2008

08/18/2008

08/18/2008

08/18/2008

www.detodoprogramacion.com

Page 224: Microsoft SQL Server 2008 Español - Mike Hotek

208 Parte IV diseño de objetos de bases de datos avanzadas

6. Ejecute el siguiente código para ver los pedidos pendientes mayores de 5 días (el código se encuentra en el archivo Capítulo 13\ code1.sql y el conjunto de resultados en Capítulo 13\result5.csv):

SELECT * FROM Orders.fn_openorders(5)

OrderID

1

2

3

4

5

6

7

8

9

13

14

15

16

CustomerID

1

1

1

1

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

08/18/2008

08/18/2008

08/18/2008

08/18/2008

En los capítulos anteriores, hemos trabajado con la declaración ALTER para modificar los objetos existentes

tales como tablas o esquemas de partición. Usted puede modificar cualquiera de los objetos programables mediante el uso de la correspondiente declaración ALTER: ALTER TRIGGER, ALTER FUNCTION, ALTER VIEW, y ALTER PROCEDURE. La modificación de un objeto programable es mucho menos flexible que cualquiera otro objeto en SQL Server. Todo el código en un objeto programable es una sola unidad. Si usted necesita cambiar el código de un objeto programable, tiene dos opciones: DROP/CREATE y ALTER. ALTER reemplazará la definición entera del objeto en su lugar.

Aunque la función con valores de tabla que creó para devolver la lista de pedidos, proporciona un conjunto de resultados, el conjunto de resultados que se devuelve es incorrecto. La función DATEADD está agregando días a los datos actuales del sistema, por lo tanto, cada pedido siempre será devuelta ya que el OrderDate estará siempre en el pasado y la comparación es a una fecha futura.

Modificar un objeto programable

1. Ejecute el siguiente código para modificar la función Orders.fn_openorders (el código se encuentra en el archivo Capítulo 13\code1.sql):

ALTER FUNCTION Orders.fn_openorders (@NumDays INT) RETURNS TABLE AS RETURN (SELECT OrderID, CustomerID, OrderDate

www.detodoprogramacion.com

Page 225: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 13 Funciones

FROM Orders.OrderHeader WHERE OrderDate <= DATEADD(dd,-@NumDays,GETDATE())

AND FinalShipDate IS NULL) GO

209

2. Ejecute el siguiente código para ver los pedidos pendientes mayores de 1 día (el código se puede encontrar en el archivo Capítulo 13\ code1.sql y el conjunto de resultados en el archivo Capítulo 13\result6.csv):

SELECT * FROM Orders.fn_openorders (1)

OrderID

1

2

3

4

5

6

7

8

9

13

14

15

16

CustomerID

1

1

1

1

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

08/18/2008

08/18/2008

08/18/2008

08/18/2008

3. Ejecute el siguiente código para ver los pedidos pendientes mayores de 5 días (el código se puede

encontrar en el archivo Capítulo 13\ code1.sql y el conjunto de resultados en el archivo Capítulo 13\result7.csv):

SELECT * FROM Orders.fn_openorders(5)

OrderID

1

2

3

4

5

6

7

8

9

CustomerID

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

www.detodoprogramacion.com

Page 226: Microsoft SQL Server 2008 Español - Mike Hotek

210 Parte IV Diseño de objetos de bases de datos avanzadas

4. Ejecute el siguiente código para ver los pedidos pendientes de más de 3 días y que pueden ser enviados (el código se puede encontrar en el archivo Capítulo 13\code1.sql y el conjunto de resultados en el archivo Capítulo 13\result8.csv):

SELECT * FROM Orders.fn_openshippableorders (3)

OrderID

1

2

3

4

5

6

7

8

9

13

14

15

16

CustomerID

1

1

1

1

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

08/18/2008

08/18/2008

08/18/2008

08/18/2008

5. Ejecute el siguiente código para ver los pedidos pendientes mayores de 5 días y que pueden ser enviados (el código se puede encontrar en el archivo Capítulo 13\code1.sql y el conjunto de resultados en el archivo Capítulo 13\result9.csv):

SELECT * FROM Orders.fn_openshippableorders (5)

OrderID

1

2

3

4

5

6

7

8

9

CustomerID

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

www.detodoprogramacion.com

Page 227: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 13 Funciones 211

6. Modificar “a mano” el inventario para el ProductID 2, por lo que varios de los pedidos no tendrán suficiente cantidad para cubrirlo (el código puede encontrarse en el archivo Capítulo 13\code1.sql):

UPDATE Products.ProductInventory SET Quantity = 15 WHERE ProductID = 2

7. Ejecute el siguiente código para ver los pedidos pendientes de más de 3 días que pueden ser enviados (el código se puede encontrar en el archivo Capítulo 13\code1.sql y el conjunto de resultados en el archivo Capítulo 13\result10.csv):

SELECT * FROM Orders.fn_openshippableorders(3)

OrderID

3

4

5

6

7

8

9

14

15

16

CustomerID

1

1

1

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

08/18/2008

08/18/2008

08/18/2008

8. Ejecute el siguiente código para ver los pedidos pendientes mayores de 5 días que pueden ser enviados (el código se puede encontrar en el archivo Capítulo 13\code1.sql y el conjunto de resultados en el archivo Capítulo 13\result11.csv):

SELECT * FROM Orders.fn_openshippableorders(5)

OrderID

3

4

5

6

7

8

9

CustomerID

1

1

1

1

1

1

1

OrderDate

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

28/06/2008

07/01/2008

www.detodoprogramacion.com

Page 228: Microsoft SQL Server 2008 Español - Mike Hotek

212 Parte IV Diseño de objetos de bases de datos avanzadas

Capítulo 13 Referencia Rápida

Para

Ejecutar una función

Haga lo siguiente

Utilice la función en las cláusulas SELECT, FROM o WHERE de una declaración SELECT o dentro de una restricción CHECK o DEFAULT

Especifique la opción SCHEMABINDING

Especifique la opción RETURNS NULL ON NULL INPUT

Especifique la cláusula EXECUTE AS

Asegurar que los objetos dependientes no pueden ser eliminados bajo una función

Regresar sin ejecutar ninguna función si se pasa un parámetro NULL

Modificar el contexto de seguridad bajo el que se ejecuta la función.

www.detodoprogramacion.com

Page 229: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 14

Disparadores

Después de completar este capítulo, usted será capaz de

 

 

Crear desencadenadores DML

Crear desencadenadores DDL

Los desencadenadores (triggers) proporcionan un medio para permitir que se ejecute automáticamente código cuando se produce una acción. Hay dos tipos de disparadores disponibles en Microsoft SQL Server 2008: DML y DDL. En esta lección, aprenderá a crear desencadenadores DML que se ejecutan al agregar, modificar o eliminar filas en una tabla. También aprenderá a crear desencadenadores DDL que se ejecutan al ejecutan comandos DDL o cuando los usuarios se conectan a una instancia.

Desencadenadores DML

Aunque las funciones y los procedimientos almacenados son objetos independientes, usted no puede ejecutar directamente un trigger. Los desencadenadores DML se crean contra una tabla o una vista, y se definen para un evento específico INSERT, UPDATE, o DELETE. Cuando ejecuta el evento para el que se definió un disparador, SQL Server ejecuta automáticamente el código incluido en el trigger, también conocido como "disparar" el trigger.

La sintaxis genérica para crear un trigger es:

CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }

Cuando el trigger se define como AFTER, el desencadenador se dispara después que la modificación ha pasado todas las restricciones (constraints). Si en una modificación falla una comprobación de restricción, tal como un check, clave principal o clave foránea, el trigger no se ejecuta. Los desencadenadores AFTER sólo se definen para las tablas. Puede definir varios desencadenadores AFTER para la misma acción.

Un disparador definido con la cláusula INSTEAD OF hace que el código del trigger sea ejecutado como un reemplazo para INSERT, UPDATE, o DELETE. Es posible definir un solo desencadenador INSTEAD OF para

una acción determinada. A pesar de que los desencadenadores INSTEAD OF se pueden crear sobre tablas y vistas, estos son casi siempre creados sobre vistas.

Independientemente del número de filas que se ven afectadas, un disparador sólo se activa una vez para una acción.

213

www.detodoprogramacion.com

Page 230: Microsoft SQL Server 2008 Español - Mike Hotek

214 Parte IV Diseño de objetos de bases de datos avanzadas

Como se explica en el Capítulo 10, "Manipulación de datos" SQL Server tiene un par de tablas denominadas

inserted y deleted disponibles cuando se ejecutan cambios.

En el siguiente ejercicio, creará un desencadenador DML que llena la columna FinalShipDate de la tabla Orders.OrderHeader cuando la columna ShipDate ha sido llenada para todas las filas de la tabla Orders.OrderDetail para un OrderID.

Crear un desencadenador DML

1. Ejecutar el siguiente código en la base de datos SQL2008SBS (el código está Capítulo 14\code1.sql):

CREATE TRIGGER tiud_orderdetail ON Orders.OrderDetail FOR INSERT, UPDATE, DELETE AS UPDATE a SET a.FinalShipDate = c.FinalShipDate FROM Orders.OrderHeader a INNER JOIN

(SELECT od1.OrderID, MAX(od1.ShipDate) FinalShipDate FROM Orders.OrderDetail od1 INNER JOIN

(SELECT od2.OrderID FROM Orders.OrderDetail od2 INNER JOIN inserted i ON od2.OrderID = i.OrderID WHERE od2.ShipDate IS NOT NULL EXCEPT SELECT od3.OrderID FROM Orders.OrderDetail od3 INNER JOIN inserted i ON od3.OrderID = i.OrderID WHERE od3.ShipDate IS NULL) b

ON od1.OrderID = b.OrderID GROUP BY od1.OrderID) c

ON a.OrderID = c.OrderID GO

2. Valide su nuevo disparador creado, estableciendo la columna ShipDate para todas las filas de detalles de Orden, para un pedido.

En el siguiente ejercicio, creará un desencadenador DML que exige la integridad referencial entre las bases de datos SQL2008SBS y SQL2008SBSFS.

Crear un desencadenador DML

1. Ejecutar el siguiente código en la base de datos SQL2008SBS (el código está en el archivo Capítulo 14\code2.sql):

USE SQL2008SBSFS GO CREATE TRIGGER tiu_productdocuments ON Products.ProductDocument FOR INSERT, UPDATE AS IF EXISTS (SELECT 1 FROM SQL2008SBS.Products.Product a

INNER JOIN inserted b ON a.ProductID = b.ProductID)

www.detodoprogramacion.com

Page 231: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 14 Disparadores

BEGIN RETURN END ELSE BEGIN ROLLBACK TRANSACTION RAISERROR('Violation of foreign key',16,1) END GO USE SQL2008SBS GO CREATE TRIGGER td_product ON Products.Product FOR DELETE AS IF EXISTS (SELECT 1 FROM SQL2008SBSFS.Products.ProductDocument a

INNER JOIN deleted b ON a.ProductID = b.ProductID) BEGIN

ROLLBACK TRANSACTION RAISERROR('You must first delete all documents for this product',16,1)

END ELSE BEGIN RETURN END GO

215

2. Valide su nuevo disparador creado intentando insertar un documento con un ProductID que no exista.

Desencadenadores DDL

Los desencadenadores DDL se ejecutan en las siguientes circunstancias:

 

 

Cuando se ejecuta una sentencia DDL.

Cuando un usuario se registra en una instancia.

La sintaxis general para la creación de un desencadenador DDL es como sigue:

CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH <ddl_trigger_option> [ ,...n ] ] { FOR | AFTER } { event_type | event_group } [ ,...n ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier > [ ; ] } <ddl_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> ::= assembly_name.class_name.method_name

www.detodoprogramacion.com

Page 232: Microsoft SQL Server 2008 Español - Mike Hotek

216 Parte IV Diseño avanzado de objetos de bases de datos

Los desencadenadores DDL pueden tener el alcance (scope) tanto a nivel de base de datos como de instancia. Para el alcance de un desencadenador DDL a nivel de instancia, se utilizará la opción ON ALL SERVER. Para el alcance de un desencadenador DDL a nivel de base de datos, utilice la opción ON DATABASE.

El siguiente es un ejemplo de un desencadenador DDL:

CREATE TRIGGER tddl_tabledropalterprevent ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS

PRINT 'You are attempting to drop or alter tables in production!' ROLLBACK;

Nota Casi todos los comandos DDL corren en el contexto de una transacción. Dado que un desencadenador DDL también se ejecuta en el contexto de la misma transacción, cualquier sentencia DDL que se ejecuta en el contexto de una transacción puede ser revertida. ALTER DATABASE es uno de los comandos que no se ejecutan en el contexto de una transacción, porque el comando afecta a los objetos fuera de SQL Server que no obedecen a la semántica transaccional. Por lo tanto, un comando ALTER DATABASE no se puede deshacer.

El valor para el tipo de evento se deriva de la instrucción DDL que esta siendo ejecutada, como se indica en la Tabla 14-1.

TABLA 14-1 Tipos de eventos de triggers DDL

Tipo de evento

CREATE_DATABASE

DROP_TRIGGER

ALTER_TABLE

DDL Comando

CREATE DATABASE

DROP TRIGGER

ALTER TABLE

Los tipos de eventos suben dentro de una jerarquía de comando llamada “grupos de eventos” (event group). Por ejemplo, los tipos de eventos CREATE_TABLE, ALTER_TABLE, y DROP_TABLE están contenidos dentro del grupo de eventos DDL_TABLE_EVENTS. Los tipos de eventos y grupos de eventos le permiten crear desencadenadores DDL flexibles y compactos.

Más información Los eventos y grupos de eventos asociados que son válidos para un trigger DDL se pueden encontrar en el artículo "Grupos de eventos para usar con desencadenadores DDL" dentro de los Libros en pantalla.

Aunque los desencadenadores DML tienen acceso a las tablas inserted y deleted, los disparadores DDL tienen

acceso a la función EVENTDATA() que devuelve el siguiente documento XML que se puede consultar utilizando el método value()disponible a través de XQUERY:

<EVENT_INSTANCE> <EventType>type</EventType> <PostTime>date-time</PostTime>

www.detodoprogramacion.com

Page 233: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 14 Disparadores

<SPID>spid</SPID> <ServerName>name</ServerName> <LoginName>name</LoginName> <UserName>name</UserName> <DatabaseName>name</DatabaseName> <SchemaName>name</SchemaName> <ObjectName>name</ObjectName> <ObjectType>type</ObjectType> <TSQLCommand>command</TSQLCommand>

</EVENT_INSTANCE>

217

Puede recuperar la base de datos, esquema, objeto y comando que ejecutó, a través de la siguiente consulta:

SELECT EVENTDATA().value ('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(max)'),

EVENTDATA().value ('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(max)'),

EVENTDATA().value ('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(max)'),

EVENTDATA().value ('(/EVENT_INSTANCE/TSQLCommand)[1]','nvarchar(max)')

En el siguiente ejercicio, se crea un desencadenador DDL para evitar una eliminación accidental de las tablas en un entorno de producción.

Crear un trigger DDL a nivel de base de datos

1. Ejecutar el siguiente código en la base de datos SQL2008SBS (el código está en el archivo Capítulo 14\code3.sql):

CREATE TRIGGER tddl_preventdrop ON DATABASE FOR DROP_TABLE AS

PRINT 'Please disable DDL trigger before dropping tables' ROLLBACK TRANSACTION

GO

2. Validar su trigger al tratar de eliminar una tabla en la base de datos SQL2008SBS.

En el siguiente ejercicio, se crea un trigger logon para limitar el número de conexiones concurrentes para un usuario.

Crear un trigger DDL a Nivel Instancia

1. Ejecutar el siguiente código (el código está en el archivo Capítulo 14\ code4.sql):

CREATE TRIGGER tddl_limitconnections ON ALL SERVER FOR LOGON

www.detodoprogramacion.com

Page 234: Microsoft SQL Server 2008 Español - Mike Hotek

218 Parte IV diseño de objetos de bases de datos avanzadas

AS BEGIN IF (SELECT COUNT(*) FROM sys.dm_exec_sessions

WHERE is_user_process = 1 AND login_name = suser_sname()) > 5

PRINT 'You are only allowed a maximum of 5 concurrent connections'

ROLLBACK END GO

2. Valide su trigger al tratar de crear más de cinco conexiones simultáneas.

Nota Tiene que tener cuidado con un disparador de inicio de sesión, especialmente uno que impida iniciar sesión sobre la instancia. En el ejercicio anterior, tenía un trigger para aplicar a todos los Inicios de sesión. Siempre debe excluir los inicios de sesión que son miembros de la función sysadmin, porque usted no querría causar que un sysadmin no esté disponible para iniciar sesión a una instancia.

Capítulo 14 Referencia Rápida

Para

Ejecutar código cuando se ejecuta un comando DML

Ejecutar código cuando se ejecuta un comando DDL

Haga lo siguiente

Crear un trigger DML

Crear un trigger DDL

www.detodoprogramacion.com

Page 235: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 15

Instantáneas de base de datos

Después de completar este capítulo, usted será capaz de

 

 

Crear una instantánea de base de datos

Revertir una base de datos a partir de una instantánea de base de datos

Las instantáneas de base de datos se introdujeron en SQL Server 2005 para proporcionar a los usuarios un método para crear rápidamente copias de datos de sólo lectura. En este capítulo, usted aprenderá a crear una instantánea de base de datos, así cómo a utilizar una instantánea de base de datos para recuperar datos o una base de datos a un punto anterior en el tiempo.

Nota Las instantáneas de base de datos sólo están disponibles en la edición Enterprise de SQL Server.

Precaución Las instantáneas de bases de datos no son compatibles con FILESTREAM. Si crea una Snapshot contra una base de datos con datos FILESTREAM, el grupo de archivos FILESTREAM se desactivará y no será accesible.

Creación de una instantánea de base de datos

La creación de una instantánea de base es muy similar a la creación de cualquier base de datos. Para crear una instantánea de base de datos, utilice el comando CREATE DATABASE con la cláusula AS SNAPSHOT OF. Dado que una instantánea de base de datos es una copia de sólo lectura y de un “punto en el tiempo”, usted no especifica un registro de transacciones.

Los requisitos para crear una instantánea de base de datos son:

 

 

Debe incluir una entrada para cada archivo de datos especificado en la base de datos de origen.

El nombre lógico de cada archivo debe coincidir exactamente con el nombre en la base de datos de origen.

La sintaxis genérica para crear una instantánea de base de datos es:

CREATE DATABASE database_snapshot_name ON

(NAME = logical_file_name, FILENAME = 'os_file_name' ) [ ,...n ]

AS SNAPSHOT OF source_database_name e

219

www.detodoprogramacion.com

Page 236: Microsoft SQL Server 2008 Español - Mike Hotek

220 Parte IV Diseño de objetos de bases de datos avanzadas

Las restricciones en una instantánea de base de datos son:

 

 

 

 

No puede realizar backup, restore o detach de una instantánea de base de datos.

La instantánea de base de datos debe existir en la misma instancia que la base de origen.

Los índices Full-text no son soportados.

No se puede realizar ninguna operación contra una instantánea de base de datos que modifique la estructura de una base de datos, tales como CREATE, ALTER, DROP, o la aplicación de replicación.

Usted no puede crear una instantánea de base de datos de una base de datos del sistema.

No puede eliminar, restaurar o separar una base de datos de origen que tiene una instantánea de base de datos creada.

Usted no puede hacer referencia a grupos de archivos que están fuera de línea, desaparecida (defunct), o restaurando.

 

 

 

Nota Mientras que una base de datos “mirror” es inaccesible a las consultas, puede crear una instantánea de base de datos contra una base de datos “mirror”, que luego le permitiría leer el espejo.

Cuando es creada una instantánea de base de datos, SQL Server no asigna espacio en disco equivalente a el tamaño actual de los archivos de datos en la base de datos de origen. En su lugar, SQL Server se aprovecha de una característica del sistema operativo llamada archivos dispersos (sparse files). Un archivo disperso es esencialmente una entrada en la tabla de asignación del archivo (file allocation table) y no consume casi datos en el disco. A medida que se agregan datos al archivo, éste crece automáticamente en el disco. Mediante el aprovechamiento de los archivos dispersos, el tiempo de creación de una base de datos Instantánea es independiente del tamaño de la base de datos origen.

Acceder a una base de datos de instantánea desde una aplicación es muy simple. Una base de datos fotografiada parece y actúa como una base de datos de sólo lectura sobre cualquier consulta que se emita. Por lo tanto, puede emitir una declaración SELECT contra una instantánea de base de datos y usarla al igual que cualquier otra base de datos.

En el momento de la creación, una instantánea de base de datos no contiene ningún dato. En el instante que se crea una instantánea de base de datos; puede emitir comandos SELECT contra la instantánea de base de datos. SQL Servidor utiliza la base de datos de origen para recuperar los datos que no han cambiado desde que creó la instantáneas.

Tecnología Copy-on-Write (copiar al escribir)

Dado que una instantánea tiene que retener el estado de los datos en la base de datos de origen hasta el momento que la instantánea de base de datos fue creada, SQL Server necesita un mecanismo para administrar cualquier cambio que se producen dentro de la base de datos de origen. El mecanismo que SQL Server utiliza se conoce como Copy-on-Write.

www.detodoprogramacion.com

Page 237: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 15 instantáneas de bases de datos 221

Recuerde que los datos dentro de SQL Server se almacenan en páginas, hay ocho páginas en una extensión, y SQL Server lee y escribe extensiones. La primera vez que se produce una modificación dentro de una página de datos, SQL Server copia la imagen anterior de la página a la instantánea de base de datos. Cuando son emitidas declaraciones SELECT contra la instantánea de base de datos, SQL Server recupera datos desde la instantánea para cualquier dato que ha cambiado, mientras aun extrae datos desde la base origen, para cualquier extensión que no ha cambiado.

Al escribir la imagen anterior de la extensión la primera vez que se realiza un cambio, SQL Server permite que los cambios se produzcan contra la base de datos origen, al tiempo que garantiza que cualquier consulta contra la instantánea no refleje ninguno de los cambios después que la instantánea fue creada.

Una vez que el cambio inicial ha sido realizado a una página dentro de una extensión y SQL Server escribe la extensión en la instantánea, los cambios posteriores en la extensión son ignorados por la característica Copy-on-Write.

Dado que usted puede crear varias instantáneas de bases de datos contra una base de datos de origen, la imagen anterior de una extensión se escribe para cada instantánea que aun no haya recibido una copia de la extensión.

Consejo Dado que SQL Server mantiene la instantánea de base de datos al punto del tiempo que la base de datos Instantánea fue creada, el tamaño máximo de la instantánea de la base es la cantidad de datos que existió en la base de datos origen en el momento de creación.

En el siguiente ejercicio, se crea una instantánea de base de datos contra la base de datos SQL2008SBS para permitirle ejecutar consultas en una base de datos donde los datos no cambiarán.

Crear una instantánea de base de datos

1. Ejecutar el siguiente código (el código está en el archivo Capítulo15\ code1.sql):

CREATE DATABASE SQL2008SBSSnap ON ( NAME = N'SQL2008SBS', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS.ds'), ( NAME = N'SQL2008SBSFG1_Dat1', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_1.ds'), ( NAME = N'SQL2008SBSFG1_Dat2', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_2.ds'), ( NAME = N'SQL2008SBSFG1_Dat3', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_3.ds'), ( NAME = N'FG2_dat', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_4.ds'), ( NAME = N'FG3_dat', FILENAME = N'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBS_5.ds') AS SNAPSHOT OF SQL2008SBS GO

www.detodoprogramacion.com

Page 238: Microsoft SQL Server 2008 Español - Mike Hotek

222 Parte IV diseño de objetos de bases de datos avanzadas

2. Ejecutar el siguiente código para comparar las estructuras de la base de datos de origen y la instantánea de base de datos (el código está en el archivo Capítulo15\ code2.sql):

SELECT * FROM SQL2008SBS.sys.database_files SELECT * FROM SQL2008SBSSnap.sys.database_files SELECT * FROM master.sys.databases GO

3. Expanda el nodo “Base de datos de instantáneas” en el Explorador de objetos para ver la Instantánea de base de datos que acaba de crear.

4. Ejecute una declaración SELECT contra la instantánea de base de datos y compare los resultados con la base de datos SQL2008SBS.

5. Realice un cambio en los datos y compare los resultados entre la instantánea de base de datos y la base de datos SQL2008SBS.

Revertir datos utilizando una instantánea de base de datos

Dado que una instantánea de base contiene todos los datos en la base de datos origen en el momento de la creación de la instantánea, puede utilizar la instantánea de base de datos para devolver datos en la base de datos de origen al estado contenido en la instantánea de base de datos. En casos extremos, puede utilizar la instantánea de la base para devolver todo el contenido de la base de datos origen al estado de la instantánea. Por ejemplo, si usted necesita descartar todos los cambios que ocurrieron dentro de la base de datos desde que la instantánea de base de datos fue creada.

“Revertir datos” es una categoría especial de restauración de datos que se puede realizar cuando se tiene una instantánea de base de datos creada.

Si necesita revertir sólo una fila o una parte de una base de datos, puede utilizar una instrucción INSERT, UPDATE, DELETE o MERGE junto con un SELECT como aprendió en el capítulo 10, "Manipulación de datos". SQL Server también le permitirá revertir la base de datos completa con la instantánea de base de datos, si es necesario. Cuando usted utiliza la instantánea para revertir la base de datos entera, la base de origen se remonta a exactamente el mismo aspecto que tenía la instantánea al momento que fue creada. Cualquier transacción que se había emitido posteriormente contra la base de datos origen, se perderá.

Más información Usted aprenderá más sobre la restauración de los datos en el Capítulo 20, "Recuperación de datos".

La sintaxis para revertir una base de datos a partir de una instantánea de base de datos es:

RESTORE DATABASE <database_name> FROM DATABASE_SNAPSHOT = <database_snapshot_name>

www.detodoprogramacion.com

Page 239: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 15 instantáneas de bases de datos 223

Cuando revierte una base de datos origen existen varias restricciones:

 

 

Solamente una instantánea de base de datos única, puede existir para la base de datos de origen.

Los catálogos de texto-completo sobre la base de datos de origen se deben quitar y re-crear después

que se completa el proceso “revert”.

Puesto que el registro de transacciones es reconstruido, la cadena de registros se rompe.

Tanto la base de datos de origen como la instantánea, estarán fuera de línea durante la operación de revertir.

La base de datos de origen no puede contener datos FIELSTREAM.

 

 

 

Dado que la base de datos SQL2008SBS contiene un grupo de archivos FILESTREAM junto con una tabla que tiene la propiedad FILESTREAM, no es posible revertir la base de datos completa.

Capítulo 15 Referencia Rápida

Para

Crear una copia de base de datos de sólo lectura y en un punto en el tiempo.

Revertir una parte de una base de datos

Revertir la base de datos origen completa

Haga lo siguiente

Ejecutar una declaración CREATE DATABASE. . .AS SNAPSHOT OF

Utilice una declaración INSERT, UPDATE, DELETE, o MERGE junto con una instrucción SELECT desde la instantánea

Ejecutar RESTORE DATABASE <database name> FROM DATABASE_SNAPSHOT = <database snapshot name>

www.detodoprogramacion.com

Page 240: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16

Service Broker

Después de completar este capítulo, usted será capaz de

¦ Crear aplicaciones de Service Broker

¦ Crear servicios

¦ Crear colas

¦ Crear conversaciones

¦ Crear tipos de mensaje

¦ Procesar los mensajes en una cola

Introducido en SQL Server 2005, Service Broker ofrece un sistema de colas de mensajes asíncronos

para la plataforma de SQL Server que le permite construir soluciones multi-plataforma, flexibles y escalables.

La mayoría de las aplicaciones utilizan un proceso síncrono mediante el cual se envía una solicitud a

SQL Server, la aplicación espera una respuesta, y entonces el usuario de la aplicación puede continuar

con el siguiente paso en su proceso. Muchas aplicaciones modernas se basan en arquitecturas que

requieren solicitudes para abarcar múltiples plataformas. Con las solicitudes sincrónicas, una simple

plataforma en la mitad del proceso puede causar la falla completa de la solicitud de un usuario.

Procesamiento Multi-plataforma Hace varios años, yo estaba trabajando con una empresa de e-commerce con más de $ 20 mil

millones en ventas anuales. Cuando un cliente colocaba un pedido, el inventario tenía que ser

verificado y validado para conocer la disponibilidad, los precios tenían que ser ajustados debido a

la extrema volatilidad de los precios de los productos que se vendían, una solicitud para bloquear

el inventario era enviada al proveedor, y luego se hacía una llamada a su sistema comercial para

procesar la tarjeta de crédito.

Teniendo un único sistema disponible significa que otro cliente no podría realizar un pedido. Por

desgracia, con más de 100 proveedores de productos diferentes y con un sistema de

procesamiento de tarjetas de crédito, los cortes eran muy frecuentes. Junto con un gran número

de competidores, incluso los pequeños cortes significan una pérdida de clientes, pedidos, y

grandes cantidades de ingresos. Una de las causas más frecuentes de interrupciones de

aplicación era la falta de disponibilidad de un procesador del comerciante.

225

www.detodoprogramacion.com

Page 241: Microsoft SQL Server 2008 Español - Mike Hotek

226 Parte IV Diseño avanzado de objetos de bases de datos

Hemos rediseñado el proceso de negocio y el flujo de la aplicación para que nos permita procesar transacciones de tarjetas de crédito sincrónicamente cuando el procesador del comerciante estaba disponible mientras que también proporciona la capacidad de impulsar la solicitud a una cola de Service Broker si el procesador no estaba disponible. Con el lanzamiento de Service Broker, la empresa ya no pierde más clientes o ventas cuando el procesador del comerciante está sin conexión. Services Broker seguiría en contacto con el procesador del comerciante al tiempo que garantiza que el cliente pueda completar la orden y la tarjeta de crédito de una sola vez.

Arquitectura de Service Broker

Service Broker se basa en un núcleo de infraestructura de mensajería. Aunque la mensajería tiene similitudes con las transacciones que hemos discutido anteriormente, existen varias diferencias que tenemos que cubrir.

Mensajería – Visión general

Las aplicaciones de Service Broker envían, reciben y procesan mensajes. Dado que los sistemas de bases de datos envían, reciben y procesan transacciones, la primer exposición que muchos tienen con Service Broker es conocerla con confusión. Después de todo, la única interacción que la mayoría de las personas tiene con los mensajes es cuando abren un sistema de e-mail.

Si se toma el ejemplo básico de un sistema de e-mail, cada mensaje que envía o recibe contiene información sobre la que usted debe actuar. En otras palabras, un mensaje no es más que información procesable. Similarmente, una declaración INSERT, UPDATE, DELETE, MERGE o SELECT es una información procesable.

Cada sistema informático funciona basado en mensajes. Los usuarios introducen información en una aplicación. La aplicación se codifica para procesar la información introducida. Una vez procesada, los resultados del procesamiento se envían de nuevo al usuario que puede elegir tomar acciones adicionales. Cada uno de estos pasos es un mensaje que se envía desde un elemento a otro elemento.

El hecho de simplemente enviar un mensaje no tiene sentido fuera de contexto. ¿Está el ProductID y Quantity siendo enviado por un usuario de una solicitud para realizar un pedido, comprobar el inventario, verificar el estado del envío, etc? Si el mensaje fue transmitido en una red, no entenderíamos lo que querría decir el mensaje enviado por nuestro cliente. Sin embargo, no enviamos aleatoriamente mensajes a través de una red. En su lugar, cada mensaje está destinado a una aplicación específica. Basándose en el código que un desarrollador ha escrito, una aplicación aceptará mensajes en un formato específico y aplica un código específico que está diseñado para interpretar el mensaje.

Un mensaje sin una aplicación destino no tiene sentido. Una aplicación sin la capacidad de recibir mensajes, es igualmente sin sentido. Sólo cuando enviamos mensajes a una aplicación de una manera definida es que el sistema llega a ser valioso.

www.detodoprogramacion.com

Page 242: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker 227

Service Broker proporciona la infraestructura para definir mensajes, enrutarlos a la aplicación apropiada, y aplicar código al mensaje para producir un sistema viable.

Componentes de Service Broker

Los componentes de Service Broker que discutiremos durante el resto del capítulo se muestran en la Figura 16-1.

Tipo de Mensaje

Tipo de Mensaje

Tipo de Mensaje

Tipo de Mensaje

Tipo de Mensaje

Contrato Contrato Contrato

Servicio Servicio Servicio Servicio

Cola

FIGURA 16-1 Componentes de Service Broker

Cola

Las comunicaciones dentro de una aplicación se producen entre un origen y un destino, y son denominados como puntos finales (endpoints). Dentro de una aplicación de Service Broker, un punto final de la comunicación es una base de datos. Por lo tanto, Service Broker envía y recibe mensajes entre las bases de datos. El endpoint que inició la comunicación se conoce como el iniciador (iniciator). El extremo receptor se llama objetivo (target). Al igual que en una comunicación entre dos seres humanos, una vez que la comunicación se inicia, los mensajes pueden fluir en ambas direcciones. El que inicia y el objetivo pueden estar en bases de datos diferentes en la misma instancia, bases de datos en diferentes instancias, o ser ambos la misma base de datos.

El papel de Service Broker es gestionar el flujo de comunicación entre el iniciador y el destino. Pueden haber dos tipos de comunicación dentro de una aplicación de Service Broker:

  Monólogo Es una conversación de un solo sentido que se produce a partir de un iniciador a uno o más objetivos. Los monólogos no son soportados actualmente en SQL Server.

Diálogo Dos vías de conversación que ocurren entre dos puntos finales.  

Si usted siempre tuviera los recursos disponibles, la capacidad suficiente para procesar todos los mensajes tan pronto vayan llegando, y nunca fallara la comunicación, todo lo que necesitaría sería un diálogo gestionado por Service Broker. Puesto que la comunicación puede fallar y no siempre tendrá suficientes recursos o capacidad, Service Broker necesita un mecanismo para almacenar los mensajes a medida que llegan

www.detodoprogramacion.com

Page 243: Microsoft SQL Server 2008 Español - Mike Hotek

228 Parte IV Diseño avanzado de objetos de bases de datos

con el fin de garantizar que los recursos de las aplicaciones no estén atados a la espera de que un mensaje sea procesado.

La unidad de almacenamiento de Service Broker es una cola, que se implementa en SQL Server como una tabla. Una característica interna de SQL Server que no está disponible para que usted cree, es una estructura denominada tabla oculta (hidden table). Una tabla oculta, como su nombre indica, es una tabla en SQL Server con la que se puede interactuar, pero no puede verla o accederla directamente.

Las colas trabajan con la metodología “primero en entrar, primero en salir”, First In, First Out (FIFO). Los nuevos mensajes se añaden a la parte inferior de la cola. Los servicios de Service Broker extraen mensajes de la parte superior de la cola. Una vez que un mensaje es recuperado y procesado, se elimina de la cola.

El objeto que se usa para procesar los mensajes se denomina servicio (service). Los servicios proporcionan una capa de abstracción para aislar las aplicaciones del almacenamiento físico, la recuperación y la gestión de mensajes. Los servicios también proveen una restricción en la comunicación. Un servicio sólo retirará y procesará

los mensajes que son definidos por los tipos de mensajes que son válidos para un contrato que es adjuntado

al servicio.

Un contrato puede tener uno o más tipos de mensajes asociados. Un contrato puede estar asociado a

uno o más servicios. Una cola puede estar asociado a uno o más servicios. Un servicio no puede estar asociado a más de una cola.

Interacción de la Aplicación

La infraestructura proporcionada por Service Broker es bastante inútil a menos que las aplicaciones tengan un medio para colocar los mensajes en una cola para su procesamiento. Afortunadamente, las aplicaciones necesitan cambios muy pequeños para interactuar con una infraestructura de Service Broker. En lugar de insertar los datos en una tabla, las aplicaciones simplemente dejan mensajes en una cola para su procesamiento posterior. La aplicación inicia una conversación, envía un mensaje a un servicio, y luego se cierra la comunicación. El servicio se encarga de empujar el mensaje a la cola a la que el servicio está ligado.

En este ejercicio, habilitará la base de datos SQL2008SBS para Service Broker. Esto lo habilitará para crear una infraestructura que le permita a los socios comerciales de nuestra empresa utilizar un servicio web a través de un extremo HTTP. Va a crear la infraestructura necesaria para enviar los pedidos de procesamiento en el capítulo 18, "Seguridad".

Habilitar Service Broker

1. En una nueva ventana de consulta, ejecute el siguiente código (el código puede encontrarse en el archivo Capítulo 16\ code1.sql):

ALTER DATABASE SQL2008SBS SET ENABLE_BROKER GO USE SQL2008SBS GO

www.detodoprogramacion.com

Page 244: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<InsertStrongPasswordHere>' GO

229

Tipos de mensajes y Contratos

Una comunicación eficaz implica el intercambio de información en un formato que es entendido por ambas partes. Si una de las partes está hablando en alemán y la otra parte entiende sólo tagalo, la comunicación no tendrá éxito. Sin embargo, si ambas partes entienden alemán, la comunicación puede continuar.

Los tipos de mensaje definen un formato acordado para el contenido intercambiado entre dos puntos finales. Los contratos controlan los tipos de mensaje que se aceptan con el fin de normalizar la entrada y salida necesaria para una comunicación fiable.

Tipos de mensajes

La sintaxis genérica para crear un tipo de mensaje es:

CREATE MESSAGE TYPE message_type_name [ AUTHORIZATION owner_name ] [ VALIDATION = { NONE

| EMPTY | WELL_FORMED_XML | VALID_XML WITH SCHEMA COLLECTION

schema_collection_name} ]

El nombre del tipo de mensaje debe satisfacer los requisitos para un identificador. Aunque los ejemplos de este capítulo limitarán nuestra aplicación de Service Broker a una sola base de datos, es muy común tener una aplicación service broker ocupando bases de datos así como instancias. Dado que la aplicación más común para expandir Service Broker son instancias de SQL Server, la mayoría de los nombres se construyen usando URLs que son únicas dentro de una organización.

La cláusula VALIDATION es la información primaria dentro de una definición de tipo de mensaje que define si, o cómo los mensajes son validados. Aunque todos los mensajes de Service Broker son almacenados en un tipo de dato VARBINARY (MAX), el contenido específico de un mensaje puede ser cualquier cosa que elija especificar. Los tipos de validación se enumeran en la Tabla 16-1:

TABLA 16-1 Opciones de validación de tipo de Mensaje

Descripción

El cuerpo del mensaje puede contener cualquier dato, en cualquier

El cuerpo del mensaje no contendrá datos.

El cuerpo del mensaje debe contener un documento XML “bien formado”.

El cuerpo del mensaje contiene un documento XML bien formado que obedece a

al menos un esquema XML dentro de una colección de esquemas definidos.

Opción de Validación

NONE

EMPTY

WELL_FORMED_XML

VALID_XML WITH SCHEMA COLLECTION

www.detodoprogramacion.com

Page 245: Microsoft SQL Server 2008 Español - Mike Hotek

Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y más … Gratis para el Conocimiento...!

www.detodoprogramas.com

Visítanos y compruébalo

Material para los amantes de la Programación Java, C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos,

CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas…

www.detodoprogramacion.com

Visitanos

Libros Universitarios, Contabilidad, Matemáticas, obras literarias, Administración, ingeniería y mas…

Page 246: Microsoft SQL Server 2008 Español - Mike Hotek

230 Parte IV Diseño avanzado de objetos de bases de datos

Dado que nuestra aplicación estará aceptando pedidos realizados por nuestros socios comerciales a través de un servicio web (Web Service), en la práctica siguiente creará la colección de esquemas para validar Documentos XML entrantes junto con el tipo de mensaje para hacer cumplir las comunicaciones.

Crear un tipo de mensaje

1. Ejecute el siguiente código para crear la colección de esquemas XML que se va a utilizar para aplicar el formato de las órdenes enviadas (el código puede encontrarse en el archivo Capítulo 16\code2.sql):

CREATE XML SCHEMA COLLECTION COMO PartnerOrders

'<Xsd: schema targetNamespace = "urn: schemas-microsoft-com: sql: SqlRowSet2" xmlns: schema = "urn: schemas-microsoft-com: sql: SqlRowSet2" xmlns: xsd = "http://www.w3.org/2001/XMLSchema" xmlns: SqlTypes = "http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault = "qualified">

CREATE XML SCHEMA COLLECTION PartnerOrders AS '<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified"> <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" /> <xsd:element name="Customer">

<xsd:complexType> <xsd:sequence>

<xsd:element name="CompanyName"> <xsd:simpleType>

<xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">

<xsd:maxLength value="50" /> </xsd:restriction>

</xsd:simpleType> </xsd:element> <xsd:element ref="schema:OrderLine" minOccurs="0" maxOccurs="unbounded" />

</xsd:sequence> </xsd:complexType>

</xsd:element> <xsd:element name="OrderLine"> <xsd:complexType>

<xsd:sequence> <xsd:element name="SKU" minOccurs="0">

<xsd:simpleType> <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033"

sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52"> <xsd:maxLength value="10" />

</xsd:restriction> </xsd:simpleType>

</xsd:element> <xsd:element name="Quantity" type="sqltypes:smallint" />

</xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema>' GO

www.detodoprogramacion.com

Page 247: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker 231

2. Ejecute el siguiente código para crear la colección de esquemas XML que se utilizará para iniciar órdenes aceptadas (el código se puede encontrar en el archivo Capítulo16\code2.sql):

CREATE XML SCHEMA COLLECTION AcceptedOrders AS '<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">

<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes .xsd" />

<xsd:element name="Customer"> <xsd:complexType>

<xsd:sequence> <xsd:element name="CompanyName" minOccurs="0"> <xsd:simpleType>

<xsd:restriction base="sqltypes:varchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">

<xsd:maxLength value="50" /> </xsd:restriction>

</xsd:simpleType> </xsd:element> <xsd:element ref="schema:OrderTotal" minOccurs="0" maxOccurs="unbounded"

/> </xsd:sequence>

</xsd:complexType> </xsd:element> <xsd:element name="OrderTotal">

<xsd:complexType> <xsd:sequence>

<xsd:element name="OrderID" type="sqltypes:int" /> <xsd:element name="OrderDate" type="sqltypes:date" /> <xsd:element name="SubTotal" type="sqltypes:money" /> <xsd:element name="ShippingAmount" type="sqltypes:money" /> <xsd:element name="TaxAmount" type="sqltypes:money" /> <xsd:element name="GrandTotal" type="sqltypes:money" minOccurs="0" />

</xsd:sequence> </xsd:complexType>

</xsd:element> </xsd:schema>' GO SELECT * FROM sys.xml_schema_collections GO

3. Ejecute el siguiente código para crear el tipo de mensaje de envío del pedido (el código seencuentra en el archivo Capítulo16\code3.sql):

CREATE MESSAGE TYPE [//SQL2008SBS/Partner/PartnerOrderSubmit] VALIDATION = VALID_XML WITH SCHEMA COLLECTION PartnerOrders GO

www.detodoprogramacion.com

Page 248: Microsoft SQL Server 2008 Español - Mike Hotek

232 Parte IV Diseño avanzado de objetos de bases de datos

4. Ejecute el siguiente código para crear el tipo de mensajes de “orden aceptada” (el código seencuentra en el archivo Capítulo16\code3.sql):

CREATE MESSAGE TYPE [//SQL2008SBS/Partner/AcceptedOrders] VALIDATION = VALID_XML WITH SCHEMA COLLECTION AcceptedOrders GO

5. Expanda el nodo “Tipos de mensajes” bajo Service Broker o ejecute el siguiente código para ver los dos tipos de mensaje que acaba de crear (el código se encuentra en el archivo Capítulo 16\ code3.sql):

SELECT * FROM sys.service_message_types SELECT * FROM sys.message_type_xml_schema_collection_usages GO

Contratos

Al igual que un contrato legal une la conducta de dos partes, un contrato de Service Broker especifica los tipos de mensajes aceptables que se intercambiarán por un servicio. La sintaxis genérica para la creación de un contrato es el siguiente:

CREATE CONTRACT contract_name [ AUTHORIZATION owner_name ]

( { { message_type_name | [ DEFAULT ] } SENT BY { INITIATOR | TARGET | ANY }

} [ ,...n] )

El cuerpo de un contrato especifica los tipos de mensajes permitidos, así como el “punto final” (endpoint) de la conversación que se permite usar en un tipo de mensaje dado. Cuando se especifica INITIATOR, sólo el iniciador de la conversación puede utilizar un tipo de mensaje dado. Cuando se especifica TARGET, sólo el destino de la conversación puede utilizar un tipo de mensaje especificado. Cuando se especifica ANY, tanto el INITIATOR como el TARGET puede utilizar el tipo de mensaje.

Para que una conversación se produzca, debe haber por lo menos dos partes. Así como en una conversación de humanos, las conversaciones de Service Broker requieren al menos un tipo de mensaje que se especifique

para el INITIATOR y el TARGET..

Ahora que hemos creado nuestros tipos de mensajes, se necesita crear un contrato con el fin de manejar el procesamiento de las órdenes de entrada y la respuesta que se envía de vuelta el cliente. En este ejercicio, creará el contrato para nuestra aplicación de Service Broker.

Creación de un contrato

1. Ejecute el siguiente código para crear el contrato necesario para gestionar los pedidos asociados (el código se pueden encontrar en el archivo Capítulo16\code4.sql):

CREATE CONTRACT [//SQL2008SBS/Partner/SubmitOrder] ([//SQL2008SBS/Partner/PartnerOrderSubmit]

SENT BY ANY, [//SQL2008SBS/Partner/AcceptedOrders]

SENT BY TARGET) GO

www.detodoprogramacion.com

Page 249: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker 233

Nota La aplicación de Service Broker que estamos construyendo supone que sólo los clientes existentes pueden hacer sus pedidos y que los productos seleccionados para el pedido enviado son válidos. Para construir una verdadera aplicación robusta de Service Broker, se deja que usted agregue el manejo de rutinas para cuando un socio envía una orden, o una línea de ítem de una orden inválida.

Colas y Servicios

Las aplicaciones de Service Broker necesitan almacenar mensajes para su procesamiento, así como la persistencia en caso de interrupciones. Los mensajes se almacenan en una cola antes de ser procesados. Los servicios son definidos para una cola y fuerzan que las conversaciones sean posibles.

Colas

Service Broker está diseñado para el procesamiento asincrónico confiable. Una vez que un mensaje es presentado, una aplicación puede continuar con otra tarea. El procesamiento se produce en un momento posterior, a través de un proceso diferente. Con el fin de ser fiable, la información tiene que ser almacenada en algún lugar mientras espera a ser procesada. Aunque usted podría almacenar el mensaje en la memoria, cualquier interrupción en el servidor haría que el mensaje se pierda.

Service Broker almacena los mensajes a ser procesados en una cola, que se implementa como una tabla oculta en SQL Server. La tabla detrás de una cola proporciona el almacenamiento persistente necesario para los mensajes, pero no se puede acceder directamente utilizando declaraciones INSERT, UPDATE, DELETE, o MERGE. Dado que el almacenamiento de datos para una cola es una tabla dentro de una base de datos de SQL Server, también puede proporcionar redundancia y tolerancia a fallos mediante el uso de copia de seguridad/restauración, espejado de base de datos y la conmutación por error (failover clustering).

La sintaxis genérica para la creación de una cola es:

CREATE QUEUE <object> [ WITH

[ STATUS = { ON | OFF } [ , ] ] [ RETENTION = { ON | OFF } [ , ] ] [ ACTIVATION (

[ STATUS = { ON | OFF } , ] PROCEDURE_NAME = <procedure> , MAX_QUEUE_READERS = max_readers , EXECUTE AS { SELF | 'user_name' | OWNER }

) ]] [ ON { filegroup | [ DEFAULT ] } ]

La cláusula de estado le permite convertir una cola ON u OFF. Cuando una cola es OFF, los mensajes no pueden ser colocados o eliminados de la cola.

Normalmente los mensajes se eliminan de una cola tan pronto como son enviados o recibidos por un extremo de conversación. Sin embargo, cuando la retención está activada, todos los mensajes son retenidos en la cola hasta que finalice la conversación completa.

www.detodoprogramacion.com

Page 250: Microsoft SQL Server 2008 Español - Mike Hotek

234 Parte IV Diseño avanzado de objetos de bases de datos

Dado que el almacenamiento de una cola es en última instancia una tabla dentro de la base de datos, la cláusula ON permite especificar el grupo de archivos.

En este ejercicio, creará la cola de procesamiento de pedidos que será utilizada por nuestra aplicación de Service Broker.

Crear una cola

1. Ejecute el siguiente código para crear la cola de envío de pedido (el código se encuentra en el archivo Capítulo 16\code5.sql):

CREATE QUEUE OrderSubmitQueue WITH STATUS = ON, RETENTION = OFF GO

2. Ejecute el siguiente código para crear la cola de confirmación de pedido (el código se encuentra en el archivo Capítulo16\code5.sql):

CREATE QUEUE OrderAcknowledgeQueue WITH STATUS = ON, RETENTION = OFF GO

Servicios

Los servicios son el componente de procesamiento utilizado en una aplicación de Service Broker. Un servicio define los tipos de conversaciones que están permitidos para una cola junto con los contratos que serán obedecidos.

La sintaxis genérica de un servicio es:

CREATE SERVICE service_name [ AUTHORIZATION owner_name ] ON QUEUE [ schema_name. ]queue_name [ ( contract_name | [DEFAULT] [ ,...n ] ) ]

Dado que el único propósito de un servicio es vincular los contratos y las colas, es posible que se pregunte por qué es necesario un servicio dentro de la arquitectura de Service Broker. Las aplicaciones de Service Broker se han diseñado para ser escalables y tolerante a fallos. Usted puede tener una sola cola que es atendida desde varias máquinas con el fin de ampliar la capacidad de procesamiento. De hecho, el único límite sobre el número de máquinas manejando el procesamiento en una sola cola es el número de conexiones permitidas para una instancia de SQL Server. Además, es posible mover una cola entera a otra máquina en el caso de un fallo. Mediante la introducción de un servicio entre un contacto y una cola, puede agregar fácilmente capacidad adicional de procesamiento, mientras que al mismo tiempo redirige el procesamiento en el caso de una conmutación por error.

En este ejercicio, creará el servicio que es necesario para configurar las conversaciones requeridas para procesar los pedidos entrantes de los socios comerciales.

www.detodoprogramacion.com

Page 251: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker 235

Creación de un servicio

1. Ejecute el siguiente código para crear el servicio de envío del pedido (el código se encuentraen el archivo Capítulo16\code6.sql):

CREATE SERVICE [//SQL2008SBS/Partner/SubmitOrderService] ON QUEUE OrderSubmitQueue ([//SQL2008SBS/Partner/SubmitOrder]) GO

2. Ejecute el siguiente código para crear el servicio de confirmación de pedido (el código serencuentra en el archivo Capítulo16\code6.sql):

CREATE SERVICE [//SQL2008SBS/Partner/OrderAcknowledgeService] ON QUEUE OrderAcknowledgeQueue ([//SQL2008SBS/Partner/SubmitOrder]) GO

Conversaciones

Las conversaciones son el mecanismo que permite el procesamiento ordenado de mensajes confiable a través de transacciones e incluso reiniciar el servidor. Uno de los requerimiento más difíciles para las colas de mensaje, es satisfacer las necesidades de procesamiento de pedidos.

Por ejemplo, un sistema de entrada de pedidos podría colocar un mensaje en una cola para el encabezado de la orden seguido por varios mensajes que contienen cada uno un elemento de línea de la orden. La aplicación Service Broker tiene que asegurarse de que el mensaje de cabecera de la orden se procesa antes que cualquiera de los ítems de la orden. Aunque el grupo de mensajes que componen un solo pedido debe ser procesado en orden, cada pedido realizado en la cola puede ser procesado en paralelo.

Para asegurarse de que los mensajes se procesan en orden, Service Broker asigna un número de secuencia que es persistente en la cola. Esto asegura que se conserva una secuencia incluso a través de un reinicio del servidor. Además, Service Broker tiene un mecanismo incorporado para re-intentar en los casos de mensajes que no han logrado llegar a un extremo de la conversación.

Para gestionar el proceso de mensajería, la comunicación está envuelta en una conversación que especifica los servicios en cada punto final junto con el contrato que se utiliza para la comunicación. La sintaxis genérica para una conversación es:

BEGIN DIALOG [ CONVERSATION ] @dialog_handle FROM SERVICE initiator_service_name TO SERVICE 'target_service_name'

[ , { 'service_broker_guid' | 'CURRENT DATABASE' } ] [ ON CONTRACT contract_name ] [ WITH [ { RELATED_CONVERSATION = related_conversation_handle

| RELATED_CONVERSATION_GROUP = related_conversation_group_id } ] [ [ , ] LIFETIME = dialog_lifetime ] [ [ , ] ENCRYPTION = { ON | OFF } ] ]

www.detodoprogramacion.com

Page 252: Microsoft SQL Server 2008 Español - Mike Hotek

236 Parte IV Diseño avanzado de objetos de bases de datos

Nota Cuando especifica el target_service_name en la cláusula TO SERVICE, no incluya los caracteres de escape “[“ y “]” con el nombre del servicio.

El diálogo de gestión que se devuelve con un tipo de datos de uniqueidentifier se utiliza para identificar el diálogo utilizado, así como el etiquetado de cada mensaje enviado dentro del diálogo. El diálogo de gestión (dialog handle) es el mecanismo de secuenciación utilizado para separar grupos o mensajes relacionados.

Las opciones RELATED_CONVERSATION o RELATED_CONVERSATION_GROUP se utilizan para enlazar múltiples conversaciones entre sí para formar un proceso. Por ejemplo, un proceso de orden de entrada podría tener que comprobar y reservar inventario, validar los límites del pedido de un cliente, comprobar que no existen facturas pendientes, y procesar una tarjeta de crédito. Cada paso en el proceso de pedidos de entrada puede ser lanzado en paralelo dentro de Service Broker, con cada conversación unida de tal manera que todo el proceso se confirme o se deshaga como una sola unidad, aun cuando abarca múltiples plataformas.

La opción LIFETIME especifica el tiempo máximo que se le permite existir a un DIALOG. Si el DIALOG no se termina explícitamente tanto en el destino como en el iniciador antes de que expire la vigencia de la conversación, el diálogo se cierra por la fuerza y cualquier procesamiento de apertura se revierte.

La opción ENCRYPTION especifica si los mensajes entre el iniciador y el destino se cifran.

Nota Los mensajes que están confinados dentro de una única instancia no están cifrados, incluso si ENCRYPTION se establece en ON.

Enviar y recibir mensajes

Ahora que usted ha construido la infraestructura necesaria para nuestra aplicación de Service Broker, necesita tener una manera de realizar el trabajo. En una aplicación de Service Broker, todo el trabajo a realizar se coloca en las colas que se han definido. El procesamiento de los mensajes se logra mediante el uso de SEND y RECEIVE. SEND se utiliza para colocar los mensajes en una cola. RECEIVE se utiliza para tomar los mensajes de una cola para que los mensajes se puedan procesar.

Envío de mensajes

En un sistema OLTP, usted envía trabajos a realizar mediante la emisión de una sentencia DML (INSERT, UPDATE, DELETE, MERGE, o SELECT). Dado que el procesamiento de las solicitudes de DML es un proceso sincrónico, una sola instrucción es suficiente para enviar el trabajo, tener el trabajo procesado y recibir una respuesta. Las aplicaciones de Service Broker requieren una secuencia de dos partes ya que todo el trabajo se procesa de una manera asincrónica.

www.detodoprogramacion.com

Page 253: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker 237

El primer paso en el proceso es colocar mensajes en la cola para su posterior procesamiento. La sintaxis genérica para el envío de mensajes a una cola es:

SEND ON CONVERSATION conversation_handle [ MESSAGE TYPE message_type_name ] [ ( message_body_expression ) ]

Antes de poder enviar mensajes, es necesario crear una conversación. Cada SEND especificará la gestión de la conversación que ha sido abierta con el fin de colocar el mensaje en la cola correcta. El parámetro MESSAGE TYPE le permite designar el tipo de mensaje. La información que desea procesar se encuentra dentro del cuerpo del mensaje y se debe ajustar a la definición del MESSAGE TYPE especificado.

Se puede recuperar el contenido de una cola mediante la emisión de una declaración SELECT de la siguiente manera:

SELECT <column list> FROM <queue name>

Nota La lista de columnas de una cola se puede encontrar en el artículo titulado "CREATE QUEUE." En los libros en pantalla.

Recepción de mensajes

Una vez que los mensajes han sido colocados en una cola, se emitirá un comando RECEIVE para recuperar mensajes para procesar. La sintaxis genérica para un RECEIVE es:

RECEIVE [ TOP ( n ) ] <column_specifier> [ ,...n ] FROM <queue> [ INTO table_variable ] [ WHERE { conversation_handle = conversation_handle

| conversation_group_id = conversation_group_id } ]

Un comando RECEIVE sacará un mensaje de una cola que se devuelve como un conjunto de resultados que se le pueden pasar a una aplicación de llamada para su procesamiento. Aunque es posible trabajar directamente con el conjunto de resultados, es más común recuperar el conjunto de resultados en una variable de tabla que a continuación es procesada.

Si no se especifica el número de mensajes mediante la cláusula TOP (n), una recepción única sacará todos los mensajes de una cola. Además, siempre que la RETENTION no esté habilitada para una cola, el RECEIVE elimina los mensajes de la cola. La emisión de un RECEIVE sin especificar un manejador de conversación, extraerá mensajes independientemente de la conversación que colocó originalmente el mensaje en la cola. Puede restringir los mensajes extraídos de la cola, especificando una conversación o el manejo de un grupo de conversación.

www.detodoprogramacion.com

Page 254: Microsoft SQL Server 2008 Español - Mike Hotek

238 Parte IV Diseño avanzado de objetos de bases de datos

En el siguiente ejercicio, creará el cuadro de diálogo que nos permite enviar órdenes a nuestro procesamiento de cola. La conversación será utilizada por la infraestructura de Service Broker para asegurar que podamos procesar los pedidos de los socios comerciales antes de configurar el extremo HTTP en el Capítulo 18 que permitirá a las órdenes ser enviadas.

Procesar mensajes

1. Ejecute el siguiente código para iniciar una nueva conversación (el código se puede encontrar en el archivo Capítulo 16\code7.sql):

DECLARE @dialog_handle UNIQUEIDENTIFIER BEGIN TRANSACTION BEGIN DIALOG CONVERSATION @dialog_handle FROM SERVICE [//SQL2008SBS/Partner/OrderAcknowledgeService] TO SERVICE '//SQL2008SBS/Partner/SubmitOrderService' ON CONTRACT [//SQL2008SBS/Partner/SubmitOrder]; SELECT @dialog_handle

2. Usando el gestor de diálogo creado en el paso 1, ejecute el siguiente código para enviar una nueva orden a la cola (el código puede encontrarse en el archivo Capítulo16\code7.sql):

SEND ON CONVERSATION @dialog_handle MESSAGE TYPE [//SQL2008SBS/Partner/PartnerOrderSubmit] (N'<Customer xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2">

<CompanyName>Wide World Importers</CompanyName> <OrderLine>

<SKU>1-2RB1-2RO</SKU> <Quantity>10</Quantity>

</OrderLine> <OrderLine>

<SKU>1-4RB1-2RO</SKU> <Quantity>10</Quantity>

</OrderLine> </Customer>') COMMIT TRANSACTION

3. Ejecute el siguiente código para crear el procedimiento almacenado que va a procesar nuestras órdenes (El código se puede encontrar en el archivo Capítulo16\code8.sql):

--Create invalid order table CREATE TABLE Orders.InvalidOrders (PartnerOrder XML NOT NULL) GO

www.detodoprogramacion.com

Page 255: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker

CREATE PROCEDURE asp_processpartnerorders @submitorder XML, @order XML OUTPUT AS BEGIN

DECLARE @dochandle INT, @CustomerID INT, @OrderID INT, @inboundorder XML, @neworder VARCHAR(MAX)

DECLARE @customer TABLE

(CompanyName VARCHAR(50)) DECLARE @orderitems TABLE

(SKU VARCHAR(10), Quantity INT)

--Rip out the xmlns required by Service Broker, because OPENXML cannot -- handle XML with a namespace designation SET @inboundorder = CAST(REPLACE(CAST(@submitorder AS VARCHAR(MAX)),

' xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2"','') AS XML)

EXEC sp_xml_preparedocument @docHandle OUTPUT, @inboundorder INSERT INTO @customer SELECT * FROM OPENXML(@docHandle, N'/Customer',2) WITH (CompanyName VARCHAR(50)) INSERT INTO @orderitems SELECT * FROM OPENXML(@docHandle, N'//OrderLine',2)

WITH (SKU VARCHAR(10), Quantity INT)

EXEC sp_xml_removedocument @docHandle SELECT @CustomerID = a.CustomerID FROM Customers.Customer a INNER JOIN @customer b ON a.CompanyName = b.CompanyName IF @@ROWCOUNT = 0 BEGIN

INSERT INTO Orders.InvalidOrders (PartnerOrder) VALUES (@submitorder) RETURN -1

END BEGIN TRY

INSERT INTO Orders.OrderHeader (CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount) SELECT @CustomerID, GETDATE(), ST.Subtotal, 0, 5.00 FROM (SELECT SUM(a.UnitPrice*b.Quantity) Subtotal

FROM Products.ProductOptions a INNER JOIN @orderitems b ON a.SKU = b.SKU) ST

239

www.detodoprogramacion.com

Page 256: Microsoft SQL Server 2008 Español - Mike Hotek

240 Parte IV Diseño avanzado de objetos de bases

SET @OrderID = SCOPE_IDENTITY()

INSERT INTO Orders.OrderDetail (OrderID, SKU, Quantity, UnitPrice) SELECT @OrderID, a.SKU, a.Quantity, b.UnitPrice FROM @orderitems a INNER JOIN Products.ProductOptions b ON a.SKU = b.SKU

END TRY BEGIN CATCH

INSERT INTO Orders.InvalidOrders (PartnerOrder) VALUES (@submitorder) RETURN -1

END CATCH SELECT @neworder = '<Customer xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1">

<CompanyName>' + CompanyName + '</CompanyName> <OrderTotal> <OrderID>' + CAST(@OrderID AS VARCHAR(20)) + '</OrderID> <OrderDate>'

FROM @customer SELECT @neworder += CAST(OrderDate AS VARCHAR(30)) + '</OrderDate>

<SubTotal>' + CAST(SubTotal AS VARCHAR(20)) + '</SubTotal> <ShippingAmount>' + CAST(ShippingAmount AS VARCHAR(20)) + '</ShippingAmount> <TaxAmount>' + CAST(TaxAmount AS VARCHAR(20)) + '</TaxAmount> <GrandTotal>' + CAST(GrandTotal AS VARCHAR(20)) + '</GrandTotal>

</OrderTotal> </Customer>' FROM Orders.OrderHeader WHERE OrderID = @OrderID SET @order = @neworder

END GO

4. Ejecute el siguiente código para recuperar la orden enviada para su procesamiento (el código se

encuentra en el archivo Capítulo16\code9.sql):

DECLARE @handle UNIQUEIDENTIFIER, @submitorder XML, @order XML, @messagetype SYSNAME, @rc INT --proc return code

BEGIN TRANSACTION WHILE 1 = 1 BEGIN

--Receive 1 message off the top of the queue WAITFOR( RECEIVE TOP(1) @handle = conversation_handle,

@submitorder = message_body, @messagetype = message_type_name

FROM OrderSubmitQueue), TIMEOUT 500;

www.detodoprogramacion.com

Page 257: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker 241

--Check for errors IF @@ROWCOUNT <> 0 BEGIN

IF @messagetype = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' OR @messagetype = 'http://schemas.microsoft.com/SQL/ServiceBroker/Error'

BEGIN END CONVERSATION @handle;

END

--Execute proc to shred the order and write to tables EXEC @rc = dbo.asp_processpartnerorders @submitorder, @order OUTPUT; --Return the order to the queue for acknowledgement to the customer IF @rc = -1 BEGIN

SEND ON CONVERSATION @handle MESSAGE TYPE [//SQL2008SBS/Partner/AcceptedOrders] (@submitorder); END CONVERSATION @handle;

END ELSE BEGIN

SEND ON CONVERSATION @handle MESSAGE TYPE [//SQL2008SBS/Partner/AcceptedOrders] (@order);

END CONVERSATION @handle;

END END ELSE BEGIN

--Close any open transactions and break out of the loop WHILE @@TRANCOUNT > 0 BEGIN

COMMIT TRANSACTION END BREAK

END --Make sure all open transactions are closed WHILE @@TRANCOUNT > 0 BEGIN

COMMIT TRANSACTION END

END GO

5. Ejecute el siguiente código para revisar el contenido de Orders.OrderHeader y Orders.OrderDetail (el código puede encontrarse en el archivo Capítulo16\code9.sql):

--View results SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount,

GrandTotal, FinalShipDate FROM Orders.OrderHeader

www.detodoprogramacion.com

Page 258: Microsoft SQL Server 2008 Español - Mike Hotek

242 Parte IV Diseño avanzado de objetos de bases de datos

SELECT OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate FROM Orders.OrderDetail SELECT PartnerOrder FROM Orders.InvalidOrders GO

6. Ejecute el siguiente código para revisar el contenido de la confirmación del pedido en cola:

SELECT * FROM OrderSubmitQueue GO SELECT * FROM OrderAcknowledgeQueue GO

Activación de la cola

En la forma más simple de una aplicación de Service Broker, los mensajes esperan en una cola hasta que se

extraigan por un servicio para ser procesados. Si son necesarios hilos de procesamiento adicionales para continuar con el flujo de los mensajes, el desarrollador de la aplicación de Service Broker tendrá que codificar la lógica de control para iniciar hilos de trabajo adicionales.

Además de estar diseñado para el procesamiento asíncrono, Service Broker también ofrece escalabilidad dinámica. La cláusula ACTIVATION de una cola de Service Broker permite asociar un procedimiento almacenado a una cola. Cuando el estado se establece en ON, tan pronto como llega un mensaje a la cola de Service Broker se iniciará automáticamente el procedimiento almacenado para procesar el mensaje. Como los mensajes siguen llegando a la cola, Service Broker automáticamente lanzará copias adicionales del procedimiento almacenado con el fin de mantenerse al día con las solicitudes entrantes. Un procedimiento almacenado adicional se pondrá en marcha hasta el valor de MAX_QUEUE_READERS. Cuando una cola ya no contiene ningún mensaje para procesar, se cerrará la activación del procedimiento almacenado.

Mediante el empleo de ACTIVATION, puede activar una aplicación de Service Broker para dinámicamente asignar (allocate) y desasignar (de-allocate) recursos de acuerdo con el volumen de mensajes que están siendo enviados a la cola.

Los socios comerciales pueden enviar pedidos a través de nuestro extremo HTTP en cualquier momento del día. Además, podemos tener un flujo mucho más pesado de pedidos durante ciertas horas del día. En este ejercicio, usted modificará la cola detrás nuestro procesador de pedidos de Service Broker y habilitará la cola para la activación con el fin de asignar dinámicamente los recursos de procesamiento basados en el flujo de órdenes.

www.detodoprogramacion.com

Page 259: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 de Service Broker 243

Crear un procedimiento almacenado de activación

1. Ejecute el siguiente código para activar la secuencia de comandos de prueba en el procedimiento almacenado de activación que se usará para procesar los pedidos (el código se puede encontrar en el archivo Capítulo 16\ code10.sql):

CREATE PROCEDURE dbo.asp_processpartnerorderqueue AS DECLARE @handle UNIQUEIDENTIFIER,

@submitorder XML, @order XML, @messagetype SYSNAME, @rc INT --proc return code

BEGIN TRANSACTION WHILE 1 = 1 BEGIN

--Receive 1 message off the top of the queue WAITFOR( RECEIVE TOP(1) @handle = conversation_handle,

@submitorder = message_body, @messagetype = message_type_name

FROM OrderSubmitQueue), TIMEOUT 500;

--Check for errors IF @@ROWCOUNT <> 0 BEGIN

IF @messagetype = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog' OR @messagetype = 'http://schemas.microsoft.com/SQL/ServiceBroker/Error'

BEGIN END CONVERSATION @handle;

END --Execute proc to shred the order and write to tables EXEC @rc = dbo.asp_processpartnerorders @submitorder, @order OUTPUT;

--Return the order to the queue for acknowledgement to the customer IF @rc = -1 BEGIN

SEND ON CONVERSATION @handle MESSAGE TYPE [//SQL2008SBS/Partner/AcceptedOrders] (@submitorder);

END CONVERSATION @handle;

END ELSE BEGIN

SEND ON CONVERSATION @handle MESSAGE TYPE [//SQL2008SBS/Partner/AcceptedOrders] (@order);

END CONVERSATION @handle; END

END

www.detodoprogramacion.com

Page 260: Microsoft SQL Server 2008 Español - Mike Hotek

244 Parte IV Diseño avanzado de objetos de bases de datos.

ELSE BEGIN

--Close any open transactions and break out of the loop WHILE @@TRANCOUNT > 0 BEGIN

COMMIT TRANSACTION END BREAK

END

--Make sure all open transactions are closed WHILE @@TRANCOUNT > 0 BEGIN

COMMIT TRANSACTION END

END GO

2. Ejecute el siguiente código para agregar la activación a nuestra cola de envío de pedido (el código se encuentra en el archivo Capítulo16\ code11.sql):

ALTER QUEUE OrderSubmitQueue WITH ACTIVATION (STATUS = ON, PROCEDURE_NAME = dbo.asp_processpartnerorderqueue, MAX_QUEUE_READERS = 10, EXECUTE AS SELF)

GO

3. Ejecute el siguiente código para probar el procedimiento de activación y procesamiento de pedidos (el código se puede encontrar en el archivo Capítulo16\code12.sql):

DECLARE @dialog_handle UNIQUEIDENTIFIER BEGIN TRANSACTION BEGIN DIALOG CONVERSATION @dialog_handle FROM SERVICE [//SQL2008SBS/Partner/OrderAcknowledgeService] TO SERVICE '//SQL2008SBS/Partner/SubmitOrderService' ON CONTRACT [//SQL2008SBS/Partner/SubmitOrder]; SEND ON CONVERSATION @dialog_handle MESSAGE TYPE [//SQL2008SBS/Partner/PartnerOrderSubmit] (N'<Customer xmlns="urn:schemas-microsoft-com:sql:SqlRowSet2">

<CompanyName>Wide World Importers</CompanyName> <OrderLine>

<SKU>1-2RB1-2RO</SKU> <Quantity>10</Quantity>

</OrderLine> <OrderLine>

<SKU>1-4RB1-2RO</SKU> <Quantity>10</Quantity>

</OrderLine> </Customer>')

www.detodoprogramacion.com

Page 261: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 16 Service Broker

COMMIT TRANSACTION GO SELECT * FROM OrderSubmitQueue GO SELECT * FROM OrderAcknowledgeQueue GO SELECT * FROM sys.conversation_endpoints GO --View results SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount,

GrandTotal, FinalShipDate FROM Orders.OrderHeader GO SELECT OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate FROM Orders.OrderDetail GO SELECT PartnerOrder FROM Orders.InvalidOrders GO

245

Priorización

La capacidad de asignar prioridades a las conversaciones es nueva en SQL Server Service Broker 2008. Las prioridades le permiten a Service Broker equilibrar dinámicamente los recursos para que las peticiones de alto valor puedan tener precedencia. Por ejemplo, el procesamiento de una transacción de tarjeta de crédito puede ser empujado a través de la cola a pesar de que varias tareas de movimiento de datos antecesoras puedan haber sido colocadas en la cola.

Anteriormente, Service Broker trataba todos los mensajes colocados en la cola como iguales y utilizaba un método sencillo de procesamiento FIFO. Aunque Service Broker todavía utiliza un método de procesamiento FIFO, el orden de procesamiento se modifica para incluir la capacidad de clasificar los mensajes en la cola basándose en la prioridad y entonces el orden del mensaje es reemplazado en la cola.

La prioridad se puede asignar desde 1 a 10, con una prioridad por defecto de 5. El comando CREATE BROKER PRIORITY se utiliza para asignar una prioridad basada en:

 

 

 

Contrato

Servicio local

Servicio remoto

www.detodoprogramacion.com

Page 262: Microsoft SQL Server 2008 Español - Mike Hotek

246 Parte IV Diseño avanzado de objetos de bases de datos

Capítulo 16 Referencia Rápida

Para

Crear una aplicación de Service Broker para procesar mensajes

Haga lo siguiente

Cree los componentes de Service Broker en el siguiente orden:

1. CREATE MESSAGE TYPE

2. CREATE CONTRACT

3. CREATE QUEUE

4. CREATE SERVICE

Colocar los mensajes en una cola BEGIN DIALOG CONVERSATION <dialog handle> FROM SERVICE <initiator> TO SERVICE '<target>' ON CONTRACT <contract name>

RECEIVE <row(s)|columns> FROM <queue

Extraer los mensajes de una cola para

procesar

Ejecutar automáticamente un procedimiento almacenado cuando un mensaje llega a la cola

Configure la cola con un procedimiento almacenado de activación

www.detodoprogramacion.com

Page 263: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 17

Indización de texto completo

Después de completar este capítulo, usted será capaz de

 

 

 

Crear un catálogo de texto completo

Crear y llenar un índice de texto completo

Consultar datos de texto completo

Las plataformas de base de datos están diseñadas para almacenar y proporcionar una rápida recuperación de cantidades muy grandes de datos. El eficiente almacenamiento y recuperación se logra debido a la estructura que se impone en los datos relacionales. Desafortunadamente, no todos los datos dentro de una organización pueden ser estructurados en filas y columnas ordenadas de una tabla. Con el fin de manejar los datos no estructurados almacenados en FILESTREAM, XML, y columnas de caracteres grandes, SQL Server tiene un motor de indexación alternativo diseñado para proporcionar capacidades de búsqueda flexibles. En este capítulo se explica cómo crear catálogos e índices de texto completo, así como la forma de consultar los datos no estructurados utilizando el motor de texto completo.

Nota Como te habrás dado cuenta a esta altura del libro, yo no soy un gran fan de la utilización de herramientas gráficas point-and-click para el aprendizaje de SQL Server. Aunque las herramientas gráficas le pueden permitir alguien con muy poco conocimiento instalar y configurar las cosas, la interfaz también esconde muchas opciones que ayudan a explicar lo que está haciendo una característica y cómo se puede aprovechar. Al hacer clic a través de una interfaz gráfica de usuario producirá un resultado, pero nunca va a producir soluciones creativas a los problemas. Este capítulo no es nada diferente de los capítulos anteriores. Puede utilizar los asistentes y GUIs para configurar la indización de texto, pero vamos a utilizar el código de modo que pueda ver todas las opciones que están disponibles

Catálogos de texto completo

Con el fin de emplear las capacidades de búsqueda de texto completo, es necesario crear índices de texto completo. Aunque los índices relacionales se basan en una estructura de árbol-B, como vimos en el capítulo 6, "Índices", los índices de texto completo tienen una estructura interna única que se mantiene dentro de una estructura llamada “catálogo de texto completo”. Cada catálogo de texto contiene uno o más índices de texto completo.

La sintaxis genérica para crear un catálogo de texto completo es el siguiente:

CREATE FULLTEXT CATALOG catalog_name [ON FILEGROUP filegroup ] [IN PATH 'rootpath'] [WITH <catalog_option>] [AS DEFAULT] [AUTHORIZATION owner_name ]

<catalog_option>::=

ACCENT_SENSITIVITY = {ON|OFF}

247

www.detodoprogramacion.com

Page 264: Microsoft SQL Server 2008 Español - Mike Hotek

248 Parte IV Diseño avanzado de objetos de bases de datos

Nota Antes de SQL Server 2008, la cláusula IN PATH especificaba el directorio del sistema de archivos que se utilizaba para almacenar los índices de texto completo. Además, la opción FILEGROUP era sólo utilizada para asociar la estructura en disco para un índice de texto completo a un FILEGROUP para copia de seguridad. Las estructuras externas han sido eliminadas en SQL Server 2008 con el contenido entero del catálogo de texto completo incluido dentro del FILEGROUP que especifique.

La opción FILEGROUP especifica el grupo de archivos dentro de la base de datos donde serán almacenados el catálogo de texto completo y los índices contenidos en el catálogo. Se recomienda que cree un grupo de archivos independiente para los catálogos de texto completo de tal manera que usted puede utilizar las capacidades del grupo de archivos “copia de seguridad/restauración” descritas en el Capítulo 20, "Recuperación de datos", independiente del resto de la base de datos.

En este ejercicio, añadirá un catálogo de texto completo tanto a las bases de datos SQL2008SBS como SQL2008SBSFS para que pueda crear índices de texto completo en los documentos XML y FILESTREAM

para nuestras bases de datos.

Creación de un catálogo de texto completo

1. Ejecute el siguiente código para agregar un grupo de archivos y un archivo para cada una de nuestras bases de datos a utilizar con la indización de texto completo (el código se puede encontrar en el archivo Capítulo17\code1.sql):

ALTER DATABASE SQL2008SBS ADD FILEGROUP FullTextCatalog

GO ALTER DATABASE SQL2008SBSFS

ADD FILEGROUP FullTextCatalog GO ALTER DATABASE SQL2008SBS

ADD FILE (NAME = N'SQL2008SBSFT', FILENAME = N'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBSFT.ndf')

TO FILEGROUP FullTextCatalog GO ALTER DATABASE SQL2008SBSFS

ADD FILE (NAME = N'SQL2008SBSFSFT', FILENAME = N'C:\Program Files\ Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\SQL2008SBSFSFT.ndf')

TO FILEGROUP FullTextCatalog GO

2. Ejecute el siguiente código para crear los dos catálogos de texto completo (el código se puede encontrar en el archivo Capítulo17\code2.sql):

USE SQL2008SBS GO CREATE FULLTEXT CATALOG ProductDescription

ON FILEGROUP FullTextCatalog GO USE SQL2008SBSFS GO

www.detodoprogramacion.com

Page 265: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 17 indización de texto completo

CREATE FULLTEXT CATALOG ProductDocument

ON FILEGROUP FullTextCatalog GO

249

Índices de texto completo

Una vez que el catálogo de texto completo ha sido creado, usted puede crear los índices de texto completo que son la base para la búsqueda de datos no estructurados.

Los índices de texto completo se pueden crear en columnas CHAR/VARCHAR, así como XML y VARBINARY. Aunque las columnas CHAR/VARCHAR/XML pueden ser procesadas directamente, el motor de indización de texto completo necesita ayuda con datos VARBINARY. Cuando usted está aplicando un índice de texto completo en una columna VARBINARY(MAX), también se especifica un tipo de columna que le dice al motor de indexación de texto completo el filtro a cargar para analizar (parse) el documento almacenado. SQL Server 2008 incluye 50 filtros que permiten el procesamiento de un variedad de tipos de documentos, como HTML, Word, PowerPoint y Excel.

Nota También puede crear índices de texto completo en tipos de datos TEXT e IMAGE, pero puesto que ambos tipos de datos están obsoletas en SQL Server 2005, cualquier uso de TEXT e IMAGE debe ser convertido a VARCHAR (MAX) o VARBINARY (MAX).

Varios servicios auxiliares tales como separadores de palabras (word breakers), lematizadores (stemmers,) y archivos de idioma se utilizan para construir índices compactos, eficientes y flexibles. Los separadores de palabras localizan las pausas entre palabras dentro de una columna con el fin de construir una lista de palabras a indexar. Los lematizadores conjugan verbos para producir un índice que permita la recuperación de contenidos apropiados a través de los tiempos verbales múltiples. Los archivos de idioma se utilizan para reconocer los atributos específicos de idioma contenidos en el documento indexado por lo que los índices pueden ser construidos en varios idiomas sin necesidad de procesamiento especial para cada idioma.

La lista de palabras se filtra a través de una lista de palabras comunes llamadas palabras vacías. Usted especifica esas palabras vacías para que su índice no se contamine con grandes volúmenes de palabras que normalmente no deberían ser buscadas. Por ejemplo, "the", "a" y "an" se considerarían palabras vacías para el idioma Inglés, mientras que "le" y "la" serían palabras vacías para el Idioma francés.

Nota La búsqueda de texto completo utiliza dos términos, “palabras vacías” y “palabras sonoras”, para decir lo mismo.

El uso de los servicios de ayuda está más allá del alcance de este libro. Puede encontrar más detalles sobre el funcionamiento interno, el uso y manipulación de los servicios de ayuda en el "Kit de auto entrenamiento individual de MCTS (Exam 70-432): Microsoft SQL Server 2008- Implementation and Maintenance ".

www.detodoprogramacion.com

Page 266: Microsoft SQL Server 2008 Español - Mike Hotek

250 Parte IV Diseño avanzado de objetos de bases de datos

Los índices de texto completo se pueden crear en múltiples columnas, sin embargo, sólo se puede crear un único índice de texto completo en una tabla o vista indexada. La sintaxis genérica para crear un índice de texto completo es el siguiente:

CREATE FULLTEXT INDEX ON table_name [ ( { column_name

[ TYPE COLUMN type_column_name ] [ LANGUAGE language_term ]

} [ ,...n] ) ]

KEY INDEX index_name [ ON <catalog_filegroup_option> ] [ WITH [ ( ] <with_option> [ ,...n] [ ) ] ]

[;] <catalog_filegroup_option>::=

{fulltext_catalog_name | ( fulltext_catalog_name, FILEGROUP filegroup_name ) | ( FILEGROUP filegroup_name, fulltext_catalog_name ) | ( FILEGROUP filegroup_name )}

<with_option>::=

{CHANGE_TRACKING [ = ] { MANUAL | AUTO | OFF [, NO POPULATION ] } | STOPLIST [ = ] { OFF | SYSTEM | stoplist_name }}

El parámetro TYPE COLUMN se utiliza cuando los índices de texto completo se crean en columnas VARBINARY (MAX) con el fin de designar el tipo de filtro que el motor de índice de texto completo debe utilizar para la columna. El parámetro LANGUAGE le permite especificar el idioma de los datos que son indexados. El parámetro KEY INDEX es la columna “de valor único” dentro de la tabla o vista indexada que identifica de forma única una fila.

La opción más importante que especificará para un índice de texto completo es si SQL Server mantendrá automáticamente el índice de texto completo cuando se produzcan cambios o si el mantenimiento del índice será manejado como una tarea programada. Cuando se especifica la opción CHANGE_TRACKING como AUTO, SQL Server actualizará automáticamente el índice de texto completo cuando se hagan cambios en la tabla subyacente. Cuando la opción CHANGE_TRACKING para un índice de texto completo esté en MANUAL, usted tendrá que crear un proceso que actualizará el índice de texto completo, conocido como un “index crawl” o índice de rastreo.

En el siguiente ejercicio, creará índices de texto completo para las descripciones de nuestros productos y documentos.

Crear un índice de texto completo

1. Ejecute el siguiente código para crear el índice de texto completo para la descripción del producto

(El código se puede encontrar en el archivo Capítulo17\code3.sql):

USO SQL2008SBS

GO

www.detodoprogramacion.com

Page 267: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 17 indización de texto completo

CREATE FULLTEXT INDEX ON Products.Product(ProductDescription) KEY INDEX pk_product ON ProductDescription WITH CHANGE_TRACKING = AUTO

GO

251

2. Ejecute el siguiente código para crear el índice de texto completo del documento del producto (El código puede encontrarse en el archivo Capítulo17\code3.sql):

USE SQL2008SBSFS GO CREATE FULLTEXT INDEX ON Products.ProductDocument

(Document TYPE COLUMN DocumentType) KEY INDEX pk_productdocument ON ProductDocument WITH CHANGE_TRACKING = AUTO

GO

Consulta de datos de texto completo

SQL Server proporciona dos comandos para consultar datos de texto completo: CONTAINS y FREETEXT. Hay dos opciones adicionales que producen un conjunto de resultados con columnas adicionales de información: CONTAINSTABLE y FREETEXTTABLE..

La principal diferencia entre los cuatro comandos es que CONTAINS y FREETEXT retornan un valor verdadero/falso utilizado para limitar un conjunto de resultados, mientras que CONTAINSTABLE y FREETEXTTABLE devuelven un conjunto de resultados que se pueden utilizar para ampliar la funcionalidad de la consulta.

Nota Al igual que todos los ejemplos SELECT dentro de este libro, voy a utilizar el ejemplo de la base de datos AdventureWorks. Usted necesitará crear un índice de texto completo en la columna Production.ProductDescription con el fin de ejecutar las consultas de texto completo en esta sección.

Cuando se ejecuta una consulta, SQL Server analiza y compila la consulta. La parte relacionada con el texto completo se entrega al motor de búsqueda de texto completo dedicado. La cadena de consulta de entrada al motor de búsqueda de texto completo se procesa utilizando los separadores de palabras (word breakers), lematizadores, archivos de idioma, y las palabras vacías que se emplearon en la construcción del índice de texto completo. Además, el motor de búsqueda de texto completo emplea un archivo de sinónimos (tesauro). La capacidad tesauro es una característica que hace la búsqueda de texto completo mucho más flexible y poderosa que cualquier otra consulta que hemos discutido hasta ahora, capaz de encontrar sinónimos, palabras relacionadas, e incluso el manejo común de faltas de ortografía. Por ejemplo, puede ejecutar una consulta de búsqueda de texto completo de todos los productos hecho de "metal" y dicha búsqueda devolvería productos etiquetados por los términos "metal" " aluminum,” , " steel,”, "silver", "gold", "iron", "metals", "metallic", etc

www.detodoprogramacion.com

Page 268: Microsoft SQL Server 2008 Español - Mike Hotek

252 Parte IV Diseño avanzado de objetos de bases de datos

Nota Todos los términos de búsqueda que se utilizan con el texto completo son cadenas Unicode. Si usted pasa una cadena no-Unicode, la consulta igual funcionará, pero sería mucho menos eficiente. Asegúrese de que todos los términos que pasa en la búsqueda de texto completo siempre se escriben como Unicode para un rendimiento máximo.

Texto Libre (FREETEXT)

Las consultas FREETEXT son la forma más básica de una búsqueda de texto completo que emplea automáticamente lematizadores y archivos de diccionario de sinónimos. La sintaxis genérica para una consulta FREETEXT es:

FREETEXT ( { column_name | (column_list) | * } , 'freetext_string' [ , LANGUAGE language_term ] )

Un ejemplo de una consulta FREETEXT es (el código puede encontrarse en el archivo Capítulo17\ code4.sql):

SELECT ProductDescriptionID, Description FROM Production.ProductDescription WHERE FREETEXT(Description,N'bike') GO

FREETEXTTABLE devuelve un conjunto de resultados con información adicional que clasifica los resultados de acuerdo a la proximidad de igualdad (match) para el término buscado originalmente. La sintaxis genérica para FREETEXTTABLE es:

FREETEXTTABLE (table , { column_name | (column_list) | * } , 'freetext_string'

[ ,LANGUAGE language_term ] [ ,top_n_by_rank ] )

La misma consulta anterior expresada con FREETEXTTABLE es la siguiente (el código puede encontrarse en El archivo Capítulo17\code4.sql):

SELECT a.ProductDescriptionID, a.Description, b.* FROM Production.ProductDescription a

INNER JOIN FREETEXTTABLE(Production.ProductDescription, Description, N'bike') b ON a.ProductDescriptionID = b.[Key]

ORDER BY b.[Rank] GO

Contenido (CONTAINS)

CONTAINS proporciona la mayor flexibilidad en la capacidad de búsqueda de texto completo que le permite:

 

 

 

Buscar formas de palabra.

Búsqueda palabra de proximidad.

Proporcionar peso relativo a los términos.

www.detodoprogramacion.com

Page 269: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 17 indización de texto completo 253

La sintaxis genérica para CONTAINS es:

CONTAINS

( { column_name | (column_list) | * } , '< contains_search_condition >'

[ , LANGUAGE language_term ] ) < contains_search_condition > ::=

{ < simple_term > | < prefix_term > | < generation_term > | < proximity_term > | < weighted_term > } | { ( < contains_search_condition > ) [ { < AND > | < AND NOT > | < OR > } ] < contains_search_condition > [ ...n ] }

< simple_term > ::=

word | " phrase " < prefix term > ::=

{ "word * " | "phrase *" } < generation_term > ::=

FORMSOF ( { INFLECTIONAL | THESAURUS } , < simple_term > [ ,...n ] )

< proximity_term > ::= { < simple_term > | < prefix_term > } { { NEAR | ~ } { < simple_term > | < prefix_term > } } [ ...n ]

< weighted_term > ::=

ISABOUT ( { { < simple_term > | < prefix_term > | < generation_term > | < proximity_term > } [ WEIGHT ( weight_value ) ] } [ ,...n ] )

Puede utilizar los términos de búsqueda, ya sea para coincidencias exactas o como prefijos. La siguiente consulta devuelve los productos con una coincidencia exacta para la palabra "bike". Aunque la consulta se ve casi exactamente igual a la versión FREETEXT, la consulta CONTAINS devolverá dos filas menos debido a la correspondencia exacta (el código puede encontrarse en el archivo Capítulo17\code4.sql):

SELECT ProductDescriptionID, Description FROM Production.ProductDescription WHERE CONTAINS(Description,N'bike') GO

Si desea realizar una búsqueda básica de comodín para palabras prefijadas por un término de búsqueda, puede ejecutar la siguiente consulta (el código puede encontrarse en el archivo Capítulo17\code4.sql):

SELECT ProductDescriptionID, Description FROM Production.ProductDescription WHERE CONTAINS(Description,N'"bike*"') GO

www.detodoprogramacion.com

Page 270: Microsoft SQL Server 2008 Español - Mike Hotek

254 Parte IV Diseño avanzado de objetos de bases de datos

Si se comparan los resultados de la consulta FREETEXT, verá que cada una devuelve el mismo conjunto de filas. Con CONTAINS, usted tiene que especificar explícitamente que quiere realizar una búsqueda difusa (fuzzy), la que incluiría los prefijos de palabras, en cambio FREETEXT haría por default una búsqueda difusa.

En aquellos casos en los que desee realizar la búsqueda por variantes de palabra, puede utilizar las opciones FORMSOF, INFLECTIONAL y THESAURUS. INFLECTIONAL hace que el motor de texto completo considere palabras que se derivan de la buscada. Por ejemplo, buscar "Driven" también producirá “drive,” “ driving,” “drove,” etc. THESAURUS produce sinónimos para el término de búsqueda. Un ejemplo de búsqueda de “variantes de palabra” es como sigue (el código puede encontrarse en el archivo Capítulo17\code4.sql):

SELECT ProductDescriptionID, Description FROM Production.ProductDescription WHERE CONTAINS(Description,N' FORMSOF (INFLECTIONAL,ride) ') GO SELECT ProductDescriptionID, Description FROM Production.ProductDescription WHERE CONTAINS(Description,N' FORMSOF (THESAURUS,metal) ') GO

Nota Un archivo de tesauro existe para cada idioma soportado. Todos los archivos de tesauro son archivos XML almacenados en el directorio FTDATA dentro de la ruta predeterminada en la instalación de SQL Server. Los archivos de tesauro no están “llenos”, por lo que para realizar búsquedas de sinónimos, usted tendrá que llenar previamente dichos archivos.

Uno de los requisitos más comunes para búsquedas de texto completo es encontrar filas en las que dos o más palabras están cerca unas de otras. La búsqueda de proximidad se lleva a cabo mediante el uso de la palabra clave NEAR. Aunque las búsquedas de proximidad y ponderado de proximidad se pueden realizar utilizando CONTAINS, este tipo de búsquedas se realizan generalmente utilizando CONTAINSTABLE para aprovechar el valor RANK que es calculado.

La siguiente consulta devuelve todas las filas donde "bike" está cerca "de performance." El valor de rango es

afectado por la distancia entre las dos palabras (el código puede encontrarse en el archivo Capítulo17\code4. sql):

SELECT a.ProductDescriptionID, a.Description, b.* FROM Production.ProductDescription a INNER JOIN

CONTAINSTABLE(Production.ProductDescription, Description, N'bike NEAR performance') b ON a.ProductDescriptionID = b.[Key]

ORDER BY b.[Rank] GO

La siguiente consulta devuelve las primeras 10 filas por rango de acuerdo a los promedios ponderados de las palabras "performance", "comfortable", "smooth", "safe" y "competition" (el código se encuentra en el archivo Capítulo17\code4.sql):

www.detodoprogramacion.com

Page 271: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 17 indización de texto completo

SELECT a.ProductDescriptionID, a.Description, b.* FROM Production.ProductDescription a INNER JOIN

CONTAINSTABLE(Production.ProductDescription, Description, N'ISABOUT (performance WEIGHT (.8), comfortable WEIGHT (.6), smooth WEIGHT (.2) , safe WEIGHT (.5), competition WEIGHT (.5))', 10) b ON a.ProductDescriptionID = b.[Key]

ORDER BY b.[Rank] DESC GO

255

Los ejemplos de código en el CD contienen un script adicional “Capítulo17 \ codeX.sql”, para rellenar un índice de texto completo que ha sido creado para llenado manual.

Capítulo 17 Referencia Rápida

Para

Configurar búsqueda de texto completo

Mantener automáticamente los contenidos del índice de texto completo

Realizar búsquedas de términos difusos

Realizar coincidencias exactas; coincidencias difusas o emplear sinónimos, ponderación de término, y palabra proximidad

Haga lo siguiente

1. CREATE FULLTEXT CATALOG

2. CREATE FULLTEXT INDEX

Especifique CHANGE_TRACKING = AUTO para el índice de texto completo

Utilice FREETEXT o FREETEXTTABLE

Utilice CONTAINS o CONTAINSTABLE

www.detodoprogramacion.com

Page 272: Microsoft SQL Server 2008 Español - Mike Hotek

Parte V

Gestión de Base de Datos

En esta parte:

Capítulo 18: Seguridad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

Capítulo 19: Administración basada en directiva. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

Capítulo 20: Recuperación de Datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . 301

Capítulo 21: El Agente SQL Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . 319

Capítulo 22: Vistas de administración dinámica. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333

257

www.detodoprogramacion.com

Page 273: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18

Seguridad

Después de completar este capítulo, usted será capaz de

 

 

 

 

Configurar una superficie segura

Trabajar con criterios de valoración (endpoints)

Administrar directores, elementos que pueden protegerse y permisos

Cifrar y descifrar datos

El trabajo principal de un administrador de base de datos (DBA) es proteger los datos en las bases de datos que gestiona. La protección de los datos se realiza a través de dos tareas principales: realizar copias de seguridad de bases de datos y asegurar las bases de datos. En este capítulo, usted aprenderá acerca de una de las dos tareas más importantes que un DBA puede realizar. Usted aprenderá cómo limitar el conjunto de características para reducir la exposición de seguridad. Usted también aprenderá cómo controlar el acceso a una instancia y a un objeto de la base de datos, así como cifrar datos y bases de datos.

Configuración de la superficie de ataque

La seguridad es un ejercicio de creación de barreras suficientes para el sistema de tal manera que el esfuerzo involucrado para atacar un sistema excede el beneficio derivado de los datos. Con el fin de derrotar a una gran variedad de sistemas de ataque, se cuenta con un enfoque de "defensa en profundidad" que coloca varios obstáculos en el camino de un atacante.

Durante la instalación de la instancia, usted tiene la opción de especificar el modo de autenticación que se permite. Si se limita el acceso a una instancia con inicios de sesión de Windows solamente, puede prevenir una amplia variedad de métodos de ataque garantizando que cualquier usuario que se conecta a la instancia debe primero autenticarse en un dominio de Windows.

Una vez que la instancia se ha instalado, puede configurar los protocolos de red para permitir conexiones remotas. Si las conexiones remotas no se han habilitado, un atacante primero debería tener acceso a la máquina en la que se está ejecutando la instancia.

La configuración para las conexiones remotas y el modo de autenticación representan las primeras capas de seguridad para sus instancias.

Cada característica dentro de SQL Server permite el acceso a la funcionalidad, pero ofrece al mismo tiempo un método para que un atacante encuentre un camino en el sistema. El potencial más significativo para los ataques a una instancia es mediante el uso de características que exponen a una interfaz externa o la capacidad de ejecuciones ad hoc. Cuando se instala una instancia de SQL Server, cualquier característica que no es necesaria para que el núcleo del motor funcione, ha sido desactivada por defecto.

259

www.detodoprogramacion.com

Page 274: Microsoft SQL Server 2008 Español - Mike Hotek

260 Parte V Gestión de Base de Datos

Puede activar o desactivar funciones dentro de la instancia ejecutando el procedimiento almacenado del Sistema sp_configure. Aunque sp_configure se utiliza para varias funciones internas, la Tabla 18-1 describe cómo se aplican las opciones a la superficie de ataque de la instancia. A menos que esté específicamente utilizando alguna de las características que se enumeran en la Tabla 18-1, estas deben ser desactivadas.

TABLA 18-1 Opción de configuración de superficie de ataque

Propósito

Permite que un usuario ejecute OPENROWSET y OPENDATASOURCE. Las contraseñas están embebidas en el texto de la consulta, dejando al descubierto un nombre de usuario y una contraseña para un atacante. Si necesita acceder con frecuencia a fuentes de datos remotas, debe utilizar un servidor vinculado (linked server).

El Common Language Runtime (CLR) le permite a los triggers, funciones, y procedimientos almacenados que se han escrito en. NET (como C #. NET) ejecutarse dentro de su motor SQL Server. Si el CLR está desactivado, no se permiten ejecutar las rutinas CLR.

Le permite a los usuarios cruzar bases de datos sin tener que volver a revisar los permisos de nuevo, siempre que no haya sido rota una cadena de propiedad. (Cross Database Ownership Chaining - CDOC)

Permite el uso de las funciones de correo de base de datos.

Permite aprobar el software de gestión de clave externa (EKM) para gestionar claves de cifrado utilizadas dentro de la instancia.

Permite las capacidades de FILESTREAM en la instancia. Cuando se establece en 1, puede utilizar T-SQL para manipular los datos FILESTREAM. Cuando se establece en 2, se puede utilizar una API de Windows para interactuar directamente con los datos FILESTREAM desde su aplicación. Le permite a los procedimientos de automatización OLE ser ejecutados. Puede sustituir cualquier procedimiento de automatización OLE con un procedimiento de CLR que es más flexible, así como más estable.

Permite la posibilidad de conectarse de forma remota a la “conexión de administrador dedicada” (DAC). Si las conexiones remotas de administración no están habilitadas, primero debe conectarse en el escritorio de la máquina donde la instancia se está ejecutando, antes de crear una conexión con el DAC.

Permite que la capacidad de SQL Mail tenga compatibilidad con versiones anteriores. Todas las funcionalidades de SQL Mail deberían ser reemplazadas con “Database mail”.

Permite el uso de xp_cmdshell para que pueda ejecutar comandos del sistema operativo.

Opción

Consultas distribuidas Ad Hoc

CLR habilitado

Encadenamiento cruzado de propiedad de base de datos

Correo electrónico de base de datos

Manejo de

clave externa

Nivel de Acceso Filestream

Procedimientos de

Automatización OLE

Conexiones Admin Remotas

SQL Mail XPs

Xp_cmdshell

Los puntos finales

Los puntos finales controlan la capacidad de conectarse a una instancia de SQL Server así como dictar los métodos de comunicación que son aceptables. Actuando muy similar a un servidor de seguridad (firewall) en la red, los “endpoints” son una capa de seguridad en la frontera entre las aplicaciones y su instancia de SQL.. La sintaxis genérica para la creación de un punto final es:

CREATE ENDPOINT endPointName [ AUTHORIZATION login ] [ STATE = { STARTED | STOPPED | DISABLED } ] AS { HTTP | TCP } (<protocol_specific_arguments>) FOR { SOAP | TSQL | SERVICE_BROKER | DATABASE_MIRRORING } (<language_specific_arguments>)

www.detodoprogramacion.com

Page 275: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 261

Tipos de endpoints y cargas

Un punto final tiene dos partes básicas: un transporte y una carga útil. Los extremos que se pueden crear son de dos medios de transporte diferentes: TCP y HTTP. Los puntos finales también tienen una carga útil que define la categoría básica de tráfico que se permite y tiene los valores de SOAP, T-SQL, SERVICE_BROKER, y DATABASE_MIRRORING. La Tabla 18-2 enumera las combinaciones válidas de punto final de transporte y punto final de carga útil.

TABLA 18-2 Punto final Transporte y Carga

Carga útil

T-SQL

SERVICE_BROKER

DATABASE_MIRRORING

SOAP obsoletos en SQL Server 2008

Transporte

TCP

TCP

TCP

HTTP

Mediante la combinación de un punto final de transporte de y carga útil, SQL Server puede filtrar el tráfico aceptable antes de que un comando incluso llegue a la instancia de SQL Server. Por ejemplo, si usted tenía un punto final definido como TCP con una carga útil de T-SQL, si cualquier aplicación fuera a intentar enviar tráfico HTTP, Service Broker o database mirroring a través del endpoint, la conexión sería denegada, sin necesidad de autenticar la solicitud.

Esto es muy similar a la forma que un cortafuegos trabaja en una red. Los administradores de red configuran el cortafuegos para permitir sólo el tráfico en un conjunto específico de puertos TCP y UDP. Cualquier solicitud que intente utilizar un puerto que está bloqueado, se rechaza en el servidor de seguridad. Los puntos finales actúan de la misma manera al rechazar las solicitudes que no estén debidamente formateadas, basadas en la definición de extremo.

Acceso a ”Endpoint “

Incluso si el tráfico que va al punto final coincide con el correcto transporte y la carga útil, aún no se permite una conexión a menos que el acceso haya sido concedido bajo un punto final (endpoint).

El acceso a extremo tiene dos capas.

La primera capa de seguridad de acceso está determinada por el estado del punto final. Un punto final puede tener uno de tres estados: INICIADO (STARTED), DETENIDO (STOPPED) y DESHABILITADO (DISABLED). Los tres estados de un extremo reaccionan de la siguiente manera:

 

 

STARTED El punto final está activo a la escucha de conexiones y responderá a una solicitud.

STOPPED El endpoint está activo escuchando, pero devuelve un error de conexión a una aplicación.

DISABLED El endpoint no escucha y no responde a ningún intento de conexión.  

La segunda capa de seguridad es permiso para conectarse al extremo. La solicitud debe tener un nombre de usuario creado en SQL Server que tenga permiso CONNECT concedido en el punto final, antes que la conexión sea permitida a través del punto final.

www.detodoprogramacion.com

Page 276: Microsoft SQL Server 2008 Español - Mike Hotek

262 Parte V Gestión de Base de Datos

Usted podría cuestionar todo este esfuerzo con el único fin de crear sólo una conexión a una instancia de SQL Server antes de que el usuario esté aún autenticado. Antes de SQL Server 2005, todas las solicitudes podían conectarse a un servidor SQL y transmitir cualquier tipo de solicitud. No se hacía ningún intentó de garantizar que las aplicaciones debían transmitir solicitudes válidamente formadas. Por lo tanto, la piratería en un servidor SQL era mucho más fácil de lograr. SQL Server 2008 garantiza que sólo las solicitudes válidas puedan ser enviadas por un usuario válido antes de que la solicitud sea ejecutada dentro del motor. Los administradores también tienen un “interruptor maestro” para apagar de inmediato el acceso, si sospechan que alguien está tratando de comprometer su servidor SQL, esto se hace mediante el establecimiento del estado del extremo que se está usando a DISABLED.

Los extremos TCP

Los puntos finales TCP ofrecen acceso para T-SQL, Service Broker, y database mirroring. Dependiendo de la carga útil del punto final, están disponibles diferentes argumentos para el comando CREATE ENDPOINT. La sintaxis genérica para los argumentos de TCP es la siguiente:

<AS TCP_protocol_specific_arguments> ::= AS TCP (LISTENER_PORT = listenerPort

[ [ , ] LISTENER_IP = ALL | ( 4-part-ip ) | ( "ip_address_v6" ) ]) <FOR SERVICE_BROKER_language_specific_arguments> ::= FOR SERVICE_BROKER ([ AUTHENTICATION = {

WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] | CERTIFICATE certificate_name | WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] CERTIFICATE

certificate_name | CERTIFICATE certificate_name WINDOWS [ { NTLM | KERBEROS |

NEGOTIATE } ] } ] [ [ , ] ENCRYPTION = { DISABLED | { { SUPPORTED | REQUIRED }

[ ALGORITHM { RC4 | AES | AES RC4 | RC4 AES } ] } ] [ [ , ] MESSAGE_FORWARDING = { ENABLED | DISABLED } ] [ [ , ] MESSAGE_FORWARD_SIZE = forward_size ])

<FOR DATABASE_MIRRORING_language_specific_arguments> ::= FOR DATABASE_MIRRORING ([ AUTHENTICATION = {

WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] | CERTIFICATE certificate_name | WINDOWS [ { NTLM | KERBEROS | NEGOTIATE } ] CERTIFICATE

certificate_name | CERTIFICATE certificate_name WINDOWS [ { NTLM | KERBEROS |

NEGOTIATE } ] [ [ [ , ] ] ENCRYPTION = { DISABLED | { { SUPPORTED | REQUIRED }

[ ALGORITHM { RC4 | AES | AES RC4 | RC4 AES } ] } ] [ , ] ROLE = { WITNESS | PARTNER | ALL })

Argumentos del Protocolo TCP

Los puntos finales TCP se configuran para escuchar en determinadas direcciones IP y números de puerto. Los dos argumentos que se pueden especificar y que son universales para todos los puntos finales TCP son:

 

 

LISTENER_PORT

LISTENER_IP

www.detodoprogramacion.com

Page 277: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 263

El LISTENER_PORT se obligatorio. El TCP para un extremo de T-SQL que se crea para cada instancia durante la instalación, ya estará configurado para el puerto 1433 o el número de puerto alternativo para la instancia.

El LISTENER_IP es un argumento opcional que puede proporcionar una capa de seguridad muy potente para algunos tipos de aplicaciones. Se puede especificar una dirección IP específica para el punto final donde escuchar. El valor por defecto es ALL, lo que significa que el punto final escuchará la conexión en cualquier interfaz de red válida configurada en el equipo. Sin embargo, puede especificar el LISTENER_IP para restringir el punto final para responder a intentos de conexión enviados a través de una interfaz de red específica de la máquina.

Argumentos Database Mirroring

Los extremos “database mirroring” incluyen un tercer argumento relacionado con el rol dentro de la sesión de “database mirroring”.

Puede especificar que un punto final sea un PARTNER, WITNESS, u ALL. Un punto final especificado como

PARTNER puede participar solamente como el principal o el espejo. Un punto final especificado como WITNESS sólo puede participar como testigo. Un punto final especificado como ALL puede funcionar en cualquier papel.

La siguiente instrucción T-SQL de ejemplo muestra cómo crear un extremo de reflejo de base de datos:

CREATE ENDPOINT [Mirroring] AS TCP (LISTENER_PORT = 5022) FOR DATA_MIRRORING (ROLE = PARTNER, ENCRYPTION = REQUIRED); ALTER ENDPOINT [Mirroring] STATE = STARTED;

Argumentos de Service Broker

Además de los modos de autenticación y cifrado, los extremos de Service Broker implementan argumentos relacionados con el reenvío de mensajes.

La opción MESSAGE_FORWARDING permite que los mensajes destinados a una instancia de agente diferente se remitan a la nueva dirección especificada. Las opciones son ENABLED y DISABLED. Si la opción MESSAGE_FORWARDING se establece en ENABLED, también puede especificar el MESSAGE_FORWARDING_SIZE, que especifica la cantidad máxima de almacenamiento a asignar para los mensajes reenviados.

Cifrado

El cifrado de la comunicación para los puntos finales se codifica para entender la fuente y el destino del tráfico. Si la comunicación se producirá en su totalidad dentro de la instancia SQL Server, el tráfico no está cifrado ya que introduciría una sobrecarga innecesaria en las comunicaciones. Esto es especialmente importante con Service Broker donde muchos mensajes son intercambiados entre las colas en una única instancia. El tráfico es cifrado sólo cuando los datos se transmiten fuera de la instancia de SQL Server.

www.detodoprogramacion.com

Page 278: Microsoft SQL Server 2008 Español - Mike Hotek

264 Parte V Gestión de Base de Datos

Directores, Asegurables y Permisos

Una vez que haya tenido éxito a través de un punto final, la mayor parte de la seguridad con la que va a lidiar gira en torno a los directores, los elementos que pueden protegerse y los permisos. Usted concede permisos desde elementos que pueden protegerse hasta directores.

Los directores

Los directores son el medio por el cual usted se autentica y se identifica dentro de una instancia o base de datos. Los directores se dividen en dos grandes categorías: logins/users y grupos que existen tanto en una instancia como a nivel de base de datos.

Los directores de nivel de instancia

A nivel de instancia, los directores se implementan como logins y roles fijos de servidor. Para acceder a cualquier objeto dentro de una instancia de SQL Server, un usuario debe estar creado dentro de la instancia. Los inicios de sesión en SQL Server 2005 puede ser de cinco tipos diferentes:

 

 

 

 

 

Sesión de SQL Server Estándar

Sesión de Windows

Grupo de Windows

Certificado

Clave asimétrica

Una Sesión de SQL Server Estándar, se crea completamente en SQL Server. El DBA especifica el nombre del inicio de sesión junto con la contraseña. Este inicio de sesión se almacena en la base de datos master y asigna un local SID en SQL Server. A fin de utilizar un inicio de sesión estándar de SQL Server, un usuario o aplicación debe especificar el nombre de usuario y la contraseña para la cuenta.

La sintaxis genérica para la creación de un inicio de sesión es:

CREATE LOGIN loginName { WITH <option_list1> | FROM <sources> } <option_list1> ::=

PASSWORD = { 'password' | hashed_password HASHED } [ MUST_CHANGE ] [ , <option_list2> [ ,... ] ]

<option_list2> ::=

SID = sid | DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language | CHECK_EXPIRATION = { ON | OFF} | CHECK_POLICY = { ON | OFF} | CREDENTIAL = credential_name

www.detodoprogramacion.com

Page 279: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad

<sources> ::= WINDOWS [ WITH <windows_options> [ ,... ] ] | CERTIFICATE certname | ASYMMETRIC KEY asym_key_name

<windows_options> ::=

DEFAULT_DATABASE = database | DEFAULT_LANGUAGE = language

265

Una de las opciones más importantes para un inicio de sesión estándar de SQL Server son las propiedades de una contraseña. La opción CHECK_POLICY controla cómo debe comportarse una contraseña requerida. Cuándo la instancia se ejecuta en Windows 2003 Server o Windows Server 2008, la política de contraseñas de Windows que es eficaz para la máquina se aplica dentro de la instancia. Por ejemplo, si la política de contraseñas de su empresa establece que las mismas deben tener al menos 8 caracteres, contener al menos una letra mayúscula, un número y un carácter especial, entonces usted no permitirá especificar una contraseña para el inicio de sesión que viole esta política.

CHECK_EXPIRATION se utiliza para prevenir los ataques de fuerza bruta contra un inicio de sesión. La mayoría de las políticas de contraseña especifican que tres intentos de conexión fallidos harán que la sesión (login) se bloquee. Si un inicio de sesión estándar de SQL Server cumple la propiedad de bloqueo de contraseña, es controlada por la opción CHECK_EXPIRATION.

Una sesión de SQL Server se puede mapear a un inicio de sesión de Windows. El inicio de sesión de Windows puede ser una cuenta local/dominio o un grupo local/ dominio. Un inicio de sesión de SQL Server creado de esta manera almacenará el SID del inicio de sesión de Windows. Mediante el mapeo de una sesión/grupo de Windows al inicio de sesión de SQL Server, los usuarios o aplicaciones pueden acceder directamente a una instancia de SQL Server con las credenciales utilizadas en Windows para acceder a otros recursos de red.

El uso de grupos de Windows proporciona la mayor flexibilidad para administrar el acceso de seguridad, porque sólo tiene que añadir o quitar cuentas al grupo con el fin de controlar el acceso a una instancia de SQL Server. Un DBA está también aislado de los detalles de personas que entran y salen de la empresa o el traslado a diferentes grupos dentro de una organización. El DBA puede entonces centrarse en la definición de grupos basados en perfiles de permisos y dejar la mecánica de añadir/eliminar cuentas de usuario a los procesos de negocio estándar dentro de su empresa.

Cuando un usuario se conecta ya sea a través de un grupo Windows o un inicio de sesión de Windows, el SID y otros atributos del usuario son validados por SQL Server realizando una llamada a la API de seguridad de Windows. Los usuarios no necesitan tener una contraseña distinta para acceder a un servidor SQL y su información de cuenta se mantiene en una ubicación central.

Un certificado o clave asimétrica se puede crear a nivel de instancia. Sin embargo, un certificado o clave asimétrica no se puede usar para conectarse a una instancia. En cambio, los certificados y las claves asimétricas se utilizan para las estructuras de seguridad internas dentro de la instancia.

Las funciones fijas de servidor son internas a la instancia de SQL Server y proporcionan un medio para agrupar uno o más inicios de sesión bajo una estructura de permisos estandarizada. No se puede crear un rol dentro de una instancia. Los roles de servidor que se suministran con SQL Server se muestran en la Tabla 18-3.

www.detodoprogramacion.com

Page 280: Microsoft SQL Server 2008 Español - Mike Hotek

266 Parte V Gestión de Base de Datos

TABLA 18-3 Roles fijos de servidor

Propósito

Administrar las operaciones de BCP y BULK INSERT

Crear bases de datos

Administrar los recursos de disco

Administrar conexiones e iniciar/detener una instancia

Crear, modificar y eliminar inicios de sesión, pero no puede cambiar las contraseñas. No se puede administrar los inicios de sesión que son miembros del rol sysadmin. Realiza las mismas acciones que diskadmin y processadmin más gestionar endpoints, cambiar la configuración de instancia y cerrar la instancia

Administrar servidores vinculados (linked servers)

Puede realizar cualquier acción dentro de la instancia

Rol

bulkadmin

dbcreator

diskadmin

processadmin

securityadmin

serveradmin

setupadmin

sysadmin

En el siguiente ejercicio, creará un inicio de sesión estándar de SQL Server y un inicio de sesión de SQL Server asignado a un usuario de Windows.

Crear una instancia Principal

1. Haga clic en Inicio, haga clic en Mi PC y seleccione Administrar.

2. Expanda el nodo “Usuarios locales y grupos”, haga clic en la carpeta Usuarios y seleccione Nuevo

Usuario.

3. Especificar TestAccount para el nombre de usuario, especifique una contraseña y deseleccione la opción “El usuario debe cambiar la contraseña en el siguiente inicio de sesión”. Haga clic en Crear, haga clic en Cerrar y cierre el Administrador de PC.

4. Conéctese a la instancia en el Explorador de objetos, expanda el nodo Seguridad, haga clic derecho en Inicios de sesión, y seleccione Nuevo inicio de sesión.

www.detodoprogramacion.com

Page 281: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 267

5. Añada el nombre de usuario de Windows que ha creado como un inicio de sesión a SQL Server.

6. Inspeccione las opciones Roles de servidor, Mapeo de usuario y Estado, para acciones adicionales que puede realizar cuando crea un usuario de sesión, y luego haga clic en Aceptar. 7. Abra una nueva ventana de consulta y ejecute el siguiente código (el código puede encontrarse en el archivo Capítulo 18\ code1.sql):

CREATE LOGIN TestLogin WITH PASSWORD = '<specifystrongpassword>', CHECK_POLICY = ON, CHECK_EXPIRATION = ON

GO

8. Expanda el nodo “Inicios de sesión” y observe las dos cuentas que acaba de crear.

Una cuenta que existe para cada instancia de SQL Server es la cuenta sa. La cuenta sa tiene autoridad sysadmin y no se puede quitar de la instancia. Adicionalmente, como una cuenta administrativa, la cuenta sa no puede ser bloqueada debido a errores repetidos de login. Por lo tanto, la cuenta sa es un blanco perfecto para los atacantes. Afortunadamente, usted puede derrotar los ataques a la cuenta “sa” cambiándole el nombre.

www.detodoprogramacion.com

Page 282: Microsoft SQL Server 2008 Español - Mike Hotek

268 Parte V Gestión de Base de Datos

En el siguiente ejercicio, se le cambia el nombre de la cuenta sa.

Asegure la cuenta sa

1. Haga clic derecho en la cuenta sa en el Explorador de objetos y seleccione Renombrar.

2. Cambie el nombre de la cuenta sa con un nuevo nombre a su elección.

Directores a nivel de bases de datos

Con el fin de acceder a los recursos dentro de una base de datos, el inicio de sesión que es usado por una aplicación o usuario, necesita tener acceso concedido a la base de datos. Para conceder acceso a la base de datos, se agrega el inicio de sesión como un usuario en la base de datos mediante la ejecución del comando CREATE USER que tiene la siguiente sintaxis general:

CREATE USER user_name [ { { FOR | FROM }

{ LOGIN login_name | CERTIFICATE cert_name | ASYMMETRIC KEY

asym_key_name} | WITHOUT LOGIN ]

[ WITH DEFAULT_SCHEMA = schema_name ]

www.detodoprogramacion.com

Page 283: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 269

Al agregar un usuario a una base de datos, el usuario normalmente se mapea a un inicio de sesión (login), a un certificado o a una clave asimétrica. Aunque el nombre del usuario de la base puede diferir del director al que está mapeado, esto normalmente no se hace, con el fin de evitar confusión y facilitar la auto-documentación.

Cada usuario en una base de datos se puede añadir a uno o más roles de base de datos. SQL Server viene con 10 roles de base de datos, como se muestra en la Tabla 18-4. También puede crear sus propios roles dentro de una base de datos.

TABLA 18-4 Roles fijos de base de datos

Propósito

Agregar o eliminar usuarios en la base de datos

Hacer copia de seguridad de la base de datos. No puede restaurar una base de datos o ver cualquier información en la base de datos.

Emitir SELECT contra todas las tablas, vistas y funciones dentro de la base de datos

Emitir INSERT, UPDATE, DELETE, y MERGE contra todas las tablas dentro de

la base de datos. Los miembros de este rol también deben ser miembros del rol db_datareader.

Ejecutar sentencias DDL

Denegar el SELECT contra todas las tablas, vistas y funciones dentro de la base de datos

Denegar INSERT, UPDATE, DELETE, y MERGE contra todas las tablas dentro de la

base de datos

Propietario de la base de datos que tiene el control total sobre la base de datos y todos los objetos contenidos dentro de ella

Administrar la membresía de roles y permisos asociados. No se puede gestionar la membresía para el rol db_owner.

Grupo predeterminado en cada base de datos al que pertenecen todos los usuarios

Rol

db_accessadmin

db_backupoperator

db_datareader

db_datawriter

db_ddladmin

db_denydatareader

db_denydatawriter

db_owner

db_securityadmin

public

Usuarios administrativos

Los usuarios administrativos mantienen un nivel especial de acceso con respecto al alcance del acceso. Los miembros del rol db_owner son los administradores de una bases de datos. Los miembros del rol sysadmin son los administradores de toda la instancia. Dado que los miembros del rol sysadmin controlan toda la instancia completa, todo sysadmin es también un miembro del rol db_owner en cada base de datos en la instancia.

Si desea evitar que otros usuarios puedan realizar una acción, puede de forma explícita, remover su autoridad. No se puede eliminar una autoridad de un administrador. Cuando se hace una conexión a una instancia de SQL Server, se realiza una comprobación para determinar si el inicio de sesión pertenece a cualquiera de los roles del servidor. Si el inicio de sesión pertenece al rol sysadmin, SQL Server detiene el control de todo permiso desde ese momento en adelante. Cuando un usuario cambia de contexto a una base de datos, una vez que SQL Server determina que el inicio de sesión (login) tiene acceso a la base de datos, se realiza una comprobación para la membresía del rol. Si el usuario pertenece al rol db_owner, SQL Server deja de comprobar permisos dentro de la base de datos. No importa qué permisos se han asignado o negado a un miembro del rol de servidor sysadmin o del rol de base de datos db_owner, SQL Server ni siquiera comprueba cualquier permiso que usted pueda tener asignado o denegado.

www.detodoprogramacion.com

Page 284: Microsoft SQL Server 2008 Español - Mike Hotek

270 Parte V Gestión de Base de Datos

En el siguiente ejercicio, agregará los dos inicios de sesión creados previamente a las bases de datos SQL2008SBS y SQL2008SBSFS.

Crear un Director de Base de Datos

1. Expanda el nodo Seguridad debajo de la base de datos SQL2008SBS, haga clic derecho en Carpeta de usuarios y seleccione Nuevo usuario.

2. Añada el login TestLogin, especifique dbo como el esquema predeterminado, y no especifique ningún esquema de propiedad o pertenencia a roles de base de datos.

3. Revise las opciones disponibles para las opciones “Asegurables” y ”Propiedades extendidas” y a continuación, haga clic en Aceptar.

4. Abra una ventana de consulta y ejecute el siguiente código (el código puede encontrarse en el Archivo Capítulo 18\ code1.sql):

USE SQL2008SBSFS GO CREATE USER TestLogin FOR LOGIN TestLogin GO

www.detodoprogramacion.com

Page 285: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 271

5. Haga clic derecho en el login de SQL Server mapeado al usuario de Windows TestAccount que

agregó debajo de la carpeta Logins del nodo Seguridad y seleccione Propiedades.

6. Seleccione la opción “Mapeo de usuarios”, agregue el usuario a las bases de datos SQL2008SBS y SQL2008SBSFS , como se muestra a continuación y haga clic en Aceptar.

7. Examine la carpeta Users bajo las bases de datos SQL2008SBS y SQL2008SBSFS.

Aunque la mayoría de los usuarios de bases de datos están vinculados a un inicio de sesión con el fin de proporcionar acceso a una base de datos, usted no tiene que vincular un usuario de base de datos a un inicio de sesión. Un usuario sin un login, es un usuario en la base de datos que no está asociado a un inicio de sesión (login).

Un requisito común dentro de una compañía es que los usuarios tengan acceso a una base de datos a través

una aplicación específica, mientras que no tienen acceso sin la aplicación. El propósito de un usuario “loginless” es permitir el acceso a una base de datos para una aplicación. Los usuarios aún se autentican a la instancia utilizando sus propias credenciales. Con el fin de acceder a los recursos de base de datos, la aplicación ejecuta código para suplantar al usuario loginless.

www.detodoprogramacion.com

Page 286: Microsoft SQL Server 2008 Español - Mike Hotek

272 Parte V Gestión de Base de Datos

Crear un usuario Loginless (sin login)

1. Ejecutar el código siguiente en la base de datos SQL2008SBS (el código puede encontrarse en el Archivo Capítulo 18\ code1.sql):

CREATE USER TestUser WITHOUT LOGIN GO

La infraestructura de seguridad en los sistemas operativos ha evolucionado en los últimos años en términos de

estructuras de seguridad basadas en los comentarios de los usuarios para la usabilidad y facilidad de mantenimiento. En lugar de gestionar permisos para cada cuenta, todos los sistemas operativos modernos permiten definir grupos de usuarios que tienen todos los mismos permisos. Lo que todos los administradores de sistemas tienen que hacer es la gestión de los miembros de un grupo en lugar de los potencialmente cientos o miles de permisos individuales.

SQL Server utiliza los mismos principios de seguridad de gestión que los administradores han aplicado al dominios de Windows, proporcionando la capacidad para crear roles de base de datos. Un rol de base de datos es un “principal” o “director” dentro de la base de datos que contiene uno o más usuarios de base de datos. Se le asignan permisos a los roles de la base de datos. Aunque puede asignar permisos directamente a un usuario, se recomienda que cree roles de base de datos, agregue usuarios a un rol, y a continuación, le conceda los permisos al grupo.

En el siguiente ejercicio, creará un rol de base que le permitirá a los usuarios a enviar una orden de pedido.

www.detodoprogramacion.com

Page 287: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 273

Creación de un rol de base de datos

1. Ejecute el siguiente código en la base de datos SQL2008SBS (el código puede encontrarse en

el archivo Capítulo 18\code1.sql):

CREATE ROLE SubmitOrdersRole AUTHORIZATION dbo GO

Suplantación de identidad (Impersonation)

SQL Server le permite suplantar a otro director o principal para ejecutar comandos bajo un contexto de usuario específico. Para poder hacerse pasar por otra entidad, debe tener otorgado el permiso IMPERSONATE a su cuenta sobre el “principal” que desea suplantar. Si el permiso IMPERSONATE está asigna a un inicio de sesión (login), puede hacerse pasar por el usuario y ejecutar en virtud de esa autoridad en cualquier base de datos que el director tenga acceso. Si el permiso IMPERSONATE es asignado a un usuario de base de datos, puede ejecutar bajo el contexto del usuario, sólo dentro de esa base de datos.

La suplantación se realiza usando la sentencia EXECUTE AS, como sigue:

{ EXEC | EXECUTE ] AS <context_specification> <context_specification>::= { LOGIN | USER } = 'name'

[ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ] | CALLER

Elementos que pueden protegerse (Securables)

“Securables” son los objetos a los que se conceden permisos. Usted, dentro de este libro, ya ha tratado con muchos elementos diferentes que pueden protegerse. Los “securables” existen en todos los niveles dentro de SQL Server, incluyendo la propia instancia. Puede conceder permisos en la instancia y puntos finales (endpoints). Usted también puede conceder permisos en una base de datos y cualquier objeto dentro de ella.

Esquemas

Todos los objetos creados dentro de una base de datos en última instancia deben ser propiedad de un usuario en la base de datos. Los esquemas proporcionan una capa de separación entre el usuario de base de datos y los objetos dentro de la misma. Los usuarios de bases de datos sondueño de un esquema y los esquemas son dueños de los objetos.

Si los usuarios de bases de datos poseen directamente los objetos, no sería posible eliminar un usuario, a menos los objetos fueran reasignados a otro dueño. La reasignación de un objeto a un propietario cambiaría el nombre del objeto. Mediante la introducción de un esquema entre los usuarios y los objetos, un usuario puede ser eliminado de la base de datos sin afectar el nombre de un objeto o aplicaciones que impactan.

www.detodoprogramacion.com

Page 288: Microsoft SQL Server 2008 Español - Mike Hotek

274 Parte V Gestión de Base de Datos

Los permisos se conceden tanto a “securables” como a “principals”. Ya hemos hablado de los principales disponibles en SQL Server 2008: inicios de sesión (logins), usuarios de bases de datos, roles, certificados y claves asimétricas. Además de tener uno o más propietarios, un esquema es un objeto que puede protegerse (securable). Esto le permite agrupar varios objetos en un esquema y después, conceder permisos a un “principal” en el esquema. Con la concesión de permisos en el esquema, el “principal” se beneficia de los permisos de todos los objetos que son propiedad del esquema.

Permisos

Los permisos proporcionan la autoridad para que los directores realicen acciones dentro de una instancia o base de datos. Cada declaración que se puede ejecutar tiene un permiso correspondiente. Algunos permisos son evidentes en su relación como permisos SELECT, INSERT, UPDATE y DELETE.

Alcance del Permiso

Antes de SQL Server 2005, la base de datos definía un enorme contenedor de objetos y los permisos eran concedidos entonces directamente a los objetos. SQL Server 2008 define múltiples

alcances que se pueden asignar a los permisos lo que hará que los administradores de bases re-evalúen cómo se construyen las bases de datos.

Los permisos se conceden a un asegurable. Un asegurable puede ser una base de datos, un esquema o un objeto. Esto crea una estructura jerárquica de permisos dentro de una base de datos. La concesión de permisos a una base de datos hace que los permisos se otorguen implícitamente a todos los esquemas. Conceder permisos en un esquema hace que los permisos sean implícitamente concedidos a todos los objetos dentro de un esquema.

El primer nivel de seguridad que usted tendrá que planificar en una base de datos es un esquema. Cada esquema debería representar una agrupación funcional dentro de una aplicación. Los objetos son entonces creados dentro de cada esquema. Una vez que los objetos se crean en los esquemas, los permisos se conceden sobre los esquemas a fin de proporcionar seguridad de acceso a una aplicación.

Por ejemplo, si desea conceder permisos SELECT, INSERT, UPDATE y DELETE en todas las tablas y vistas dentro de una base de datos, se puede realizar la asignación de tres maneras diferentes:

 

 

 

Conceder permisos sobre cada tabla y vista de forma individual

Conceder permisos sobre cada esquema dentro de la base de datos

Conceder permisos sobre la base de datos

www.detodoprogramacion.com

Page 289: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 275

Los permisos que se pueden otorgar son los siguientes:

 

 

 

 

 

 

SELECT capacidad de emitir una declaración SELECT contra un elemento que puede asegurarse

INSERT posibilidad de insertar datos en una tabla o vista

UPDATE capacidad de actualizar los datos de una tabla o vista

DELETE capacidad de eliminar datos de una tabla o vista

EXECUTE capacidad para ejecutar un procedimiento almacenado

REFERENCES capacidad de emitir una declaración SELECT contra una tabla hija con el fin de

verificar una clave externa

CONTROL control total sobre el objeto  

 

 

 

ALTER capacidad de modificar o eliminar un objeto

VIEW DEFINITION capacidad para ver la definición de un objeto

TAKE OWNERSHIP capacidad para hacerse cargo de la propiedad de un objeto

En el siguiente ejercicio, creará un procedimiento para insertar una orden, conceder la autoridad para ejecutar el procedimiento a los miembros de la SubmitOrdersRole, y luego hacerse pasar por un usuario para probar si la seguridad está funcionando correctamente.

Conceder permisos en objetos

1. Ejecute el siguiente código para crear un procedimiento almacenado para enviar órdenes (el código se puede encontrar en el archivo Capítulo 18\code1.sql):

CREATE PROCEDURE Customers.asp_submitorder @CustomerID INT, @SKU CHAR(10),

@Quantity INT AS DECLARE @OrderID INT BEGIN TRY

BEGIN TRANSACTION INSERT INTO Orders.OrderHeader (CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount) SELECT @CustomerID, GETDATE(), @Quantity * UnitPrice, 0, 5.00 FROM Products.ProductOptions WHERE SKU = @SKU SET @OrderID = SCOPE_IDENTITY() INSERT INTO Orders.OrderDetail (OrderID, SKU, Quantity, UnitPrice) SELECT @OrderID, @SKU, @Quantity, UnitPrice FROM Products.ProductOptions WHERE SKU = @SKU

END TRY

www.detodoprogramacion.com

Page 290: Microsoft SQL Server 2008 Español - Mike Hotek

276 Parte V Gestión de Base de Datos

BEGIN CATCH ROLLBACK TRANSACTION

END CATCH COMMIT TRANSACTION

GO --Test the procedure EXEC Customers.asp_submitorder 1, '1-2RB1-4RO', 5 SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount,

GrandTotal, FinalShipDate FROM Orders.OrderHeader SELECT OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate FROM Orders.OrderDetail GO

2. Ejecute el siguiente código para conceder permisos de ejecución sobre el procedimiento de envío de órdenes (el código puede encontrarse en el archivo Capítulo 18\ code1.sql):

GRANT EXECUTE ON Customers.asp_submitorder TO SubmitOrdersRole

3. Haga clic derecho en SubmitOrdersRole y seleccione Propiedades.

4. Haga clic en Agregar, haga clic en Examinar, seleccione TestUser, y a continuación, haga clic en Aceptar dos veces para cerrar la ventana de diálogo “Propiedades de rol de base de datos”.

www.detodoprogramacion.com

Page 291: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 277

5. Pruebe de nuevo el procedimiento almacenado bajo la cuenta TestUser y compruebe que puede

ejecutar el procedimiento almacenado, pero no puede emitir una sentencia SELECT contra las tablas (el código se puede encontrar en el archivo Capítulo 18\code1.sql):

--Impersonate TestUser and test the procedure again SELECT USER_NAME() GO EXECUTE AS USER = 'TestUser' GO SELECT USER_NAME() GO EXEC Customers.asp_submitorder 1, '1-2RB1-4RO', 5 GO SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount,

GrandTotal, FinalShipDate FROM Orders.OrderHeader SELECT OrderDetailID, OrderID, SKU, Quantity, UnitPrice, ShipDate FROM Orders.OrderDetail GO --Revert user context back to dbo REVERT GO

Cadenas de propiedad (de objeto)

Cada objeto dentro de una base de datos tiene un propietario asociado a él. Las vistas, los procedimientos almacenados, los triggers, y las funciones pueden hacer referencia a otros objetos en una base de datos. El propietario de cada objeto que se referencia dentro de un trigger, vista, función o procedimiento almacenado junto con el titular del objeto forman una cadena de propiedad. Siempre y cuando el propietario del objeto, y cualesquiera de los otros objetos que hace referencia, tienen el mismo propietario, usted tiene una “cadena de propiedad intacta”. Con una cadena de propiedad intacta, sólo tiene que tener permisos en el objeto de nivel superior dentro de la cadena para acceder a cualquiera de los objetos posteriormente accedidos. SQL Server sólo comprueba permisos en el objeto de nivel superior y renuncia a la comprobación de permisos, siempre que el objeto propietario no cambie dentro de una cadena de llamada.

La cadena de propiedad le permite ejecutar con éxito el procedimiento asp_submitorder sin tener el permiso para leer o escribir en las tablas que se hace referencia en el procedimiento. Mediante el aprovechamiento de las capacidades de los procedimientos almacenados, es posible permitir a los usuarios manipular los datos dentro de la base de datos, bajo el control de un procedimiento almacenado, mientras que no se es capaz de acceder a los datos de cualquier otra manera.

Seguridad sobre Metadatos

El conocimiento de un sistema es un factor importante en el intento de obtener acceso a una base de datos. Una de las más simples barreras que se puede construir es ocultar la presencia de objetos. En SQL

www.detodoprogramacion.com

Page 292: Microsoft SQL Server 2008 Español - Mike Hotek

278 Parte V Gestión de Base de Datos

Server 2000 y anteriores, cualquier persona que tenga acceso a una instancia podía interrogar al catalogo del sistema y recibir una lista de cada base de datos en una instancia. Una vez que se accedía a una base de datos, todos los objetos dentro de la misma se pueden recuperar. Al exponer la existencia de los objetos a todo el mundo, SQL Server hace que sea mucho más fácil para un atacante encontrar objetos para atacar.

Incluso más importante que ser capaz de recuperar una lista de todos los objetos dentro de una base de datos que puede acceder, podría recuperar la definición de cada objeto. Por ejemplo, si usted tuviera la autoridad para ejecutar un procedimiento almacenado, también tenía la autoridad para ver el código dentro de el procedimiento almacenado.

SQL Server 2008 implementa una capa de seguridad sobre todos los metadatos de una instancia. Metadata Security es muy simple: Si usted no tiene acceso a ella, no la ve.

En el siguiente ejercicio, verá los permisos para la cuenta TestLogin y concederá la autoridad para emitir un SELECT en todas las tablas de la base de datos. A continuación, se eliminará la capacidad para encontrar cualquier objeto dentro de una base de datos, mientra que al mismo tiempo conservará la capacidad de recuperar los datos necesarios.

Conceder permisos en objetos

1. Ejecute el siguiente código en la base de datos SQL2008SBS para verificar que TestLogin

no tiene acceso a ningún objeto y también no puede ver ningún objeto (el código puede encontrarse en el archivo Capítulo 18\code1.sql):

SELECT * FROM sys.objects GO EXECUTE AS USER = 'TestLogin' GO SELECT * FROM sys.objects GO SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount,

GrandTotal, FinalShipDate FROM Orders.OrderHeader GO REVERT GO

2. Ejecute el siguiente código para conceder permisos SELECT en la base de datos (el código se puede

encontrar en el archivo Capítulo 18\code1.sql):

GRANT SELECT ON DATABASE::SQL2008SBS TO TestLogin GO

3. Compruebe que TestLogin puede recuperar datos de cualquier tabla y que el login puede ver todas las tablas dentro de la base de datos (el código puede encontrarse en el archivo Capítulo 18\code1.sql):

EXECUTE AS USER = 'TestLogin' GO SELECT * FROM sys.objects GO

www.detodoprogramacion.com

Page 293: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad

SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, GrandTotal, FinalShipDate

FROM Orders.OrderHeader GO REVERT GO

279

4. Retírele la capacidad a TestLogin para ver la definición de los objetos dentro de la base de datos

mediante la ejecución del siguiente código (el código puede encontrarse en el archivo Capítulo 18\ code1.sql):

DENY VIEW DEFINITION ON DATABASE::SQL2008SBS TO TestLogin GO

5. Compruebe que aunque TestLogin no puede ver los objetos dentro de la base de datos, todavía puede emitir un SELECT contra cualquier tabla en la base de datos (el código puede encontrarse en el archivo Capítulo 18\ code1.sql):

EXECUTE AS USER = 'TestLogin' GO SELECT * FROM sys.objects GO SELECT OrderID, CustomerID, OrderDate, SubTotal, TaxAmount, ShippingAmount, GrandTotal, FinalShipDate FROM Orders.OrderHeader GO REVERT GO

Seguridad CLR

La primera capa de seguridad para el subsistema Common Language Runtime (CLR) es si este está habilitado o deshabilitado.

Los objetos que se pueden escribir utilizando. NET son triggers, funciones, procedimientos almacenados, agregados y tipos de datos. El código se compila en un ensamblado, . DLL, que luego es cargado en la instancia de SQL Server por un miembro del rol sysadmin.

Los assemblies . NET utilizan “Seguridad de Acceso al Código” (CAS) para restringir el conjunto permitido de operaciones que se pueden realizar. SQL Server también utiliza la “Seguridad de acceso al código” para bloquear el código administrado y garantizar la integridad del servidor de base de datos y el sistema operativo.

Cuando crea el assembly el sysadmin especifica el nivel de “seguridad de acceso a código” que se aplica al assembly. Los permisos de acceso disponibles para assemblies son SAFE, EXTERNAL_ACCESS y UNSAFE. SAFE es el conjunto de permisos por defecto y no permite acceso a los recursos externos a la instancia de SQL Server o a cualquier recurso de la máquina. EXTERNAL_ACCESS le permite a un assembly acceder a recursos externos a las instancias de SQL Server tales como archivos, recursos compartidos y recursos de red. El acceso UNSAFE le permite al assembly

realizar cualquier operación y acceder a cualquier recurso. Ejecutar assemblies en modo no seguro está totalmente desaconsejado.

www.detodoprogramacion.com

Page 294: Microsoft SQL Server 2008 Español - Mike Hotek

280 Parte V Gestión de Base de Datos

La ejecución de código en assemblies establecidos en los modos EXTERNAL_ACCESS o UNSAFE requiere que un DBA asegure que los assemblies cumplen varios requisitos y que se establecen varios permisos. Los assemblies deben ser “fuertemente tipados”, el código firmado con un certificado y dicho certificado tiene que haber sido mapeado a un login de SQL Server. El login creado debe tener permisos para ejecutar assemblies en cualquiera de los modos EXTERNAL_ACCESS o UNSAFE. Además, el propietario de la base también debe tener permisos para ejecutar ensamblados en cualquiera de los modos EXTERNAL_ACCESS o UNSAFE con la opción de base de datos TRUSTWORTHY (digno de confianza) activada.

SQL Server es seguro en la implementación. Con el fin de ejecutar código que podría ser potencialmente dañino o tener permisos elevados, tendrá que cumplir un número importante de requisitos. Usted no puede accidentalmente ejecutar ensamblados CLR en modo EXTERNAL_ACCESS o UNSAFE.

Cifrado de datos

Los datos que necesitan mantener confidencialidad dentro de la base de datos deben ser cifrados. Ejemplos de información confidencial son los números de tarjetas de crédito y los salarios de los empleados.

Los datos que estén cifrados dentro de las columnas no se puede leer sin tener las credenciales adecuadas. Una vez que los datos de una columna están cifrados, la columna ya no puede ser utilizada en los argumentos de búsqueda.

Las columnas pueden ser encriptadas usando una frase de contraseña, clave simétrica, clave asimétrica, o un certificado. Las claves simétricas proporcionan un cifrado razonablemente seguro al tiempo que proporciona el mejor rendimiento posible.

Evitar el acceso a los objetos y datos

Asegurar una base de datos no es un ejercicio para garantizar que no se pueden acceder a los objetos. Si un activo tiene valor suficiente y suficiente tiempo disponible, un atacante siempre podrá entrar. La seguridad es un ejercicio para hacer un sistema que sea más difícil entrar que la recompensa que se ganaría en el intento.

Además, los administradores tienen control total sobre un sistema por una razón: proporcionar la autoridad para administrar un sistema. Los permisos no se comprueban para un usuario con acceso administrativo, por lo que no puede restringir las acciones que un administrador puede tomar. Un administrador tiene acceso a las estructuras internas necesarias para recuperar también las claves de cifrado que pueden estar en uso. Por lo tanto, es imposible impedir el acceso de un administrador. SQL Server tiene una gran infraestructura de seguridad de múltiples capas, no es un sistema gestión de derechos digitales.

Asegurar objetos también reducirá la funcionalidad disponible para esos objetos. En particular, una columna cifrada no puede ser indexada y no se puede buscar en el contenido de una columna cifrada. Una de los más tontos artículos publicados que he encontrado explica cómo se puede buscar en una columna cifrada.

www.detodoprogramacion.com

Page 295: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 281

La solución a este problema consistía en colocar una columna en la tabla que contenía los datos sin cifrar para que usted pueda buscar en la columna mientras también conserva la columna encriptada. Si usted va a almacenar los datos en un formato sin cifrar, es inútil también encriptar los datos, especialmente dentro de la misma tabla. Además, tan pronto como usted permite a un usuario buscar en los datos cifrados, acaba de habilitar a un atacante para hacer ataques de diccionario muy simples y realizar la ingeniería inversa de su información encriptada.

Claves Maestras

Las claves maestras constituyen la base de la jerarquía de cifrado en SQL Server. Usted puede tener una única clave maestra de servicio para toda la instancia junto con una clave maestra de base de datos dentro de cada base de datos.

Clave maestra de servicio

La raíz de la jerarquía de cifrado es la clave maestra de servicio. La clave maestra de servicio es generada automáticamente la primera vez que una credencial debe ser cifrada. Las claves maestras de servicio se derivan de las credenciales de Windows de la cuenta de servicio de SQL Server y son cifradas con la clave del equipo local mediante la API de protección de datos de Windows.

El proceso de generación y cifrado asegura que la clave maestra de servicio sólo puede ser descifrada por la cuenta de servicio en la que se creó o por un “principal” con acceso a las credenciales de cuenta de servicio. Dado que la clave maestra de servicio es la raíz de la jerarquía de encriptación, si tuviera que restaurar una base de datos que contiene los datos cifrados, los datos no podrían ser descifrados a menos que también tuviera acceso a la clave maestra de servicio de la instancia donde la copia de seguridad fue creada.

Clave maestra de base de datos

La siguiente capa en la jerarquía de cifrado es la clave maestra de base de datos. Una clave maestra de base de datos debe ser explícitamente generada con el siguiente comando:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'

Cada base de datos tiene una clave maestra diferente, asegurando que un usuario con acceso a descifrar los datos en una base de datos no pueda también descifrar los datos en otra base de datos sin haber recibido la autorización para hacerlo.

La clave maestra de base de datos se utiliza para proteger los certificados, las claves simétricas, o claves asimétricas que se almacenan dentro de una base de datos. La clave maestra de base de datos se cifra usando “Triple DES” y la contraseña proporcionada por el usuario. Una copia de la clave maestra de base de datos es también encriptada usando la clave maestra de servicio, de tal manera que el descifrado automático se puede lograr dentro de la instancia.

www.detodoprogramacion.com

Page 296: Microsoft SQL Server 2008 Español - Mike Hotek

282 Parte V Gestión de Base de Datos

Cuando usted hace una petición para descifrar los datos, la clave maestra de servicio se utiliza para descifrar la clave maestra de base de datos, que esta última a su vez se utiliza para descifrar un certificado, clave simétrica, o clave asimétrica, que se utiliza para descifrar los datos.

La razón por la que esta jerarquía es importante, es que usted debe tener cuidado al mover las copias de seguridad que contiene datos cifrados entre instancias de SQL Server. Con el fin de restaurar correctamente y ser capaz de descifrar los datos, también debe realizar copias de seguridad de la clave maestra de base de datos y volver a generar la clave maestra de base de datos en la otra instancia. Para llevar a cabo este proceso, usted necesitaría utilizar los comandos OPEN MASTER KEY, BACKUP MASTER KEY, RESTORE MASTER KEY, y CLOSE MASTER KEY.

Algoritmos hash

Hay dos formas de algoritmos de encriptación: un solo sentido (one-way) y de doble vía (two-way). Los algoritmos de dos vías le permiten cifrar y descifrar datos. Los algoritmos de un sentido sólo encriptan datos sin cualquier posibilidad de descifrar.

Un algoritmo de hash es la forma más sencilla para encriptar datos, sin embargo, una vez cifrada, no puede

descifrar los datos. Sus datos permanecen seguros, asegurando que con el objetivo de "descifrar" el contenido

de una columna, primero tendría que saber el valor de datos original.

Los algoritmos hash se utilizan en una variedad de lugares, por ejemplo, para cifrar las contraseñas que especifica para los logins de SQL Server estándar. Cuando se crea un login SQL Server estándar, SQL Server utiliza un algoritmo MD5 para cifrar los datos y almacena el “hash” dentro de la base de datos master. Cuando se conecta a una instancia, a la contraseña que especifique se le aplica un algoritmo hash y los dos “hashes” se comparan. Si los “hashes” coinciden, la contraseña es correcta y usted tiene permiso para conectarse a la instancia de SQL Server.

Los algoritmos hash producirán siempre el mismo valor hash para los mismos datos de entrada. No importa si a los datos se les aplicara un algoritmo hash en una aplicación Java que se ejecuta en Unix y luego sean comparados con los mismos datos hash dentro de una aplicación. NET que se ejecuta en Windows. Mientras se utilice el mismo algoritmo hash, usted recibirá una coincidencia en la comparación de los valores hash.

Como se ha señalado en varias ocasiones, la comprensión de las limitaciones de una característica o tecnología es tan importante como la comprensión de cómo la característica/tecnología funciona. Esto es especialmente cierto para la seguridad.

Aunque un algoritmo hash tiene la ventaja de la simplicidad, no es adecuado para cifrar todas las aplicaciones. Mientras el intervalo de valores posibles a ser encriptada es suficientemente grande como para evitar ataques de fuerza bruta y usted no necesita descifrar los datos, un algoritmo de hash es una buena opción. Los algoritmos hash son decisiones extremadamente malas para cifrar datos tales como salarios, números de tarjetas de crédito y fechas de nacimiento.

En el siguiente ejercicio, trabajará con los resultados de un algoritmo de hash. También construirá una rutina para traspasar una tabla de salarios para demostrar la facilidad con la que un algoritmo de hash puede ser “craqueado” cuando el rango de valores posibles es pequeño.

www.detodoprogramacion.com

Page 297: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 283

Datos hash

1. Ejecutar el siguiente código y observe los resultados (el código puede encontrarse en el archivo

Capítulo 18\ code2.sql):

--Different hash algorithms produce different hash values DECLARE @HashValue varchar(100) SELECT @HashValue = 'SQL Server' SELECT HashBytes('MD5', @HashValue) SELECT @HashValue = 'SQL Server' SELECT HashBytes('SHA1', @HashValue) GO --Hash values are case sensitive DECLARE @HashValue varchar(100) SELECT @HashValue = 'sql' SELECT HashBytes('SHA1', @HashValue) SELECT @HashValue = 'SQL' SELECT HashBytes('SHA1', @HashValue) GO

2. Ejecute el siguiente código y observe los resultados (el código puede encontrarse en el archivo

Capítulo 18\ code2.sql):

CREATE TABLE SalaryHashes (Salary INT NOT NULL, MD2Hash VARBINARY(500) NOT NULL, MD4Hash VARBINARY(500) NOT NULL, MD5Hash VARBINARY(500) NOT NULL, SHAHash VARBINARY(500) NOT NULL, SHA1Hash VARBINARY(500) NOT NULL) DECLARE @salary INT,

@salarylimit INT SET @salary = 10000 SET @salarylimit = 300000 WHILE @salary <= @salarylimit BEGIN

INSERT INTO SalaryHashes (Salary, MD2Hash, MD4Hash, MD5Hash, SHAHash, SHA1Hash) SELECT @salary, Hashbytes('MD2',cast(@salary as varchar(6))),

Hashbytes('MD4',cast(@salary as varchar(6))), Hashbytes('MD5',cast(@salary as varchar(6))), Hashbytes('SHA',cast(@salary as varchar(6))), Hashbytes('SHA1',cast(@salary as varchar(6)))

SET @salary = @salary + 10 END SELECT Salary, MD2Hash, MD4Hash, MD5Hash, SHAHash, SHA1Hash FROM SalaryHashes GO

www.detodoprogramacion.com

Page 298: Microsoft SQL Server 2008 Español - Mike Hotek

284 Parte V Gestión de Base de Datos

(*) Salting a hash

Aunque un algoritmo de hash es muy fácil de vencer cuando el rango de valores posibles es razonablemente pequeño, aún es posible utilizar un algoritmo hash en estos casos. El dato que se almacena es el valor hash de los datos de entrada. Usted no está obligado a aplicar el hash sólo a los datos que fueron enviados por una aplicación.

La forma más sencilla de aumentar la eficacia de un algoritmo de hash es añadir un valor a los datos antes que se le aplique el hash. Incluso un solo carácter aumenta la complejidad de romper algo tan simple como los datos de salarios en varios órdenes de magnitud. El proceso de añadir datos estáticos a un valor previo al hash se llama "salado". No obstante, usted todavía tiene que proteger a la rutina que proporciona el valor de “la sal” para que un atacante no pueda encontrar ese valor. (*) En criptografía un "salt" es un dato aleatorio que se usa como INPUT adicional en la función de hash.

Claves simétricas

Las claves simétricas utilizan una única clave para el cifrado y descifrado. Debido a que sólo una única clave se necesita para cifrar y descifrar datos, el cifrado de clave simétrica no es tan fuerte como el de clave asimétrica o el cifrado basado en certificados. Sin embargo, las claves simétricas proporcionan el mejor rendimiento posible para el uso de rutina de cifrados de datos.

Cifrar datos con una clave simétrica

1. Ejecute el siguiente código y observe los resultados (el código puede encontrarse en el archivo

Capítulo 18\ code2.sql):

--Symmetric keys CREATE SYMMETRIC KEY MySymmetricKey WITH ALGORITHM = RC4 ENCRYPTION BY PASSWORD = '<InsertStrongPassword>' GO SELECT * FROM sys.symmetric_keys GO CREATE TABLE SymmetricKeyDemo (ID int IDENTITY(1,1), PlainText varchar(30) NOT NULL, EncryptedText varbinary(80) NOT NULL) GO --Symmetric key must be opened before being used OPEN SYMMETRIC KEY MySymmetricKey DECRYPTION BY PASSWORD = '<InsertStrongPassword>' GO INSERT INTO SymmetricKeyDemo (PlainText, EncryptedText)

www.detodoprogramacion.com

Page 299: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad

VALUES('SQL Server', EncryptByKey(Key_GUID('MySymmetricKey'),'SQL Server')) GO SELECT ID, PlainText, EncryptedText, cast(DecryptByKey(EncryptedText) AS varchar(30)) FROM SymmetricKeyDemo GO CLOSE SYMMETRIC KEY MySymmetricKey GO

285

Certificados y claves asimétricas

Los certificados y las claves asimétricas son esencialmente equivalentes dentro de una infraestructura de cifrado. Ambos, cumplen con el estándar X.509. La principal diferencia es que el certificado es más portátil, ya que puede hacer copias de seguridad a un archivo y restaurarlo desde este último.

Claves asimétricas

Las claves asimétricas utilizan un sistema de clave pública y privada. Los datos se cifran con la clave privada. A cualquier director (principal), presentando la clave pública del par, se le permite descifrar los datos. Las claves asimétricas proporcionan el mayor nivel de cifrado que está disponible, pero es muy intensivo en recursos.

Las claves asimétricas se pueden usar para cifrar directamente los datos. Las claves asimétricas también se pueden utilizar para cifrar las claves simétricas.

Certificados

Un certificado de clave pública es un instrumento firmado digitalmente que enlaza la clave pública a una identidad. Esto podría ser una persona, organización, o máquina que controla la clave privada correspondiente. Un certificado es normalmente emitido por una autoridad de certificación (CA) que acredite la identidad de la entidad titular del certificado.

Las páginas web seguras, las conexiones HTTPS, garantizan que la conexión es segura mediante el uso de un certificado instalado en el servidor Web. Este certificado garantiza que la conexión es segura con todas las comunicaciones siendo encriptadas, así como la validación de la identidad de la entidad que presenta el certificado.

Además de la obtención de un certificado de clave pública, también es posible crear un certificado auto-firmado. Los certificados autofirmados le permiten a un DBA generar su propio certificado para una base de datos sin necesidad de obtener un certificado público de una autoridad. Los certificados aún siguen los estándares de publicación, pero no se puede utilizar de la misma manera que los certificados expedidos por una autoridad de certificación.

Para crear un certificado autofirmado en el servidor SQL, debe utilizar el siguiente comando:

CREATE CERTIFICATE certificate_name [ AUTHORIZATION user_name ] { FROM <existing_keys> | <generate_new_keys> } [ ACTIVE FOR BEGIN_DIALOG = { ON | OFF } ]

www.detodoprogramacion.com

Page 300: Microsoft SQL Server 2008 Español - Mike Hotek

286 Parte V Gestión de Base de Datos

<existing_keys> ::= ASSEMBLY assembly_name | {

[ EXECUTABLE ] FILE = 'path_to_file' [ WITH PRIVATE KEY ( <private_key_options> ) ] }

<generate_new_keys> ::=

[ ENCRYPTION BY PASSWORD = 'password'] WITH SUBJECT = 'certificate_subject_name' [ , <date_options> [ ,...n ] ]

<private_key_options> ::=

FILE = 'path_to_private_key' [ , DECRYPTION BY PASSWORD = 'password' ] [ , ENCRYPTION BY PASSWORD = 'password' ]

<date_options> ::=

START_DATE = 'mm/dd/yyyy' | EXPIRY_DATE = 'mm/dd/yyyy'

Una vez creado el certificado autofirmado se puede utilizar para cifrar datos o una clave simétrica.

Cifrado de datos con un certificado

1. Ejecute el siguiente código y observe los resultados (el código puede encontrarse en el archivo Capítulo 18\ code2.sql):

--Certificates CREATE TABLE CertificateDemo (ID int IDENTITY(1,1), PlainText varchar(30) NOT NULL, EncryptedText varbinary(500) NOT NULL) GO CREATE CERTIFICATE MyCert AUTHORIZATION dbo

WITH SUBJECT = 'Test certificate' GO SELECT * FROM sys.certificates GO INSERT INTO CertificateDemo (PlainText, EncryptedText) VALUES('SQL Server',EncryptByCert(Cert_ID('MyCert'), 'SQL Server')) GO SELECT ID, PlainText, EncryptedText, CAST(DecryptByCert(Cert_Id('MyCert'),

EncryptedText) AS varchar(max)) FROM CertificateDemo GO

Cifrado de datos transparente

Aunque puede cifrar los datos dentro de columnas selectivas en una tabla, emplear cifrado a través de la base de datos completa es en general prohibitivo para satisfacer las necesidades del negocio.

www.detodoprogramacion.com

Page 301: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 18 Seguridad 287

Incluso si usted ha cifrado los datos, un atacante que pudo robar sus copias de seguridad o los archivos de datos o de registro fuera de un disco, aún puede acceder a la definición de los objetos que podrían revelar secretos comerciales.

Para evitar el robo de datos que reside en un disco o en una copia de seguridad, SQL Server 2008 introduce Cifrado de datos transparente (TDE - Transparent Data Encryption). TDE proporciona servicios de cifrado y descifrado en tiempo real de modo que todo el contenido de una base de datos permanece cifrado en un disco o en una copia de seguridad sin afectar a las aplicaciones existentes.

TDE trabaja usando una clave de cifrado almacenada en el registro de arranque de bases de datos. La clave TDE se cifra mediante un certificado en la base de datos master. En el caso de que un atacante robe sus “datos/archivos de registro”, o más probablemente una copia de seguridad de su base de datos, el contenido de la base de datos no se puede acceder sin el certificado almacenado en la base de datos master.

En el siguiente ejercicio, habilitará TDE para la base de datos SQL2008SBS.

Configurar el cifrado de datos transparente

1. Ejecute el siguiente código para habilitar TDE en la base de datos SQL2008SBS (el código puede encontrarse en el archivo Capítulo 18\code2.sql):

--Transparent data encryption USE master GO CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<InsertStrongPassword>'; GO CREATE CERTIFICATE MyServerCert WITH SUBJECT = 'TDE Certificate' GO USE SQL2008SBS GO CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_128 ENCRYPTION BY SERVER CERTIFICATE MyServerCert GO ALTER DATABASE SQL2008SBS SET ENCRYPTION ON GO

Administración de claves de cifrado

Aunque SQL Server proporciona una variedad de métodos de cifrado, cada método debe ser activado y gestionado dentro de una instancia. SQL Server 2008 proporciona la capacidad a través de “Administración de claves extensible (EKM - Extensible Key Management) integrarse con “Sistemas empresariales de gestión de claves” (enterprise key management systems). Las claves se pueden mantener en un lugar central dentro de una empresa y exportarse para su uso dentro de SQL Server. Al registrar un proveedor de gestión de claves para SQL Server, una instancia puede tomar ventaja de todas las características avanzadas de las soluciones de gestión de claves de hardware y software, tales como “rotación de clave”.

www.detodoprogramacion.com

Page 302: Microsoft SQL Server 2008 Español - Mike Hotek

288 Parte V Gestión de Base de Datos

Capítulo 18 Referencia Rápida

Para

Activar/desactivar características

Controlar y filtrar el tráfico entrante a una instancia

Conceder acceso a una instancia

Conceder acceso a una base de datos

Crear un usuario dentro de una

base de datos que debe ser suplantado para ejecutar bajo su autoridad

Administrar los permisos sobre

los objetos

Revocar permisos sobre una

instancia desde un miembro del rol sysadmin o sobre una

base de datos a partir de un miembro del rol db_owner

Ocultar la definición de

objetos

Haga lo siguiente

Utilice el procedimiento almacenado de sistema: sp_configure.

Configure endpoints TCP basados en el tipo de tráfico que debería ser aceptado.

Utilice el comando CREATE LOGIN para crear un “login SQL Server estándar” o un inicio de sesión de SQL Server mapeado a una cuenta de Windows.

Utilice la sentencia CREATE USER, especificando el login que está mapeado al usuario de la base de datos.

Utilice la cláusula WITHOUT LOGIN del comando CREATE USER.

Ejecute la sentencia adecuada GRANT, REVOKE y DENY en la

base de datos, esquema o a nivel de objeto.

No se puede restringir el acceso de un usuario administrador, porque SQL

Server no comprueba los permisos de un usuario de este tipo.

Ejecutar DENY VIEW DEFINITION para ocultar los metadatos dentro de un

base de datos.

Ejecutar DENY VIEW ALL DEFINITION para ocultar los metadatos para todos los objetos dentro de una instancia completa.

Suplantar a una cuenta Debe tener permisos de IMPERSONATE en la cuenta.

EXECUTE AS USER.. . . le permitirá hacerse pasar por un usuario de base de datos.

EXECUTE AS LOGIN. . . le permitirá hacerse pasar por un login.

Usted no puede suplantar a un usuario o login asignado a un certificado o

clave asimétrica.

Cifrar los datos mediante un

algoritmo de un solo sentido (one-way).

Cifrar los datos mediante un

algoritmo de dos vías (two-way)

Cifrar las copias de seguridad

Use un algoritmo de hash. El hash MD5 es el algoritmo preferido ya que es más seguro que otros algoritmos. Sin embargo, asegúrese de que está encriptando datos que no son fácilmente susceptibles a ataques de fuerza bruta.

Utilice una clave simétrica, clave asimétrica, certificado o frase de contraseña. Usted primero debe crear una clave maestra de base de datos antes de usar una clave simétrica, asimétrica, o certificado.

Aplicar el cifrado de datos transparente mediante la creación de un certificado en la base de datos master y use ese certificado para cifrar una clave de cifrado de base de datos.

www.detodoprogramacion.com

Page 303: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 19

Administración basada en políticas

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

 

Definir la “Administración basada en directivas”

Crear facetas

Crear condiciones

Crear políticas

Orientar las políticas a las instancias

Controlar y hacer cumplir las políticas

En este capítulo, usted aprenderá a instalar y configurar el nuevo Framework de políticas para SQL Server 2008. Usted aprenderá cómo configurar las reglas para revisar y agrupar esas reglas en una política que puede estar dirigida a una o varias instancias de SQL Server. Usted también aprenderá cómo centralizar la validación y aplicación de sus políticas.

Administración basada en políticas (visión general)

Antes de SQL Server 2008, la gestión de la configuración de un entorno se llevaba a cabo mediante el uso de “documented sneaker-net” (SneakerNet es el término usado, generalmente con intento irónico, para la transferencia de la información electrónica por medios desprendibles físicamente que la llevan a partir de un ordenador personal a otro). Las opciones de configuración, las convenciones de nomenclatura, y el conjunto características permitidas se describía en uno o más documentos. Con el fin de cumplir su normas, usted habría tenido que conectarse a cada instancia y comprobar su cumplimiento. Debido a que el proceso de verificación de cumplimiento era muy tedioso, usted podía tener que escribir grandes cantidades de código que tenía que ser constantemente actualizado y mantenido, para automatizar parcialmente el control de los estándares.

SQL Server 2008 incluye un framework llamado “administración basada en directivas” para hacer frente al problema de la normalización de las instancias de SQL Server. Aunque la administración basada en directivas se puede utilizar para alertar simplemente a un administrador cuando un objeto está fuera de cumplimiento, puede ir un paso más allá e impedir que la violación de la política ocurra.

La administración basada en directivas se define y aplica mediante el uso de cinco nuevos objetos:

 

 

Facetas (Facets)

Condiciones (Conditions)

289

www.detodoprogramacion.com

Page 304: Microsoft SQL Server 2008 Español - Mike Hotek

290 Parte V Gestión de Base de Datos

 

 

 

Políticas (Policies)

Políticas basadas en objetivos (Policy targets)

Políticas basadas en categorías (Policy categories)

Facetas

Las facetas son el objeto núcleo sobre el que sus estándares son construidos. Las facetas definen el tipo de objeto o la opción a comprobar tales como bases de datos, superficies, y login. SQL Server viene con 74 facetas, cada una con un conjunto único de propiedades.

Todos los objetos de administración basada en directivas se almacenan en la base de datos msdb. Usted puede obtener una lista de las facetas disponibles mediante la consulta a la tabla: dbo.syspolicy_management_facets. Desafortunadamente, a menos que quieras escribir un montón de código para interactuar con los Objetos de administración del servidor (SMO), la única manera de obtener una lista de propiedades de faceta es abrir cada faceta en SQL Server Management Studio (SSMS), una a la vez, y ver la lista de propiedades.

Condiciones

Cuando se define una cláusula WHERE de una instrucción DML, se restringe el conjunto de filas con las que se opera. Dicho en otros términos, se establece una condición de la sentencia DML que define el conjunto de filas que cumplen los criterios de inclusión específicos. Dentro del Framework de la administración basada en políticas, las condiciones (conditions) son el equivalente de una cláusula WHERE que define el criterio necesario para ser comprobado.

Las facetas definen el objeto a verificar y las propiedades de una faceta son utilizadas por las condiciones para definir las reglas que desee aplicar. Al igual que una cláusula WHERE, una condición puede ser definida por una o más propiedades de faceta y una única propiedad de faceta se puede comprobar por múltiples criterios. Los operadores de comparación que se pueden utilizar son restringidos por el tipo de datos de la propiedad. Por ejemplo, una propiedad de tipo cadena puede ser comprobada con =, <>, LIKE NOT LIKE, IN o NOT IN, mientras que un tipo booleano sólo puede ser comprobado con = y <>.

Más allá de comparaciones simples, SSMS tiene una capacidad de edición avanzada que permite definir condiciones complejas que comparan varias propiedades y funciones. Por ejemplo, se puede comprobar que cada tabla tenga una clave principal y que una tabla con un solo índice debe ser “clustered”. Cualquier condición que se define utilizando las capacidades avanzadas de edición evitará que una política definida a partir de la condición sea ejecutada automáticamente.

www.detodoprogramacion.com

Page 305: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 19 Administración basada en directiva 291

Aunque se pueden comprobar muchas propiedades de una faceta dentro de una condición única, una sola condición no puede ser definida para múltiples facetas. Por ejemplo, puede comprobar todas las 10 de las propiedades de la faceta “Surface Area Configuration” en una sola condición, pero tendrá que definir una segunda condición con el fin de verificar la propiedad de la “Surface Area Configuration” para Analysis Services.

En este ejercicio, creará una condición para lo siguiente:

 

 

Comprobar que una base de datos no tenga establecidas las propiedades “auto encoger” (shrink) o cierre automático.

Comprobar que el CLR, la Automatización OLE, las consultas remotas ad hoc, el SQL Mail y el Asistente Web están desactivados.

Comprobar que la base de datos no está en el modelo de recuperación SIMPLE.

Comprobar que todas las tablas tienen una clave principal.

 

 

Crear una condición

1. Expanda el nodo de “Administración de directivas” (Policy Management) en el nodo Administración del explorador de objeto.

2. Haga clic en el nodo “Condiciones” y seleccione “Nueva condición”.

3. Configure la condición como se muestra en el gráfico siguiente.

www.detodoprogramacion.com

Page 306: Microsoft SQL Server 2008 Español - Mike Hotek

292 Parte V Gestión de Base de Datos

4. Haga clic derecho en el nodo “Condiciones”, seleccione “Nueva condición”, y configure la condición como se muestra en el siguiente gráfico.

5. Haga clic derecho en el nodo “Condiciones”, seleccione “Nueva condición”, y configure la condición como se muestra en el siguiente gráfico.

www.detodoprogramacion.com

Page 307: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 19 Administración basada en directiva 293

6. Haga clic derecho en el nodo “Condiciones” y seleccione “Nueva condición”. Seleccione la faceta “Tabla”, haga clic en el botón de puntos suspensivos junto a la columna “Campo” (Field) para visualizar el cuadro de diálogo “Edición avanzada”, introduzca el siguiente código y haga clic en OK (el código se puede encontrar en el archivo Chapter19\code1.sql).

IsNull(ExecuteSql('Numeric', 'SELECT 1 FROM sys.tables a INNER JOIN sys.indexes b ON a.object_id = b.object_id WHERE b.is_primary_key = 1 AND a.name = @@ObjectName AND a.schema_id = SCHEMA_ID(@@SchemaName)'), 0)

7. Configure el Nombre, Operador y Valor como se muestra en el siguiente gráfico.

Políticas a “objetivos” (targets)

Las “condiciones” son las bases para las políticas. Sin embargo, no siempre quiere comprobar las políticas a través de todos los objetos disponibles, tales como cada base de datos en una instancia o cada índice dentro de cada base de datos. Las condiciones también se pueden utilizar para especificar los objetos a comparar por la condición, llamado “objetivos” (targeting) o “conjuntos de objetivos”.

Puede orientar una política a nivel de servidor, como por ejemplo los casos que sean de SQL Server 2005 o superior. También puede referirse a una política a nivel de base de datos, por ejemplo las bases de datos de usuario o la totalidad de las bases de datos del sistema.

En el siguiente ejercicio, creará una condición para apuntar a todas las instancias de SQL Server 2005 y superiores, junto con una condición para dirigir a todas las bases de datos de usuario que están en línea.

www.detodoprogramacion.com

Page 308: Microsoft SQL Server 2008 Español - Mike Hotek

294 Parte V Gestión de Base de Datos

Crear una condición para un conjunto de objetivos

1. Haga clic derecho en el nodo “Condiciones”, seleccione “Nueva condición”, y configure la condición como se muestra en este gráfico.

2. Haga clic derecho en el nodo “Condiciones”, seleccione “Nueva condición”, y configure la condición como se muestra en el siguiente gráfico.

www.detodoprogramacion.com

Page 309: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 19 Administración basada en directiva 295

Políticas

Las políticas se crean para una sola condición y se configuran para hacer cumplir o comprobar el cumplimiento. El modo de ejecución se puede configurar de la siguiente manera:

 

 

 

On Demand Evalúa la política cuando es ejecutada directamente por el usuario

On change, prevente Crea desencadenadores DDL para evitar un cambio que viole la política

On change, log only Comprueba la política de forma automática cuando se realiza un cambio, mediante la infraestructura de notificación de eventos

On schedule Crea un trabajo (job) del Agente SQL Server para comprobar la política definida, en una tarea programada (schedule)

 

En el siguiente ejercicio, creará las políticas para:

 

 

Comprobar que una base de datos no tiene configuradas las propiedades “auto encoger” (shrink) o “auto cerrar” Comprobar que están deshabilitados el CLR, la Automatización OLE, las consultas remotas ad hoc, SQL Mail y el asistente Web.

Comprobar que la base de datos no está en el modelo de recuperación SIMPLE.

Comprobar que todas las tablas tienen una clave principal.

 

 

Crear una política

1. Haga clic derecho en el nodo Directivas, seleccione Nueva directiva, y configure la directiva como se muestra en el siguiente gráfico.

www.detodoprogramacion.com

Page 310: Microsoft SQL Server 2008 Español - Mike Hotek

296 Parte V Gestión de Base de Datos

2. Haga clic derecho en el nodo Directivas, seleccione Nueva directiva, y configure la directiva como se muestra en el siguiente gráfico.

3. Haga clic derecho en el nodo Directivas, seleccione Nueva directiva, y configure la directiva como se muestra en el siguiente gráfico.

www.detodoprogramacion.com

Page 311: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 19 Administración basada en directiva 297

4. Haga clic derecho en el nodo Directivas, seleccione Nueva directiva, y configure la directiva como se muestra en el siguiente gráfico.

Categorías de política

Las categorías de política se pueden utilizar para agrupar una o más políticas en una única unidad de cumplimiento. Si no se especifica, todas las políticas pertenecen a la categoría predeterminada DEFAULT. Usted puede suscribir una instancia a una o más categorías de políticas. El propietario de la base de datos puede suscribir una base a una o más categorías de políticas.

Cada categoría de política tiene una “propiedad mandato” que se aplica a las bases de datos. Cuando una categoría de política se ajusta al mandato, las bases de datos que cumplen con la meta establecida son controladas por las políticas dentro de la categoría de política.

En el siguiente ejercicio, creará dos categorías de políticas para las políticas que creó anteriormente.

Crear una categoría de política

1. Haga clic derecho en Administración de directivas, seleccione Administrar categorías y cree las categorías que se muestran en este gráfico.

www.detodoprogramacion.com

Page 312: Microsoft SQL Server 2008 Español - Mike Hotek

298 Parte V Gestión de Base de Datos

2. Haga clic derecho en la opción de las políticas “Auto Shrink” y “Auto close”, seleccione Propiedades, seleccione la ficha Descripción y cambie la categoría a “Mejores prácticas de base de datos”.

3. Haga clic derecho en la opción de la política “Comprobar la configuración de superficie”, seleccione Propiedades, seleccione la ficha Descripción, y cambie la categoría a “Mejores prácticas para el área de superficie de la instancia”. 4. Haga clic derecho en la opción de la política “Modelo de recuperación SIMPLE”, seleccione propiedades, seleccione la ficha Descripción, y cambie la categoría a “Mejores Prácticas de base de datos”. 5. Haga clic en la opción Tablas para la política “Clave primaria”, seleccione Propiedades, seleccione la ficha Descripción, y cambie la categoría a “Mejores Prácticas de base de datos”.

Cumplimiento de Política

No todas las políticas se pueden configurar para garantizar el cumplimiento. Periódicamente, es necesario tildar manualmente las políticas que no son forzadas. Usted puede ver o seleccionar políticas que se aplican a una instancia mediante clic derecho en el nombre de la instancia dentro del Explorador de objetos y seleccionar Políticas | Ver o Políticas | Evaluar.

Usted puede comprobar todas las políticas dentro de una instancia, haciendo clic derecho en el nodo Políticas y seleccionando Evaluar, como se muestra en la Figura 19-1.

Al hacer clic en Evaluar, ejecutará las políticas y revisará los resultados, como se muestra en la Figura 19-2.

www.detodoprogramacion.com

Page 313: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 19 Administración basada en directiva 299

FIGURA 19-1 Evaluar las políticas

FIGURA 19-2 Protección de resultados de verificación

www.detodoprogramacion.com

Page 314: Microsoft SQL Server 2008 Español - Mike Hotek

300 Parte V Gestión de Base de Datos

Capítulo 19 Referencia rápida

Para

Crear una política

Haga lo siguiente

Crear una condición para comprobar una faceta

Asociar la condición a la política

Especificar opcionalmente cualquier conjuntos destino o restricciones de servidor Configurar el “modo evaluación”

Crear un conjunto de objetivos

Verificar el Mandato de la política

Crear una condición para definir el conjunto objetivo a verificar

Configurar una categoría de política como “Mandated”

www.detodoprogramacion.com

Page 315: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20

Recuperación de datos

Después de completar este capítulo, usted será capaz de

 

 

 

Realizar copias de seguridad de bases de datos

Administrar modelos de recuperación

Restaurar las bases de datos

SQL Server 2008 ofrece una plataforma de datos flexible y potente. Sin las necesidades de las empresas de almacenar datos con seguridad y poder recuperarlos, SQL Server no existiría. Sin la capacidad de SQL Server para almacenar y proteger los datos de los que las empresas dependen, las empresas no existirían. Como aprendió en el capítulo 18, "Seguridad", una de las dos tareas fundamentales de un administrador de base de datos es garantizar que las instancias, las bases de datos, y los datos están seguros. La segunda tarea fundamental de un Administrador de base de datos es asegurar que los datos están protegidos y recuperables.

Las miles de características dentro de SQL Server, que están diseñadas para que las organizaciones almacenen y manipulen los datos, son completamente inútiles a menos que pueda garantizar la seguridad y la capacidad de recuperación de una plataforma de base de datos. En este capítulo se ofrecerá una visión general de la tarea más importante que siempre puede llevar a cabo dentro de una organización, garantizando la recuperación de los datos.

Copias de seguridad de bases de datos

El tema de las copias de seguridad de una base de datos es uno de los clásicos problemas del "huevo y la gallina". Usted no puede crear eficazmente una estrategia de copia de seguridad sin entender cómo recuperar una base de datos. Al mismo tiempo, no se puede recuperar una base de datos a menos que primero tenga copias de seguridad de bases de datos.

A pesar de que iniciaremos con la copia de seguridad de una base de datos, todos los procesos de recuperación de desastres con los que usted tratará deben iniciar con los requerimientos para la recuperación. Siempre se querrá diseñar un procedimiento de copia de seguridad orientado a la recuperación, para todas sus bases de datos.

Seguridad de Backup

Todas las copias de seguridad se ejecutan bajo el contexto de seguridad de la cuenta de servicio de SQL Server. Con el fin de que una copia de seguridad tenga éxito, debe conceder permisos de lectura/escritura al grupo de Windows que contiene la cuenta de servicio de SQL Server "SQLServerMSSQLUser $ $ <machine> <instancia>" en una instancia no agrupada.

Un miembro del rol sysadmin pueden realizar copias de seguridad en cualquier base de datos de una instancia y los miembros del rol db_owner pueden realizar copias de seguridad de sus bases de datos. También puede agregar un usuario al rol db_backupoperator con el fin de permitirle al usuario una copia de seguridad de una base de datos mientras previene cualquier otro tipo de acceso a la base de datos.

301

www.detodoprogramacion.com

Page 316: Microsoft SQL Server 2008 Español - Mike Hotek

302 Parte V Gestión de Base de Datos

Tipos de copia de seguridad

SQL Server 2005 le permite crear cuatro tipos diferentes de copias de seguridad:

 

 

 

 

Completo (full)

Diferencial

Registro de transacciones (Transaction log)

El grupo de archivos (filegroup)

Copias de seguridad completas

Una copia de seguridad completa captura todas las páginas que contienen datos dentro de una base de datos. Una copia de seguridad completa es la base para la recuperación de una base de datos y se requiere con el fin de utilizar una copia de seguridad diferencial o de registro de transacciones.

Ya que es más común hacer una copia de una base de datos que restaurarla, el motor de copia de seguridad está optimizado para el proceso de copia de seguridad. Cuando se inicia una copia de seguridad, el motor de copia de seguridad toma las páginas de los archivos de datos lo más rápido posible, sin tener en cuenta el orden de las páginas. Dado que el proceso de copia de seguridad no tiene que ver con el orden de las páginas, se pueden usar varios hilos de procesos para escribir páginas en el dispositivo de copia de seguridad. El factor limitante para la velocidad de una copia de seguridad es el rendimiento del dispositivo donde se realiza la escritura de la copia de seguridad.

Una copia de seguridad puede ser ejecutada simultáneamente con las operaciones de base de datos. Dado que pueden hacerse cambios a la base de datos mientras se está ejecutando una copia de seguridad, SQL Server necesita ser capaz de acomodar los cambios mientras garantiza que las copias de seguridad son consistentes para los propósitos de restauración. A fin de garantizar tanto el acceso simultáneo y la consistencia de copia de seguridad, SQL Server realiza los

pasos del procedimiento de copia de seguridad de la siguiente manera:

1. Bloquea la base de datos, bloqueando todas las transacciones.

2. Coloca una marca en el registro de transacciones.

3. Libera el bloqueo de base de datos.

4. Extrae todas las páginas de los archivos de datos y los escribe en el dispositivo de backup.

5. Bloquea la base de datos, bloqueando todas las transacciones. (ídem paso 1)

6. Coloca una marca en el registro de transacciones. (ídem paso 2)

7. Libera el bloqueo de base de datos. (ídem paso 3)

8. Extrae la porción del registro entre las marcas y lo agrega a la copia de seguridad.

Las únicas operaciones que no están permitidas durante una copia de seguridad completa son:

 

 

Agregar o eliminar un archivo de base de datos

Reducir una base de datos (shrinking)

www.detodoprogramacion.com

Page 317: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 303

La sintaxis genérica para una copia de seguridad de una base de datos es:

BACKUP DATABASE { database_name | @database_name_var }

TO <backup_device> [ ,...n ] [ <MIRROR TO clause> ] [ next-mirror-to ] [ WITH { DIFFERENTIAL | <general_WITH_options> [ ,...n ] } ]

<backup_device>::= { { logical_device_name | @logical_device_name_var } | { DISK | TAPE } =

{ 'physical_device_name' | @physical_device_name_var } } <MIRROR TO clause>::= MIRROR TO <backup_device> [ ,...n ] <general_WITH_options> [ ,...n ]::= --Backup Set Options

COPY_ONLY | { COMPRESSION | NO_COMPRESSION } | DESCRIPTION = { 'text' | @text_variable } | NAME = { backup_set_name | @backup_set_name_var } | PASSWORD = { password | @password_variable } | { EXPIREDATE = { 'date' | @date_var }

| RETAINDAYS = { days | @days_var } } --Media Set Options

{ NOINIT | INIT } | { NOSKIP | SKIP } | { NOFORMAT | FORMAT } | MEDIADESCRIPTION = { 'text' | @text_variable } | MEDIANAME = { media_name | @media_name_variable } | MEDIAPASSWORD = { mediapassword | @mediapassword_variable } | BLOCKSIZE = { blocksize | @blocksize_variable } --Error Management Options

{ NO_CHECKSUM | CHECKSUM } | { STOP_ON_ERROR | CONTINUE_AFTER_ERROR }

Los dos únicos parámetros que se requieren para una copia de seguridad son el nombre de la base de datos y del dispositivo de copia de seguridad. Cuando se especifica un dispositivo de copia de seguridad en disco, puede ser especificado un directorio con un nombre de archivo. Si no se especifica un directorio, SQL Server realiza una copia de seguridad en disco con el archivo que se graba en el directorio de copia de seguridad predeterminada configurado para la instancia. Aunque la mayoría de las copias de seguridad se escriben en un único archivo de disco o un único dispositivo de cinta, puede especificar hasta 64 dispositivos de copia de seguridad. Si se especifica más de un dispositivo de copia de seguridad, SQL Server divide en franjas la copia de seguridad a través de cada uno de los dispositivos especificados.

Nota Cuando SQL Server franjea (stripes) una copia de seguridad a través de múltiples dispositivos, todos los dispositivos son requeridos para realizar la restauración con éxito. SQL Server no proporciona ninguna redundancia o tolerancia a fallos dentro del conjunto de franjas. Un conjunto de franjas se utiliza estrictamente para fines de rendimiento.

Un ejemplo de una copia de seguridad de franjeado es:

BACKUP DATABASE SQL2008SBS TO DISK = 'SQL2008SBS_1.bak', DISK = 'SQL2008SBS_2.bak'

GO

www.detodoprogramacion.com

Page 318: Microsoft SQL Server 2008 Español - Mike Hotek

304 Parte V Gestión de Base de Datos

Una de las máximas de recuperación de desastres es que no se pueden tener suficientes copias de sus copias de seguridad. La cláusula MIRROR TO proporciona una capacidad incorporada (built in) para crear hasta cuatro copias de una copia de seguridad en una sola operación. Cuando se incluye la cláusula MIRROR TO, SQL Server toma la página de la base de datos una vez y escribe una copia de la página para cada espejo de copia de seguridad. Durante una operación de restauración, puede utilizar cualquiera de los espejos. Las copias de seguridad espejadas tienen un pequeño número de requisitos:

 

 

 

Todos los dispositivos de copia de seguridad deben ser del mismo tipo de medio

Cada espejo debe tener el mismo número de dispositivos de copia de seguridad

Debe especificarse WHIT FORMAT en el comando de copia de seguridad

Si usted realiza una copia de seguridad a cinta, se debe espejar a la cinta. Si realiza una copia de seguridad en disco, debe reflejar a disco. Usted no puede hacer una copia de seguridad en cinta y espejar en disco o viceversa. Además, si hace una copia de seguridad para 64 dispositivos de disco, entonces también debe reflejar a 64 dispositivos de disco.

El factor limitante para el rendimiento de copia de seguridad es la velocidad del dispositivo de copia de seguridad. Comprimiendo una copia de seguridad, puede escribir los datos necesarios a la vez que reduce la cantidad de datos escritos al dispositivo de copia de seguridad. Hay un costo en la sobrecarga de procesamiento cuando comprime una copia de seguridad. Una copia de seguridad sin comprimir por lo general consume muy pocos recursos de procesamiento, en cambio la compresión puede consumir una cantidad apreciable de procesamiento. Una copia de seguridad normalmente se comprimirá entre 4:01 y 10:01.

Nota Es mi opinión, (basada en el diseño de copias de seguridad a miles de empresas a través de decenas de millones de bases de datos), la sobrecarga de compresión siempre vale la pena. Yo recomiendo que siempre utilice la compresión al realizar copias de una base de datos. Desafortunadamente, la compresión está disponible sólo en la edición Enterprise de SQL Server.

Un único dispositivo de copia de seguridad puede contener varias copias de seguridad. Las opciones INIT / NOINIT de un comando de copia de seguridad controla si un archivo de copia de seguridad existente se sobrescribe o anexa. Cuando se especifica NOINIT y realiza copias de seguridad a un archivo que ya existe, SQL Server agregará la nueva copia de seguridad al final del archivo. Si especifica INIT y el archivo ya existe, SQL Servidor sobrescribe el archivo con el contenido de la copia de seguridad nueva.

Nota Para evitar confusiones, se recomienda que utilice un esquema único de asignación de nombres que emplee una fecha y hora en el nombre del archivo para que usted pueda indicar cuando una copia de seguridad fue tomada basándose en el nombre del archivo de copia de seguridad. Dado que las copias de seguridad se toman para reducir el riesgo de pérdida de datos, nunca es una buena idea incluir varias copias de seguridad en un solo archivo.

Cuando se especifica CHECKSUM, SQL Server verificará la suma de comprobación de la página, si es que existe, antes de escribir la página a la copia de seguridad. Además, se calculará una suma de comprobación para la copia de seguridad entera, que se puede utilizar para determinar si la copia de seguridad se ha dañado. El comportamiento por defecto para cuando se encuentran errores durante una copia de seguridad es STOP_ON_ERROR. Si se encuentra una suma de comprobación de página no válida durante una copia de seguridad, la copia de seguridad se terminará con un error. Para continuar más allá del error y hacer copia de seguridad de tantas páginas como sea posible, puede especificar la opción CONTINUE_PAST_ERROR.

www.detodoprogramacion.com

Page 319: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 305

Nota Se recomienda que se especifique la opción CHECKSUM para capturar páginas dañadas tan pronto como sea posible. Usted no querrá encontrarse con sorpresas cuando necesite utilizar la copia de seguridad para restaurar una base de datos.

En el siguiente ejercicio, creará una copia de seguridad comprimida para nuestras 2 bases de datos. También espejará las copias de seguridad para redundancia y validará las sumas de comprobación (checksum) de las páginas.

Crear una copia de seguridad completa, comprimida, espejada.

1. Ejecute el siguiente código para hacer copia de seguridad de la base de datos SQL2008SBS (el código se puede encontrar en el archivo CAPÍTULO20\code1.sql):

BACKUP DATABASE SQL2008SBS TO DISK = 'SQL2008SBS_1.bak' MIRROR TO DISK = 'SQL2008SBS_2.bak' WITH COMPRESSION, INIT, FORMAT, CHECKSUM, STOP_ON_ERROR

GO

2. Ejecute el siguiente código para hacer copia de seguridad de la base de datos SQL2008SBSFS (el código se puede encontrar en el archivo CAPÍTULO20\code1.sql):

BACKUP DATABASE SQL2008SBSFS TO DISK = 'SQL2008SBSFS_1.bak' MIRROR TO DISK = 'SQL2008SBSFS_2.bak' WITH COMPRESSION, INIT, FORMAT, CHECKSUM, STOP_ON_ERROR

GO

Copias de seguridad del registro de transacción

Las copias de seguridad del registro de transacciones sólo contienen los cambios contenidos en el registro de transacciones. Dado que el registro de transacciones no almacena todo el contenido de una base de datos, se requiere una copia de seguridad completa con el fin de ser capaz de crear una copia de seguridad del registro de transacciones. Una copia de seguridad de este tipo, también puede ser denominada como copia de seguridad incremental, ya que cada copia de seguridad del registro de transacciones capturará cualquiera de los cambios realizados desde la última copia de seguridad del registro de transacciones completa.

Cada cambio realizado en una base de datos tiene una entrada hecha en el registro de transacciones. Cada fila es asignada a un número único llamado internamente Número de Secuencia de Registro (LSN - Log Sequence Number). El LSN es un valor entero que comienza en 1 cuando se crea la base de datos y se incrementa hasta el infinito. Un LSN nunca se reutiliza para una base de datos y se incrementará siempre. Esencialmente, un LSN ofrece un número de secuencia para cada cambio realizado en una base de datos.

El contenido de un registro de transacciones se divide en dos partes básicas: activa e inactiva. La parte inactiva del registro de transacciones contiene todos los cambios que se han comprometido (commit) en la base de datos. La parte activa del registro contiene todos los cambios que aún no han sido comprometidos (commit). Cuando una copia de seguridad del registro de transacciones se ejecuta, SQL Server se inicia con la menor LSN en el registro de transacciones y comienza a escribir cada registro sucesivo del registro de transacciones en la copia de seguridad.

www.detodoprogramacion.com

Page 320: Microsoft SQL Server 2008 Español - Mike Hotek

306 Parte V Gestión de Base de Datos

Tan pronto como SQL Server alcanza el primer LSN que no se ha cometido, (una transacción abierta), la copia de seguridad del registro de transacciones se completa. La porción del registro de transacciones al que se le ha realizado la copia, es eliminada permitiendo que el espacio sea reutilizado.

Basado en el número de secuencia, es posible restaurar una copia de seguridad del registro de transacciones después de otro, para recuperar una base de datos a cualquier punto en el tiempo simplemente siguiendo la cadena de transacciones identificadas por el LSN.

Dado que las copias de seguridad de registro de transacciones están destinadas a ser restauradas una tras otra, las restricciones sobre las copias de seguridad del registro de transacción dependen de tener toda la secuencia entera de LSNs intacta. Cualquier acción que cree un vacío en la secuencia LSN evitará que cualquier copia de seguridad del registro de transacciones posteriores sea ejecutada. Si se introduce una brecha en el LSN, debe crear una copia de seguridad completa antes de que pueda iniciar la copia de seguridad del registro de transacciones.

Si una base de datos está en el modelo de recuperación simple, cada punto de control (checkpoint) desechará la porción inactiva del registro de transacciones. Puesto que la parte inactiva del registro se tira en cada punto de control, se introduce un hueco (gap) en la secuencia de LSN. Por lo tanto, no es posible crear copias de seguridad del registro de transacciones contra una base de datos en el modelo de recuperación simple.

Cuando una base de datos se encuentra en el modelo “recuperación masiva de registros” (bulk logged recovery), las transacciones registradas mínimamente no escriben cada cambio en el registro de transacciones. Una vez que las transacciones registradas mínimamente se han completado, todas las páginas modificadas se escriben en el registro de transacciones. La cadena de LSNs nunca se rompe, por lo que aún puede ejecutar una copia de seguridad del registro de transacciones contra una base de datos en el modelo de “recuperación masiva de registros”. Sin embargo, no se puede restaurar una base de datos en cualquier punto en el tiempo durante el cual el registro mínimo transacción se ejecuta.

En el siguiente ejercicio, creará un par de copias de seguridad del registro de transacciones para la base de datos SQL2008SBS.

Crear una copia de seguridad del registro de transacciones

1. Ejecute el siguiente código para modificar datos y realizar la primer copia de seguridad del registro de transacciones (el código puede encontrarse en el archivo CAPÍTULO20\code2.sql):

USE SQL2008SBS GO INSERT INTO LookupTables.ProductCategory (Category) VALUES('Hand Tools') GO BACKUP LOG SQL2008SBS TO DISK = 'SQL2008SBS_1.trn' WITH COMPRESSION, INIT, CHECKSUM, STOP_ON_ERROR GO

www.detodoprogramacion.com

Page 321: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 307

2. Ejecute el siguiente código para hacer otra modificación de datos y realizar una segunda copia de seguridad del registro de transacciones (el código se puede encontrar en el archivo CAPÍTULO20\ code2.sql):

INSERT INTO LookupTables.ProductCategory (Category) VALUES('Hardware') GO BACKUP LOG SQL2008SBS TO DISK = 'SQL2008SBS_2.trn' WITH COMPRESSION, INIT, CHECKSUM, STOP_ON_ERROR GO

Copias de seguridad diferenciales

Una copia de seguridad diferencial captura todas las extensiones (extents) que han cambiado desde la última copia de seguridad. El propósito principal de una copia de seguridad diferencial es reducir el número de copias de seguridad de registro de transacciones que necesitan ser restauradas. Una copia de seguridad diferencial tiene que ser aplicada a una copia de seguridad completa y no puede existir hasta que una copia de seguridad completa se haya creado.

SQL Server sigue cada extensión que ha sido modificada, siguiendo una copia de seguridad completa usando una página especial en el encabezado de una base de datos llamado “mapa de cambio diferencial” (DCM). Una copia de seguridad completa pondrá a cero el contenido de la DCM. Cuando se realizan cambios en las extensiones dentro de la base de datos, SQL Server establecerá el bit correspondiente para la extensión a 1. Cuando se ejecuta una copia de seguridad diferencial SQL Server lee el contenido de la DCM para encontrar todas las extensiones que han cambiado desde la última copia de seguridad.

Una copia de seguridad diferencial no es lo mismo que una copia de seguridad incremental. Una copia de seguridad del registro de transacciones es una copia de seguridad incremental, ya que captura todos los cambios que se han producido desde la última operación de copia de seguridad del registro. Una copia de seguridad diferencial contendrá todas las páginas modificadas desde la última copia de seguridad completa. Por ejemplo, si usted fuera a realizar una copia de seguridad completa a la medianoche y una copia de seguridad diferencial cada cuatro horas, la copia de seguridad de las 4 A.M. contendría todos los cambios desde la medianoche y la copia de seguridad de las 8 AM también contendría todos los cambios realizados en la base de datos desde la medianoche.

En el siguiente ejercicio, creará una copia de seguridad diferencial de la base de datos SQL2008SBS.

Crear una copia de seguridad diferencial

1. Ejecute el siguiente código para realizar una copia de seguridad de la base de datos SQL2008SBS (el código se puede encontrar en el archivo CAPÍTULO20 \ code3.sql):

USE SQL2008SBS

GO

DECLARE @CategoryID INT

www.detodoprogramacion.com

Page 322: Microsoft SQL Server 2008 Español - Mike Hotek

308 Parte V Gestión de Base de Datos

SELECT @CategoryID = CategoryID FROM LookupTables.ProductCategory WHERE Category = 'Hand Tools' INSERT INTO LookupTables.ProductSubCategory (CategoryID, SubcategoryName) VALUES(@CategoryID, 'Chisels'), (@CategoryID, 'Files'), (@CategoryID, 'Rasps') GO BACKUP DATABASE SQL2008SBS

TO DISK = 'SQL2008SBS_1.dif' MIRROR TO DISK = 'SQL2008SBS_2.dif' WITH DIFFERENTIAL, COMPRESSION, INIT, FORMAT, CHECKSUM, STOP_ON_ERROR

GO

Nota El CD adjunto contiene un script extra para crear un procedimiento de copia de seguridad que puede utilizar en producción para realizar una copia de seguridad completa, diferencial y del registro de transacciones.

Copias de seguridad de grupo de archivos

A pesar de que las copias de seguridad completas capturan todas las páginas utilizadas en toda la base de datos, una copia de seguridad completa de una gran base de datos puede consumir una cantidad significativa de espacio y tiempo. Si necesita reducir el impacto de una copia de seguridad, puede confiar en su lugar en una copias de seguridad de archivo o grupo de archivos. Como su nombre lo indica, una copia de seguridad de archivo/grupo de archivos le permite orientar una porción de una base de datos para ser copiada en una copia de seguridad.

Nota Aunque es posible hacer una copia de seguridad de un archivo, se recomienda que las copias de seguridad sean solamente tan granulares como el nivel del grupo de archivos. Un grupo de archivos es un límite de almacenamiento y cuando usted tiene múltiples archivos dentro de un grupo de archivos, SQL Server almacena los datos a través de todos los archivos. Sin embargo, con respecto a la tabla, índice o partición, la distribución de los datos entre los archivos es esencialmente aleatoria. Por lo tanto, con el fin de recuperar una base de datos, necesita todos los archivos bajo un grupo de archivos exactamente en el mismo estado.

Las copias de seguridad del grupo de archivos pueden ser usadas en conjunción con las copias de seguridad diferencial y de registro de transacciones para recuperar una porción de la base de datos en el caso de un fallo. Además, siempre y cuando no tenga que restaurar el grupo de archivos PRIMARY, la base de datos puede permanecer en línea y accesible para las aplicaciones durante la operación de restauración. Sólo la parte de la base de datos que se está restaurando estará fuera de línea.

Corrupción de página

Esperamos que usted nunca tenga que lidiar con la corrupción dentro de una base de datos. Desafortunadamente, los componentes de hardware fallan, especialmente los controladores y las unidades de disco. Antes de una falla completa, los controladores o las unidades de disco pueden introducir corrupción a las páginas de datos mediante la realización de una escritura incompleta.

www.detodoprogramacion.com

Page 323: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 309

Antes de SQL Server 2005, SQL Server cuando se encontraba con una página corrupta, podía potencialmente tener toda la instancia fuera de línea. Ejecutando el siguiente comando SQL Server detectará y pondrá en cuarentena las páginas corruptas:

ALTER DATABASE <dbname> SET PAGE_VERIFY CHECKSUM

Cuando SQL Server escribe una página en el disco, se calcula una suma de comprobación para la página. Cuando se habilita la verificación de página, cada vez que se lee una página del disco, SQL Server calculará una nueva suma de comprobación y la comparará con la suma de control almacenada en la página. Si las sumas de comprobación no coinciden, SQL Server devuelve un error y registra la página en una tabla en la base de datos msdb.

Nota Si la base de datos está participando en una sesión de creación de espejo de base de datos, tema que usted aprenderá en el capítulo 23 "Alta disponibilidad", una copia de la página corrupta se recuperará desde el espejo. Si la página en el espejo está intacta, la página corrupta se reparará automáticamente con la página recuperada desde el espejo.

Modelos de recuperación

Cada base de datos en una instancia de SQL Server tiene configurada una propiedad llamada “modelo de recuperación”. El modelo de recuperación determina los tipos de copias de seguridad que se pueden realizar contra una base de datos. Los modelos de recuperación disponibles en SQL Server 2008 son:

 

 

 

Completo

Registro masivo (bulk logged)

Simple

Cuando una base de datos está en el modelo de recuperación completa, todos los cambios realizados, tanto DML y DDL, se registran en el registro de transacciones. Debido a que todos los cambios se registran en el registro de transacciones, es posible recuperar una base de datos en el modelo de recuperación completa en un punto dado en el tiempo de modo que la pérdida de datos puede ser minimizado o eliminado si usted necesitara recuperarse de un desastre. Los cambios se mantienen en el registro de transacciones por tiempo indefinido y sólo se eliminan mediante la ejecución de una copia de seguridad del registro de transacciones.

Nota Recomiendo encarecidamente configurar cada base de datos de producción para usar el modelo de recuperación completa. Este le permitirá recuperar hasta un punto en el tiempo y cuando se recupera una base de datos, siempre se quiere tener la más amplia gama de opciones posibles.

Ciertas operaciones están diseñadas para manipular grandes cantidades de datos. Sin embargo, la sobrecarga de registros en el registro de transacciones puede tener un impacto negativo en el rendimiento. El modelo de recuperación de registros masivo permite ciertas operaciones que se ejecutarán con un mínimo de registros. Cuando una operación de registro mínima se lleva a cabo, SQL Server no registra todas las

www.detodoprogramacion.com

Page 324: Microsoft SQL Server 2008 Español - Mike Hotek

310 Parte V Gestión de Base de Datos

filas modificadas, pero en lugar registra las extensiones, reduciendo así la sobrecarga y mejorando el rendimiento. Las operaciones que se realizan en la manera “registrados mínimamente” con la base de datos configurada en el modelo “registro masivo” (bulk logged) son:

 

 

 

 

 

BCP

BULK INSERT

SELECT ... INTO

CREATE INDEX

ALTER INDEX ... REBUILD

Debido a que el modelo de recuperación “bulk logged” no registra cada cambio en el registro de transacciones, usted no puede recuperar una base de datos en un punto en el tiempo cuando este modelo fue habilitado.

El tercer modelo de recuperación es SIMPLE. Una base de datos en este modelo registra operaciones en el registro de transacciones exactamente como el modelo de recuperación completa. Sin embargo, cada vez que se ejecuta el proceso de punto de control (checkpoint), la porción comprometida (commited) del registro de transacciones se descarta. La base de datos en el modelo de recuperación simple no puede recuperase a un punto en el tiempo, porque no es posible emitir una copia de seguridad del registro de transacciones para una base de datos en el modelo de recuperación simple.

Dado que el modelo de recuperación es una propiedad de una base de datos, establecer el modelo de recuperación se logra a través del comando ALTER DATABASE:

ALTER DATABASE database_name SET RECOVERY { FULL | BULK_LOGGED | SIMPLE }

Los tipos de copia de seguridad disponibles para cada modelo de recuperación se muestran en la Tabla 20-1.

TABLA 20-1 Copias de seguridad disponibles para cada modelo de recuperación

Tipo de copia de seguridad

Completo Diferencial

Tran Log

Sí / No

mínimamente

registrado

No

Modelo de recuperación

Completo

Bulk (masivo)

Sí Sí

Simple Sí Sí

En el siguiente ejercicio, cambiará el modelo de recuperación de nuestras bases de datos a FULL con el fin de asegurar que puede recuperarse de un fallo en un punto en el tiempo.

www.detodoprogramacion.com

Page 325: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 311

Establecer el modelo de recuperación

1. Ejecute el siguiente código (el código se puede encontrar en el archivo CAPÍTULO20\ code4.sql):

ALTER DATABASE SQL2008SBS SET RECOVERY FULL

GO ALTER DATABASE SQL2008SBSFS

SET RECOVERY FULL GO

2. Haga clic derecho en la base de datos, seleccione Propiedades y seleccione la ficha Opciones para ver el modelo de recuperación.

Restauración de la base de datos

Las copias de seguridad de bases de datos son como las pólizas de seguro, usted tiene copias de seguridad en caso de que algo malo ocurra, pero espera que nunca las tenga que usar. En el caso de que necesite recuperar una base de datos, SQL Server tiene varias opciones que se pueden usar para que pueda utilizar su copia de seguridad del tipo completa, diferencial, registro de transacciones, y/o grupo de archivos para recuperar la máxima cantidad de datos posibles.

Todas las secuencias de restauración comenzarán o con una copia de seguridad completa o con un grupo de archivos. Cuando restaura copias de seguridad, tiene la opción de terminar el proceso de restauración en cualquier punto en el tiempo y hacer que la base de datos esté disponible para las transacciones. Una vez que la base de datos o grupo de archivos restaurado ha sido puesto en línea, no se puede aplicar ninguna copia de seguridad adicional ya sea diferencial o de registro de transacciones de la base de datos.

Restaurar una copia de seguridad completa

La sintaxis genérica para restaurar una copia de seguridad completa es la siguiente:

RESTORE DATABASE { database_name | @database_name_var }

[ FROM <backup_device> [ ,...n ] ] [ WITH {[ RECOVERY | NORECOVERY |

STANDBY = {standby_file_name | @standby_file_name_var } ] | , <general_WITH_options> [ ,...n ]

| , <replication_WITH_option> | , <change_data_capture_WITH_option>

| , <service_broker_WITH options> | , <point_in_time_WITH_options—RESTORE_DATABASE> } [ ,...n ]

] <general_WITH_options> [ ,...n ]::= --Restore Operation Options

MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' [ ,...n ] | REPLACE | RESTART | RESTRICTED_USER

www.detodoprogramacion.com

Page 326: Microsoft SQL Server 2008 Español - Mike Hotek

312 Parte V Gestión de Base de Datos

Cuando un comando RESTORE es emitido, si la base de datos no existe todavía en la instancia, SQL Server creará la base de datos junto con todos los archivos por debajo de la base de datos. Durante este proceso, cada archivo será creado y dimensionado para que coincida con el tamaño del archivo en el momento en que se creó la copia de seguridad. Una vez que los archivos se han creado, SQL Server iniciará la restauración de cada página de base de datos desde la copia de seguridad.

Nota La creación y el dimensionamiento de todos los archivos asociados a una base de datos pueden consumir una importante cantidad de tiempo. Si la base de datos ya existe, simplemente debería restaurarla por encima de la base de datos existente.

Si desea que la base de datos esté en línea y accesible para las transacciones una vez que la operación RESTORE se ha completado, usted tendrá que especificar la opción RECOVERY. Cuando es emitido un RESTORE con la opción NORECOVERY, la restauración se completa, pero la base de datos se deja en un estado RECOVERING de tal manera que las subsecuentes copias de seguridad diferencial y/o copias de seguridad del registro de transacciones pueden ser aplicadas. La opción STANDBY, junto con un archivo para mantener la consistencia de la base de datos, se puede utilizar para que pueda emitir declaraciones SELECT contra la base de datos mientras sigue siendo capaz de emitir una restauración diferencial y/o “registro de transacciones” adicional.

El sistema de archivos en la máquina donde va a restaurar la base de datos puede no coincidir con la máquina de donde se toma la copia de seguridad o también, si lo desea, puede cambiar la ubicación de los archivos de base de datos durante la restauración. La opción MOVE proporciona la capacidad de cambiar la ubicación de uno o más archivos de datos cuando se restaura la base de datos.

Restaurar Rutas de acceso

En este punto, usted tiene conocimientos básicos para comenzar a restaurar una base de datos a partir de copias de seguridad. Sin embargo, si usted acaba de iniciar tomando las copias de seguridad que se crearon anteriormente en este capítulo, podría perder datos. Para aquellos con experiencia en copias de seguridad y restauración de bases de datos, los ejercicios de copia de seguridad le podrían haber parecido un poco fuera de lugar. Antes de restaurar la base de datos, es necesario tomar primero un inventario de las copias de seguridad que ha creado y el estado de cada base de datos a las que le aplicó la copia de seguridad. La tabla 20-2 proporciona una descripción básica del estado de la base de datos con respecto a cada copia de seguridad.

TABLA 20-2 Modificaciones de bases de datos

Modificación de datos

Inserte las herramientas de mano

Copia de seguridad creada

Copia de seguridad completa

Copia de registro

Inserte hardware

Copia de registro

Inserte cinceles, limas y escofinas

Copia de seguridad diferencial

www.detodoprogramacion.com

Page 327: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 313

Independientemente del punto en el que desea restaurar la base de datos, usted tiene que restaurar primero la copia de seguridad completa. Si sólo quería restaurar la base de datos hasta el punto donde se añadió la categoría herramientas de mano, a continuación, restauraría la primera copia de seguridad del registro de transacciones y recuperaría la primera base de datos. La categoría de hardware junto con los cinceles, limas y escofinas se perderían. Del mismo modo, si desea restaurar la base de datos hasta el punto antes de que se agregaron las subcategorías (cinceles, limas y escofinas), se restablecería la copia de seguridad completa y luego las copias de seguridad de registro de transacciones primera y segunda antes de recuperar la base de datos.

Si desea restaurar la base de datos sin perder ningún dato, sólo se necesita restaurar la copia de seguridad completa y luego la copia de seguridad diferencial, ya que la diferencial también contendrá todos los cambios capturados por cada una de las copias de seguridad de registro de transacciones. ¿Qué pasaría si se restaura la copia de seguridad completa y encuentre que la diferencial no puede utilizarse debido a daños en la copia de seguridad? Usted podría restaurar las dos copias de seguridad del registro de transacciones, pero irrevocablemente perdería las tres subcategorías que se insertaron.

Con el fin de proporcionar la mayor flexibilidad para una restauración, el primer paso en cualquier operación de restauración es emitir una copia de seguridad del registro de transacciones contra de la base de datos original. Obviamente, si el original base de datos ya no existe, no tiene la opción de tomar una copia de seguridad del registro de transacciones antes de comenzar las operaciones de restauración. El paso en el proceso de restauración en el que primero toma un copia de seguridad final del registro de transacciones se conoce como "copia de seguridad de la cola del registro."

Con el fin de aprender a tratar con la recuperación de bases de datos, es necesario crear interesantes situaciones que requieren la recuperación. En el ejercicio siguiente, a propósito se dañará la base de datos SQL2008SBS de tal manera que es necesaria una restauración para acceder a los datos de base de datos.

Dañar a propósito una base de datos

1. Abra SQL Server Configuration Manager y detenga su instancia de SQL Server 2008.

2. Abra Windows Explorer y borre los archivos SQL2008SBS.mdf, SQL2008SBS_1.ndf, SQL2008SBS_2.ndf, SQL2008SBS_3.ndf, SQL2008SBS_4.ndf, and SQL2008SBS_5.ndf.

Nota No se pueden eliminar los archivos de base de datos mientras se ejecuta la instancia de SQL Server porque se tienen los archivos abiertos y bloqueados en el sistema operativo. También, asegúrese de que usted no elimina el archivo de registro de transacciones: SQL2008SBS.ldf.

3. Inicie su instancia de SQL Server 2008.

4. Reconectese a la instancia con SSMS.

5. Obsérvese que mientras que la entrada para la base de datos SQL2008SBS todavía existe, la base de datos está completamente inaccesibles ya que todos los archivos de datos ya no existen.

En el siguiente ejercicio, se restaurará la base de datos SQL2008SBS desde la copia de seguridad completa que creó anteriormente en este capítulo.

www.detodoprogramacion.com

Page 328: Microsoft SQL Server 2008 Español - Mike Hotek

314 Parte V Gestión de Base de Datos

Nota La operación de restauración requiere acceso exclusivo a la base de datos o al grupo de archivos que es restaurado. Antes de ejecutar una restauración, primero debe asegurarse de que todos los usuarios están desconectados de la base de datos.

Restaurar una copia de seguridad completa

1. El primer paso en un proceso de restauración es una copia de seguridad de la cola del registro. Por lo tanto, abra una nueva ventana de consulta y ejecute el siguiente código (el código se puede encontrar en el archivo CAPÍTULO20\code5.sql):

BACKUP LOG SQL2008SBS TO DISK = 'SQL2008SBS_3.trn' WITH COMPRESSION, INIT, NO_TRUNCATE GO

Copia de seguridad de la copia del registro

A menos que usted haya visto esto antes, puede que se pregunte cómo nos las arreglamos para respaldar el registro de transacciones, incluso cuando todos los archivos de datos para la base de datos ya no existen.

Aunque una base de datos no puede aceptar transacciones sin un registro de transacciones, el registro de transacción es una pista (track) separada de los cambios realizados en una base de datos. Siempre y cuando el registro de transacciones no haya sido dañado, es posible realizar una copia de seguridad del registro, incluso en ausencia de todos los archivos de datos dentro de la base de datos. Además de que el registro de transacciones tiene que estar intacto, SQL Server tiene que tener una entrada en sys.databases con el fin de ejecutar el comando BACKUP LOG.

2. Ahora que ha capturado la cola del registro, ejecute el siguiente código para restaurar la copia de seguridad completa (el código puede encontrarse en el archivo CAPÍTULO20\code6.sql):

RESTORE DATABASE SQL2008SBS FROM DISK = 'SQL2008SBS_1.bak' WITH STANDBY = 'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\SQL2008SBS.stn' GO

3. Compruebe que puede leer, pero no modificar, los datos.

4. Verifique que los datos agregados a las tablas ProductCategory y ProductSubCategory se perdieron de la base de datos.

Restaurar una copia de seguridad diferencial

Una restauración diferencial utiliza la misma sintaxis de comandos como una restauración de base de datos completa. Una vez que la copia de seguridad completa se ha restaurado, a continuación, puede restaurar la copia de seguridad diferencial más reciente.

www.detodoprogramacion.com

Page 329: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 315

En el siguiente ejercicio, se restaurará la copia de seguridad diferencial de la base de datos SQL2008SBS y, después de la verificación, se pondrá en conexión la base de datos.

Restaurar una copia de seguridad diferencial

1. Ejecute el siguiente código para restaurar la copia de seguridad diferencial (el código puede encontrarse en el archivo CAPÍTULO20\ code7.sql):

RESTORE DATABASE SQL2008SBS FROM DISK = 'SQL2008SBS_2.dif' WITH STANDBY = 'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\SQL2008SBS.stn' GO

2. Verifique que todas las filas existenten en las tablas ProductCategory y ProductSubCategory.

3. Ejecute el código siguiente para recuperar la base de datos y finalizar el proceso de restauración

(El código se puede encontrar en el archivo CAPÍTULO20\ code8.sql en las muestras que acompañan el libro):

RESTORE DATABASE SQL2008SBS

CON RECUPERACIÓN

GO

Restaurar una copia de seguridad del registro de transacciones

La sintaxis genérica para restaurar una copia de seguridad del registro de transacciones es la siguiente:

RESTORE LOG { database_name | @database_name_var }

[ <file_or_filegroup_or_pages> [ ,...n ] ] [ FROM <backup_device> [ ,...n ] ] [ WITH {[ RECOVERY | NORECOVERY |

STANDBY = {standby_file_name | @standby_file_name_var } ] | , <general_WITH_options> [ ,...n ] | , <replication_WITH_option> | , <point_in_time_WITH_options—RESTORE_LOG> } [ ,...n ] ]

<point_in_time_WITH_options—RESTORE_LOG>::= | { STOPAT = { 'datetime' | @datetime_var } | STOPATMARK = { 'mark_name' | 'lsn:lsn_number' }

[ AFTER 'datetime' ] | STOPBEFOREMARK = { 'mark_name' | 'lsn:lsn_number' }

[ AFTER 'datetime' ]

Hay momentos en que usted necesitará restaurar una base de datos, pero no deseará recuperar todas las transacciones que se han emitido. Al restaurar un registro de transacciones, puede hacer que SQL Server reproduzca sólo una parte del registro de transacciones mediante la emisión de lo que se conoce como restaurar un "punto en el tiempo. "El comando STOPAT permite especificar una fecha y hora hasta la que SQL Server restaurará. Las opciones STOPATMARK y STOPBEFOREMARK le permiten especificar un

LSN o una “marca” (MARK) del registro de transacción a utilizar para el punto de parada en la operación de restauración.

En el siguiente ejercicio, se restaurará la base de datos SQL2008SBS utilizando las tres copias de seguridad del registro de transacción, que se habían creado anteriormente.

www.detodoprogramacion.com

Page 330: Microsoft SQL Server 2008 Español - Mike Hotek

316 Parte V Gestión de Base de Datos

Restaurar una copia de seguridad del registro de transacciones

1. Ejecute el siguiente código para restaurar la copia de seguridad completa de la base de datos SQL2008SBS (El código puede encontrarse en el archivo CAPÍTULO20\code9.sql):

RESTORE LOG SQL2008SBS FROM DISK = 'SQL2008SBS_1.trn' WITH STANDBY = 'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\SQL2008SBS.stn' GO

2. Verifique que se perdieron los datos en las tablas ProductCategory y ProductSubCategory.

3. Ejecute el siguiente código para restaurar la primera copia de seguridad del registro de transacciones (el código puede encontrarse en el archivo CAPÍTULO20\code10.sql):

RESTORE LOG SQL2008SBS FROM DISK = 'SQL2008SBS_1.trn' WITH STANDBY = 'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\SQL2008SBS.stn' GO

4. Compruebe que la categoría “Herramientas de mano” ahora existe.

5. Ejecute el siguiente código para restaurar la segunda copia de seguridad del registro de transacciones (el código puede encontrarse en el archivo CAPÍTULO20\code11.sql):

RESTORE LOG SQL2008SBS FROM DISK = 'SQL2008SBS_2.trn' WITH STANDBY = 'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\SQL2008SBS.stn' GO

6. Compruebe que la categoría “Hardware” ahora existe.

7. Ejecute el siguiente código para restaurar la tercera copia de seguridad del registro de transacciones (el código puede encontrarse en el archivo CAPÍTULO20\code12.sql):

RESTORE LOG SQL2008SBS FROM DISK = 'SQL2008SBS_3.trn' WITH STANDBY = 'C:\Program Files\

Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Backup\SQL2008SBS.stn' GO

8. Verifique que las subcategorías cinceles, limas y escofinas existe.

9. Ejecute el siguiente código para recuperar la base de datos para el acceso y las transacciones (el código se puede encontrar en el archivo CAPÍTULO20\code13.sql):

RESTORE DATABASE SQL2008SBS WITH RECOVERY GO

www.detodoprogramacion.com

Page 331: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 20 Recuperación de Datos 317

Capítulo 20 Referencia Rápida

Para Hacer una copia de seguridad de la base de datos completa

Crear una copia de un Backup

Comprimir una copia de seguridad para ahorrar espacio

Crear una copia de seguridad diferencial Restaurar una copia de seguridad completa o diferencial Realizar una copia de seguridad de la cola del registro

Haga lo siguiente

BACKUP DATABASE <nombre de base de datos> A < dispositivo de backup >

Especifique la cláusula MIRROR TO junto con la opción WHIT FORMAT

Especifique la opción WITH COMPRESSION

Especifique la opción WITH DIFFERENTIAL

RESTORE DATABASE <database name> FROM <backup device>

Emitir un comando BACKUP LOG. BACKUP LOG puede ser ejecutado siempre que el registro de transacciones no ha sido dañado, incluso si todos los archivos de datos han sido destruidos.

Especifique la opción WITH STANDBY = <file name>

RESTORE DATABASE <database name> WITH RECOVERY

Dejar una base de datos accesible para operaciones de lectura después de una restauración

Recuperar una base de datos para que sea

accesible para las transacciones

www.detodoprogramacion.com

Page 332: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 21

Agente SQL Server

Después de completar este capítulo, usted será capaz de

 

 

 

 

Crear tareas (jobs), pasos de las tareas, flujos de trabajo de tareas

Crear planes de mantenimiento

Creación y asignación de operadores

Crear alertas

A través de los primeros 20 capítulos de este libro, hemos hablado de una variedad de características que pueden ser utilizadas para crear aplicaciones de bases de datos de gran alcance y flexibles. También hemos introducido varios temas de gestión y mantenimiento. Aunque los usuarios utilizarán aplicaciones para interactuar con SQL Server y los datos almacenados en sus bases de datos, los administradores necesitan llevar a cabo tareas repetitivas de mantenimiento para asegurar que los datos estén protegidos y optimizar el rendimiento.

Muchas de las tareas de administradores se realizan durante los períodos de baja utilización en el sistema, que también suelen coincidir con los marcos de tiempo cuando los administradores tendrían que dormir. En lugar de exigir a que los administradores ejecuten manualmente las funciones de mantenimiento, SQL Servidor suministra un motor de programación llamado el Agente SQL Server. La responsabilidad principal del Agente SQL Server es ejecutar tareas en un horario definido.

En este capítulo, usted aprenderá cómo crear tareas programadas. También aprenderá a crear planes de mantenimiento y configurar SQL Server para que envíe alertas basadas en condiciones definidas por el usuario.

Crear tareas

Las tareas (o Jobs) proporcionan el “contenedor” de ejecución que permite empaquetar uno o más pasos en un proceso que necesita ser ejecutado. Aunque muchos Jobs que se crean sólo tendrán una única tarea, SQL Server le permite crear jobs compuestos por múltiples tareas para las que se pueden configurar “éxito” (success) y “acciones de error” (failure actions). Cada tarea o unidad de trabajo a realizar está contenida dentro de un paso de trabajo (o job step).

Pasos de los jobs

Los job steps son los elementos de ejecución dentro de un trabajo. Los tipos de pasos de trabajo que se pueden ejecutar son los siguientes:

 

 

 

 

Transact-SQL

Tareas de replicación (Replication tasks)

Tareas del sistema operativo o archivos ejecutables

Tareas de Analysis Services

319

www.detodoprogramacion.com

Page 333: Microsoft SQL Server 2008 Español - Mike Hotek

320 Parte V Gestión de Base de Datos

 

 

Paquetes de Integration Services

Scripts de ActiveX

Al igual que cualquier código ejecutable, cada paso de un job se ejecuta en un contexto de seguridad. El contexto de seguridad predeterminado de un paso de trabajo se corresponde con el inicio de sesión (login) que se establece como propietario del trabajo. Usted puede también anular el contexto de seguridad mediante la especificación de una cuenta proxy que el Agente SQL Server utilizará para el paso del job, basado en las credenciales asignadas a la cuenta proxy.

Para cada paso del job, puede configurar las opciones de control de flujo junto con el registro (loggin) y la notificación.

Nota Cada paso del job podrá volver a intentarse más de 9999 veces, así como esperar un determinado número de minutos entre cada reintento.

Las opciones de control de flujo le permiten especificar una acción para el éxito o el fracaso, de la siguiente manera:

 

 

 

 

Salir del job, reportando el éxito

Salir del job reportando una falla

Ir al siguiente paso

Ir a un número específico de paso en el job

Además de controlar las opciones de flujo, también puede especificar un registro para el paso que se está ejecutando. El registro o loggin puede ser dirigido a un archivo que se sobrescribirá cada vez que el paso se ejecuta o se puede anexar a un archivo existente. También puede iniciar el log de un paso a una tabla, aunque esto no se recomienda debido a la sobrecarga adicional del registro a una tabla versus el registro a un archivo de texto.

Programación del job

Una vez que haya añadido uno o más pasos a su trabajo, está listo para especificar una programación. Al comienzo con SQL Server 2005, los schedules eran definidos como objetos independientes. Como objeto independiente, puede crear una programación y asignar la misma programación a tantos trabajos como sea necesario.

Una programación de trabajo puede ser creada a través del cuadro de diálogo “Administrar programaciones” o bien durante la creación de un job. Algunas de las propiedades que se pueden establecer para un programa son los siguientes:

 

 

 

 

 

Tipo de frecuencia (por ejemplo, diaria, semanal, mensual)

La recurrencia a nivel diario, semanal o mensual

La recurrencia dentro de un día basado en un minuto u hora

Inicio y finalización

Fecha de inicio y finalización para que la programación sea válida

Por ejemplo, puede crear una programación para:

  Ejecutar cada segundo los lunes de cada tercer mes y luego cada 17 minutos entre las

horas 03 a.m. y 19:00

www.detodoprogramacion.com

Page 334: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 21 Agente SQL Server 321

Operadores

El propósito de un operador es proveer un mecanismo para enviar una notificación en base a la configuración ya sea de un trabajo o un alerta. Adjunto al nombre del operador puede estar una dirección de e-mail, número de pager o la dirección de NET SEND. Además, puede designar qué día(s) y operador(es) estarán disponibles, así como la hora de inicio y final de un día laborable.

Nota La hora de inicio y finalización de una jornada de trabajo se basa en la semana laboral estándar de EE.UU. de lunes a Viernes y no se acomoda a cualquier otra definición de semana de trabajo.

En el siguiente ejercicio, creará un operador que se utiliza a continuación para enviar notificaciones de jobs y alertas.

Crear un operador

1. Expanda el nodo Agente SQL Server, haga clic derecho en Operadores y seleccione Nuevo operador.

2. Dé al operador un nombre y especifique una dirección de e-mail.

3. Haga clic en Aceptar y revise el operador que acaba de crear.

www.detodoprogramacion.com

Page 335: Microsoft SQL Server 2008 Español - Mike Hotek

322 Parte V Gestión de Base de Datos

En el siguiente ejercicio, creará un trabajo para ejecutar el procedimiento almacenado de re-indexación que creamos en el capítulo 13, "Funciones", y el procedimiento almacenado de copia de seguridad que hemos creado en Capítulo 20, "Recuperación de datos".

Crear una tarea

1. Haga clic derecho en el nodo Trabajos (Jobs) y seleccione Nuevo trabajo en el menú que aparece haciendo click-derecho.

2. Déle un nombre a su nuevo job, establezca como propietario a “sa”, seleccione Mantenimiento de base de datos para la categoría del trabajo, y agréguele una descripción. El siguiente es un ejemplo:

Nota Las categorías de un trabajo son sólo datos descriptivos que le permiten agrupar trabajos similares en una misma categoría. Usted puede utilizar las categorías ya definidas por SQL Server o puede añadir sus propias categorías, haciendo clic derecho en el nodo Trabajos y seleccionando Administrar categorías de trabajos.

3. Seleccione la página “Pasos” y haga clic en Nuevo para abrir el cuadro de diálogo “Nuevo paso de trabajo“.

4. Especifique un nombre para el paso, el tipo de paso será Transact-SQL, deje “Ejecutar como” en blanco, establezca la base de datos a nuestra base de datos DBAmin y escriba el comando SQL que se muestra en el siguiente gráfico para nuestro procedimiento de copia de seguridad.

www.detodoprogramacion.com

Page 336: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 21 Agente SQL Server 323

5. Haga clic en la página de opciones avanzadas y especifique un archivo de salida C:\Archivos de programa \Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\LOG\ dailymaintenance.txt para el log, y haga clic en Aceptar.

www.detodoprogramacion.com

Page 337: Microsoft SQL Server 2008 Español - Mike Hotek

324 Parte V Gestión de Base de Datos

6. Haga clic en Nuevo para crear el siguiente paso de trabajo para re-indexación, de la siguiente manera:

7. Haga clic en la página de “opciones avanzadas” y especifique el mismo archivo que en el paso 5 y seleccione “Anexar salida a un archivo existente”.

www.detodoprogramacion.com

Page 338: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 21 Agente SQL Server 325

8. Seleccione la página “Programaciones” (Schedules) y haga clic en Nuevo para definir un nuevo programa diario, como se muestra en el siguiente gráfico y haga clic en Aceptar.

Nota Cuando creo programaciones para la medianoche, siempre especifico 1 minuto antes o 1 minuto después de la medianoche. 23:59 o 12:01a.m. para proporcionar más claridad que 12:00 a.m.

9. Haga clic derecho sobre el trabajo recién creado y seleccione “Iniciar trabajo en el paso…”, especifique paso ID1, y haga clic en Inicio. Una vez finalizado el trabajo, observe que usted deberíatener ahora un conjunto de copias de seguridad en el directorio de copia de seguridad y un archivo de registro que se genera para su revisión.

Nota Recuerde que usted ahora tiene un job creado que se ejecutará todos los días y hará una copia de seguridad de sus bases de datos.

Creación de planes de mantenimiento

Los planes de mantenimiento proporcionan un mecanismo para crear gráficamente flujos de trabajo de trabajo que soportan funciones comunes administrativas de copia de seguridad, re-indexación y gestión del espacio.

www.detodoprogramacion.com

Page 339: Microsoft SQL Server 2008 Español - Mike Hotek

326 Parte V Gestión de Base de Datos

Las tareas que son compatibles con los planes de mantenimiento son:

 

 

 

 

 

Copia de seguridad de bases de datos y registros de transacciones

La disminución de las bases de datos (Shrinking)

Re-indexación

Actualización de estadísticas

Realizar comprobaciones de consistencia

Nota Yo no uso planes de mantenimiento. Escribo el script T-SQL para emitir las copias de seguridad directamente usando un job en lugar de utilizar SSIS como motor de copia de seguridad.

En este ejercicio, va a crear un plan de mantenimiento para la copia de seguridad de la base de datos AdventureWorks.

Crear un plan de mantenimiento

1. En el nodo Administración, haga clic derecho en “Planes de mantenimiento”, seleccione Asistente de Plan de Mantenimiento y haga clic en Siguiente.

2. Dé un nombre al Plan, una descripción, seleccione “Programaciones separadas” para cada tarea y haga clic en Siguiente.

3. Seleccione Actualizar estadísticas, copia de seguridad de base de datos (diferencial), Tarea de mantenimiento de Limpieza, y haga clic en Siguiente.

www.detodoprogramacion.com

Page 340: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 21 Agente SQL Server 327

4. Haga clic en Siguiente en la página para ordenar las tareas, dado que no se puede especificar un orden de trabajo cuando tiene programas separados.

5. Seleccione las bases de datos SQL2008SBS y SQL2008SBSFS junto con “Ignorar las bases de datos donde el estado es no en línea”, seleccione “Todas las estadísticas existentes”, especifique una muestra del 25 por ciento, establezca una programación diaria a las 3 A.M. y haga clic en Siguiente.

www.detodoprogramacion.com

Page 341: Microsoft SQL Server 2008 Español - Mike Hotek

328 Parte V Gestión de Base de Datos

6. Seleccione las bases de datos SQL2008SBS y, SQL2008SBSFS junto con “Ignorar las bases de datos donde el estado es no en línea”, “copias de seguridad de la base de datos a disco”, “crear un archivo de copia de base de datos independiente para cada base de datos”, especifique la carpeta de copia de seguridad predeterminada, una extensión de copia de seguridad diff y verificar y comprimir la copia de seguridad. Establezca la programación para cada 4 horas empezando a las 4 am y haga clic en Siguiente.

7. Elimine los archivos de copia de seguridad de más de 1 semana en nuestro directorio de copia de seguridad predeterminada, ejecute la tarea diariamente a las 11 pm, y haga clic en Siguiente.

8. Deje los valores predeterminados para escribir un informe y haga clic en Siguiente. Haga clic en Finalizar para crear el plan de mantenimiento.

9. Actualice el nodo Jobs y observe los nuevos jobs que se han creado para el plan de mantenimiento.

www.detodoprogramacion.com

Page 342: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 21 Agente SQL Server 329

Creación de Alertas

Las alertas ofrecen la posibilidad de enviar una notificación o realizar acciones basadas en eventos o condiciones que se producen tanto en la instancia de SQL Server o en el equipo que aloja su instancia.

Las alertas se pueden configurar como uno de los tres tipos siguientes:

 

 

 

Evento de Servidor SQL

Condición de Rendimiento

Evento Windows Management Instrumentation (WMI)

Una alerta se genera por un evento de SQL Server basado en un número de error o un nivel de gravedad de un error. Usted, además, puede restringir el alerta a una base de datos específica o una cadena de texto específica dentro de un mensaje de error. Cuando un alerta de evento de SQL Server es creado, el Agente SQL Server analiza el “Registro de Eventos de Aplicaciones de Windows” para buscar coincidencias con los criterios de los eventos que se han definido. Por ejemplo, podría disparar un alerta sobre el error severo número 22 para notificarle a un operador que una tabla es sospechosa.

Las alertas de condición de rendimiento se definen sobre contadores en System Monitor, PerfMon. Cuándo se define el alerta, se especifica el objeto, contador, y la instancia que desea supervisar junto con la especificación de una condición para el valor del contador y si el alerta debe ser

www.detodoprogramacion.com

Page 343: Microsoft SQL Server 2008 Español - Mike Hotek

330 Parte V Gestión de Base de Datos

activado cuando el contador es “mayor que”, “menor que” o “igual a” su valor especificado. Por ejemplo, usted podría disparar un alerta para notificarle cuando la cantidad de espacio libre en el disco cae por debajo del 15 por ciento.

Una alerta para un evento de WMI le permite notificar, en base a los eventos que ocurren en el servidor donde está su instancia de SQL Server. Cada vez que se produce un evento en el equipo, si la tarjeta de red está desconectada, si se crea un archivo, si un archivo se elimina, si se escribe el registro (registry), etc, un evento de WMI se genera dentro de Windows. Un alerta WMI crea un detector (listener) para la infraestructura de WMI para disparar la alarma cuando ocurre el evento de Windows.

En este ejercicio, va a crear un alerta para enviar una notificación cuando el porcentaje de espacio del registro de transacciones utilizado para la de base de datos SQL2008SBS supera el 90 por ciento.

Crear una alerta de condición de rendimiento

1. Haga clic derecho en Alertas y seleccione Nueva alerta.

2. Dé un nombre a su alerta y seleccione “Alerta de condición de rendimiento de SQL Server”.

3. Seleccione el objeto “SQLServer: Bases de datos”, el contador “Porcentaje de registro usado”, la instancia SQL2008SBS, y configure el alerta para cuando el contador se eleva por encima 90.

4. Seleccione la página de respuesta, seleccione Notificar a Operadores y seleccione las opciones de notificación para su operador.

5. Seleccione la página Opciones, seleccione Correo electrónico para incluir el texto del alerta por error y haga clic en Aceptar.

www.detodoprogramacion.com

Page 344: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 21 Agente SQL Server 331

Crear una alerta de eventos del servidor SQL

1. Haga clic derecho en Alertas y seleccione Nueva alerta.

2. Dé un nombre a su alerta y seleccione “alerta de evento SQL Server”.

3. Especifique las bases de datos y un error de gravedad 22.

www.detodoprogramacion.com

Page 345: Microsoft SQL Server 2008 Español - Mike Hotek

332 Parte V Gestión de Base de Datos

4. Seleccione la página de respuesta, seleccione Operadores a Notificar y seleccione las opciones de notificación para su operador.

5. Seleccione la página Opciones, seleccione Correo electrónico para incluir el texto del alerta por error y haga clic en Aceptar.

Capítulo 21 Referencia Rápida

Para

Configurar notificaciones

Permitir que SQL Server ejecute código por usted de forma periódica

Haga lo siguiente

Crear un operador con la configuración de notificación que necesita

Configurar un Job dentro del Agente SQL Server para ejecutar el código necesario

Añadir un paso de trabajo (job step) para cada parte de un proceso que necesita ejecutar

Cree una o más programaciones correspondientes al intervalo de veces que necesita ejecutar el trabajo.

Notificar automáticamente cuando se producen eventos o condiciones de rendimiento

Configure un alerta en el Agente SQL Server, correspondiente a los criterios que desea para enviar una notificación.

www.detodoprogramacion.com

Page 346: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 22

Vistas de administración dinámica

Después de completar este capítulo, usted será capaz de

 

 

 

Recuperar información acerca de los objetos dentro de una instancia

Ver la actividad de cualquier base de datos

Identificar posibles cuellos de botella

El término "clase empresarial", ha sido lanzado tanto dentro de la industria, que el significado se ha perdido. Una aplicación de clase empresarial o plataforma no significa que usted puede almacenar o procesar una gran cantidad de datos. Una aplicación de clase empresarial o plataforma proporciona la instrumentación que le permite a los administradores localizar, diagnosticar y solucionar problemas antes de que escalen y afecten el negocio. SQL Server 2008 proporciona una plataforma de gestión de datos de clase empresarial a través de la exposición de la información de diagnóstico en todas las capas del motor. En este capítulo, usted aprenderá acerca de las interfaces de diagnóstico disponibles en SQL Server que se acceden a través de un conjunto de vistas de administración dinámica (DMV).

Visión general de las DMVs Usted puede obtener información acerca de los objetos o el estado operativo de un servidor SQL utilizando un conjunto de vistas y funciones que se incluyen en SQL Server 2008, denominados colectivamente como DMV. SQL Server 2008 incluye más de 200 DMV, todas las cuales se pueden encontrar en el esquema sys.

Con toda la información disponible, es muy fácil perderse. Puede dividir las DMV dentro de aproximadamente 17 categorías amplias. Hay docenas de DMVs para recuperar información sobre objetos tales como sys.credentials, sys.certificates, sys.databases, sys.tables sys.columns sys.indexes, sys.symmetric_keys, etc, varias de las cuales se han presentado a lo largo de este libro. Hay 15 categorías adicionales generales enumeradas en la Tabla 22-1. Las restantes DMV se suelen agrupar en una categoría denominada "otros" para simplificar.

TABLA 22-1 Categorías General de DMV

Propósito de la DMV

Incluye la vista sys.assemblies que proporciona información

sobre ensamblados CLR cargados en la instancia

Proporciona información acerca de las tablas y bases de datos que utilizan la característica de seguimiento de cambios

Conversaciones de Active Service Broker

Prefijo

sys.assembly y sys.dm_clr

sys.change_tracking

sys.conversation

333

www.detodoprogramacion.com

Page 347: Microsoft SQL Server 2008 Español - Mike Hotek

334 Parte V Gestión de Base de Datos

TABLA 22-1 Categorías General de DMV

Propósito de la DMV

Especificaciones de auditoría de base de datos activa (Active database audit)

Configuración y sesiones de “Database mirroring”

Configuración de Service Broker

Diagnósticos de base de datos

Ejecución de tareas

Indexación de Texto completo

Diagnósticos del sistema operativo

Configuración del regulador de recursos

Configuración y sesiones de eventos extendidos

Particionamiento de tablas

Seguimientos de activos

Índice XML y objetos de esquema

Prefijo

sys.database_audit y sys.dm_audit

sys.database_mirroring

sys.dm_broker y sys.service

sys.dm_db

sys.dm_exec

sys.dm_fts y sys.fulltext

sys.dm_os

sys.dm_resource_governor y sys.resource_governor

sys.dm_xe y sys.server_event

sys.partition

sys.trace

sys.xml

Dado que toda la información que usted necesitará siempre se devuelve desde vistas o funciones, no es necesario ningún comando especial o una interfaz para recuperar información sobre una instancia, objeto, o del estado de una operación. Mientras que usted pueda escribir una declaración SELECT, una obligación para ser un administrador de base de datos (DBA), es posible recuperar la información necesaria.

Nota Como se señaló en el capítulo 8, "Recuperación de datos", y en el Capítulo 9, "Recuperación avanzada de datos ", siempre debería construir una declaración SELECT con la lista de columnas explícita. Dentro de los ejemplos mostrados en este capítulo, habrá varios lugares donde se utiliza una instrucción SELECT *. SELECT * se utiliza sólo con fines de aprendizaje hasta que se familiarice con el contenido de varios DMV y No debería utilizarse dentro de cualquier código que se ejecute en producción.

Recuperar metadatos de objetos

Cada objeto que se crea en una instancia tiene una vista correspondiente para recuperar información acerca de todos los objetos de ese tipo. La mayoría de las vistas de metadatos de objeto contienen un ID, el nombre del objeto, y la fecha/hora en que se creó el objeto.

Algunas vistas contienen muchas más columnas de datos que son útiles para propósitos de administración. Por ejemplo, sys.databases no sólo ofrece una lista de todas las bases de datos dentro de una instancia, sino que también le dice el modelo de recuperación, si la base de datos es accesible, y la base de datos fuente en una instantánea de base de datos. Puede ver un ejemplo del aprovechamiento de la vista sys.databases dentro del script de copia de seguridad en el Capítulo 20, "Recuperación de datos".

www.detodoprogramacion.com

Page 348: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 22 Vistas de administración dinámica 335

Generador de script

En el capítulo 8, mencioné que la mayoría de las veces es pasado por alto, sin embargo, la herramienta más poderosa dentro de la "caja de herramientas" de un DBA es una declaración SELECT, en especial la selección de una constante. Con demasiada frecuencia, encuentro DBAs haciendo clic a través del SQL Server Management Studio (SSMS) para realizar tareas repetitivas y luego preguntan por qué no hay suficientes horas en un día para hacer nada. Al aprovechar las DMV junto con la selección de una constante, puede realizar muchas operaciones en una fracción del tiempo que se necesita para usar una interfaz gráfica de usuario. La técnica se conoce como generador de script. Para escribir con eficacia un generador de script, también es necesario conocer la sintaxis T-SQL de las sentencias DDL que tiene que ejecutar, y por ello, he utilizado código en muchos lugares donde otros normalmente le muestran una bonita captura de pantalla.

Cuando concede autoridad SELECT sobre la base de datos, el “principal” puede emitir una declaración SELECT contra cualquier función, vista o tabla dentro de la base de datos. Si usted quisiera solamente conceder autoridad SELECT a las vistas dentro de una base de datos y no a ninguna tabla o función, podría abrir SSMS y gastar una cantidad significativa de tiempo haciendo clic a través de la interfaz gráfica de usuario. Usted podría también aprovechar el DMV sys.views para generar un script que podría ejecutarse en menos tiempo de lo que se necesitaría para conceder la autoridad a una sola vista a través de la interfaz gráfica de usuario.

En el siguiente ejercicio, ejecutará varias DMV de metadatos para familiarizarse con la información que se puede obtener.

Recuperar información acerca de los objetos de la base de datos

1. Ejecute el siguiente script y revise los resultados de cada declaración SELECT (el código se puede

encontrar en el archivo Chapter22\code1.sql):

SELECT * FROM sys.databases SELECT * FROM sys.schemas SELECT * FROM sys.objects SELECT * FROM sys.tables SELECT * FROM sys.columns SELECT * FROM sys.identity_columns SELECT * FROM sys.foreign_keys SELECT * FROM sys.foreign_key_columns SELECT * FROM sys.default_constraints SELECT * FROM sys.check_constraints SELECT * FROM sys.indexes SELECT * FROM sys.index_columns SELECT * FROM sys.triggers SELECT * FROM sys.views SELECT * FROM sys.procedures

www.detodoprogramacion.com

Page 349: Microsoft SQL Server 2008 Español - Mike Hotek

336 Parte V Gestión de Base de Datos

Diagnósticos de bases de datos

La información de diagnóstico con la que un DBA trabaja generalmente para una base de datos se divide en tres grupos: tamaño, indexación y ejecución de la consulta.

Tamaño del objeto

El tamaño debe ser controlado y administrado con fines de planificación de la capacidad. Se puede calcular la utilización del espacio para la base de datos, así como para las tablas, índices y vistas indizadas.

La utilización del espacio para una base de datos se puede recuperar de la columna “tamaño” (size) en la DMV sys.database_files.

El espacio utilizado por una tabla, índice o vista indexada, es un poco más complicado ya que tienes que tratar con múltiples DMV que mapean objetos a través de diferentes estructuras de almacenamiento. Cada objeto en SQL Server 2008 está asociado a una partición, incluso si el objeto no está particionado. Por lo tanto, cada tabla, índice y vista indexada tendrá una entrada en sys.partitions. Sys.partitions identifica una estructura de almacenamiento asociada usando la columna hobt_id column. Dicha columna mapea a sys.allocation_units con la columna container_id. Usted extrae los IDs para la tabla e índice junto con el número de filas desde sys.partitions y el número de páginas usadas desde sys.allocation_units. Luego, para determinar el número total de páginas utilizadas por el objeto, usted necesita sumar las filas y las páginas a través de cada partición. Esto reportará el número de filas junto con el número de páginas que el objeto está utilizando, que puede ser traducido a MB, GB o TB de almacenamiento recordando que una página tiene 8 KB de tamaño.

En el siguiente ejercicio, se recuperará la cantidad de espacio utilizado por cada archivo dentro de una base de datos, así como para cada objeto el consumo de espacio dentro de una base de datos.

Recuperar Tamaños de bases de datos y objetos

1. Ejecute la siguiente secuencia de comandos y revise los resultados de cada declaración SELECT (el código puede encontrarse en el archivo Chapter22\code1.sql):

SELECT * FROM sys.database_files

2. Ejecute el siguiente script y revise los resultados de cada declaración SELECT (el código puede

encontrarse en el archivo Chapter22\code1.sql):

SELECT * FROM sys.partitions SELECT * FROM sys.allocation_units SELECT object_name(a.object_id), c.name, SUM(rows) rows,

SUM(total_pages) total_pages, SUM(used_pages) used_pages, SUM(data_pages) data_pages

FROM sys.partitions a INNER JOIN sys.allocation_units b ON a.hobt_id = b.container_id INNER JOIN sys.indexes c ON a.object_id = c.object_id and a.index_id = c.index_id

GROUP BY object_name(a.object_id), c.name ORDER BY object_name(a.object_id), c.name

www.detodoprogramacion.com

Page 350: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 22 Vistas de administración dinámica 337

Índices

La solidez de la indexación dentro de una base de datos puede hacer la diferencia entre una aplicación que tiene buen rendimiento y una que tiene mal rendimiento. Hacer un seguimiento de la frecuencia con que se utiliza un índice, ayuda o bien a determinar si se puede eliminar el índice para salvar la sobrecarga de mantenimiento, o si usted necesita dividir el índice en un grupo separado de discos. Además, el seguimiento y control de la fragmentación de índices puede significar la diferencia entre si SQL Server selecciona el índice para satisfacer una consulta o si el camino elegido es menos óptimo.

SQL Server tiene dos funciones, sys.dm_db_index_operational_stats y sys.dm_db_index_physical_stats, junto con una vista, sys.dm_db_index_usage_stats, para ayudar a controlar los índices que se han creado. sys.dm_db_index_operational_stats proporciona las estadísticas de actividad de ejecución para cada índice, por ejemplo, cuantas escrituras se han producido a nivel hoja y a nivel no hoja, la distribución de las operaciones de exploración y lecturas de búsqueda, cuántos bloqueos ocurrieron dentro de las filas del índice, y cuánto tiempo los procesos en el índice han tenido que esperar para estar disponibles. sys.dm_db_index_physical_stats devuelve el porcentaje de fragmentación junto con el número de páginas que se utilizan por el índice actualmente. Aunque sys.dm_db_index_operational_stats le dirá cuánta actividad se está produciendo contra un índice, sys.dm_db_index_physical_stats le dirá en qué extensión el índice se está fragmentado, así usted puede decidir si desea volver a generar o reorganizar el índice para eliminar la fragmentación.

Los índices que existen, pero no son utilizados por SQL Server pueden ser tan costosos como uno muy fragmentado. sys.dm_db_index_usage_stats le dirá la cantidad de actividad y de qué tipo se está ejecutado contra un índice, junto con la última vez que el índice tuvo actividad. Si usted encuentra que un índice no tiene ningún pedido, exploración o búsqueda, o si la última vez que un pedido, exploración, o búsqueda se emitió hace mucho tiempo, el índice es un buen candidato a eliminarse.

Recuperar Estadísticas de índice

1. Ejecute la siguiente secuencia de comandos y revise los resultados (el código puede encontrarse en el archivo Chapter22\code1.sql):

SELECT * FROM sys.dm_db_index_operational_stats(NULL,NULL,NULL,NULL) SELECT * FROM sys.dm_db_index_physical_stats(NULL,NULL,NULL,NULL,NULL)

2. Ejecute la siguiente secuencia de comandos y revise los resultados (el código puede encontrarse en el archivo Chapter22\code1.sql):

SELECT * FROM sys.dm_db_index_usage_stats

Aunque se sabe que la adición de índices a una tabla puede mejorar rendimiento de las consultas, la tarea que supone un desafío para muchos es elegir los índices correctos. Usted quiere crear suficientes índices para mejorar el rendimiento de las consultas, sin producir tantos que hagan que el rendimiento de las transacciones se vea afectado.

www.detodoprogramacion.com

Page 351: Microsoft SQL Server 2008 Español - Mike Hotek

338 Parte V Gestión de Base de Datos

Una forma de encontrar los índices adecuados que se deben crear, es construir un sistema de prueba con una gran muestra lo suficientemente representativa de datos, y ejecutar el conjunto de consultas contra los datos para evaluar las distintas opciones de indización. La otra manera de encontrar los índices que usted necesita crear es hacer que SQL Server "decida por usted".

Todas las consultas pasan por el optimizador para determinar la mejor ruta para encontrar los datos que se están solicitando. El optimizador evalúa los argumentos de búsqueda contra todos los índices que están disponibles en la tabla. Si se encuentra un índice apropiado para satisfacer la consulta, SQL Server la ejecuta mediante dicho índice. Sin embargo, si el optimizador no encuentra un índice adecuado para satisfacer la consulta, hay un "índice perdido". SQL Server registra cada “index miss” en la vistas sys.dm_db_missing_index visitas*. La sys.dm_db_missing_index_group_stats mantiene un total acumulado en la columna user_seeks de las veces que una consulta se podría haber satisfecho, si un determinado índice se hubiera creado. Al aprovechar la columna user_seeks en conjunto con un par de factores de ponderación, avg_total_user_cost y avg_user_impact, usted puede obtener información adicional en cuanto a si un determinado índice sería beneficioso.

En el siguiente ejercicio, tendrá que trabajar con las vistas sys.dm_db_missing_index* para obtener una comprensión de los índices que pueden ser útiles para crear.

Nota Los cálculos estadísticos proporcionados sólo cuentan para el beneficio de una sentencia SELECT. El impacto en las operaciones de escritura no es parte del cálculo, pero deberían tenerse en cuenta antes de crear un índice.

Determinar los índices a crear

1. Ejecute la siguiente secuencia de comandos y revise los resultados (el código puede encontrarse en el archivo Chapter22\code1.sql):

SELECT * FROM sys.dm_db_missing_index_details SELECT * FROM sys.dm_db_missing_index_group_stats SELECT * FROM sys.dm_db_missing_index_groups

2. Ejecute el siguiente script de agregación y revise los resultados (el código puede encontrarse en

el archivo Chapter22\code1.sql):

SELECT * FROM (SELECT user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)

AS index_advantage, migs.* FROM sys.dm_db_missing_index_group_stats migs) AS migs_adv

INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs_adv.group_handle = mig.index_group_handle

INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle

ORDER BY migs_adv.index_advantage

www.detodoprogramacion.com

Page 352: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 22 Vistas de administración dinámica 339

3. Ejecute el siguiente código para forzar un índice perdido contra la base de datos AdventureWorks

(el código puede encontrarse en el archivo Chapter22\code1.sql):

SELECT City,PostalCode FROM Person.Address WHERE City IN ('Seattle','Atlanta') SELECT City,PostalCode,AddressLine1 FROM Person.Address WHERE City = 'Atlanta' SELECT City,PostalCode,AddressLine1 FROM Person.Address WHERE City like 'Atlan%'

4. Ejecutar el script de agregación de nuevo y examine los resultados (el código puede encontrarse en el Archivo Chapter22\code1.sql):

SELECT * FROM (SELECT user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)

AS index_advantage, migs.* FROM sys.dm_db_missing_index_group_stats migs) AS migs_adv

INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs_adv.group_handle = mig.index_group_handle

INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle

ORDER BY migs_adv.index_advantage

5. Ejecute el siguiente script para ejecutar repetidamente una declaración SELECT y revise los nuevos resultados de la secuencia de comandos de agregación (el código se puede encontrar en el archivo Chapter22\code1.sql):

SELECT City,PostalCode,AddressLine1 FROM Person.Address WHERE City like 'Atlan%' GO 100 SELECT * FROM (SELECT user_seeks * avg_total_user_cost * (avg_user_impact * 0.01)

AS index_advantage, migs.* FROM sys.dm_db_missing_index_group_stats migs) AS migs_adv

INNER JOIN sys.dm_db_missing_index_groups AS mig ON migs_adv.group_handle = mig.index_group_handle

INNER JOIN sys.dm_db_missing_index_details AS mid ON mig.index_handle = mid.index_handle

ORDER BY migs_adv.index_advantage

Estadísticas de ejecución de consultas

Las DMV más frecuentemente usadas devuelven información acerca de las conexiones y consultas que se están ejecutando dentro de una instancia. La tabla 22-2 enumera las vistas y las funciones que se utilizan para recuperar información de ejecución de consulta.

www.detodoprogramacion.com

Page 353: Microsoft SQL Server 2008 Español - Mike Hotek

340 Parte V Gestión de Base de Datos

TABLA 22-2 DMV de ejecución de consultas

Propósito

Contiene una fila para cada sesión, el inicio de sesión (login) asociado, el consumo de CPU/memoria/lecturas/escrituras, y las opciones SET activas. Incluye sesiones debido a conexiones externas, así como los procesos que se ejecutan dentro del motor de SQL Server.

Enumera cada conexión que se origina fuera de la instancia. Seguimiento de cuando se ha realizado la conexión, el tiempo de la última actividad, el número de lecturas/escrituras, y el identificador a la sentencia de SQL ejecutada más reciente.

Proporciona todas las consultas que se están ejecutando junto con la gestión de la instrucción SQL y el plan de consulta. La columna blocking_session_id especificará la sesión que está manteniendo un bloqueo que está causando que la sesión sea bloqueada. Cuando es posible calcula, el porcentaje completado junto con una estimación de la hora de finalización.

Proporciona todos los planes de consulta que se han compilado

y almacenado en la caché de consultas junto con el número de veces que cada plan almacenado en caché se ha utilizado.

Contiene información acerca de cada consulta que ha sido ejecutada, la frecuencia de ejecución, y la cantidad de recursos consumidos por una determinada consulta.

Contiene estadísticas de rendimiento de cada procedimiento almacenado que ha sido ejecutado.

Cuando se transmite un identificador del plan, devolverá el correspondiente plan de consulta en un formato XML.

Cuando se transmite un identificador de SQL, devolverá el correspondiente texto de la sentencia SQL.

DMV

sys.dm_exec_sessions

sys.dm_exec_connections

sys.dm_exec_requests

sys.dm_exec_cached_plans

sys.dm_exec_query_stats

sys.dm_exec_procedure_stats

sys.dm_exec_query_plans

sys.dm_exec_sql_text

En el siguiente ejercicio, se recupera una lista de conexiones que están ejecutando solicitudes, junto con la consulta que se está ejecutando.

Determinar Estadísticas de Ejecución

1. Ejecutar la siguiente secuencia de comandos y revise los resultados (el código puede encontrarse en el archivo Chapter22\code1.sql):

SELECT query_plan, text, * FROM sys.dm_exec_requests CROSS APPLY sys.dm_exec_query_plan(plan_handle)

CROSS APPLY sys.dm_exec_sql_text(sql_handle)

www.detodoprogramacion.com

Page 354: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 22 Vistas de administración dinámica 341

Capítulo 22 Referencia rápida

Para

Recuperar los metadatos sobre los objetos dentro de una base de datos o instancia

Determinar el espacio actualmente

asignado a una base de datos

Devolver una lista de espacio consumido por índices, tablas y vistas indexadas

Encontrar índices que no están siendo utilizados

Haga lo siguiente

Ejecutar SELECT <columns> FROM sys.<object type>

Utilice la vista sys.database_files

Haga join entre sys.partitions y sys.allocation_units

Localice los índices que no tienen ningún pedido, exploración o búsquedas o no han tenido un pedido, exploración, o búsqueda en un largo período de tiempo

Utilice la función sys.dm_db_index_physical_stats

Combine las vistas sys.dm_db_missing_index*

Las consultas que se estén ejecutando actualmente se pueden encontrar en la vista sys.dm_exec_requests. Usted puede utilizar el operador CROSS APPLY con las funciones sys.dm_exec_query_plan y sys.dm_exec_sql_text , para devolver el plan de consulta y la sentencia SQL

Decidir qué índices deben ser desfragmentados

Dejar que SQL Server cee una lista de Índices que usted debe considerar para crear

Recuperar la instrucción SQL y el plan de consulta para las consultas en ejecución

www.detodoprogramacion.com

Page 355: Microsoft SQL Server 2008 Español - Mike Hotek

Parte VI

Alta disponibilidad (Visión general)

En esta parte:

Capítulo 23: Alta disponibilidad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345

343

www.detodoprogramacion.com

Page 356: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23

Alta disponibilidad

Después de completar este capítulo, usted será capaz de

Instalar y configurar una instancia de cluster de conmutación por error (failover).

Instalar y configurar un espejado de base de datos (mirroring)

Instalar y configurar el envío de registros (log shipping)

Instalar y configurar el servicio de replicación Nota Usted tendrá que tener tres instancias de SQL Server 2008 instaladas para completar las prácticas en este capítulo.

A pesar de la mejor de las planificaciones, siempre ocurrirá la situación que puede llevar su base

de datos a quedar fuera de línea. Con el fin de lograr la máxima disponibilidad de sus datos,

SQL Server 2008 incluye cuatro importantes características que le permiten construir sistemas

sólidos. En este capítulo usted aprenderá acerca de los clústeres de conmutación por error, el

espejado de base de datos, el envío de registros, y la replicación.

Clústeres de conmutación por error (Failover Clustering) Construido sobre los clústeres de Windows, SQL Server Failover Clustering permite instalar

múltiples servidores y nodos debajo de una instancia. En el caso de un fallo de hardware, otro

servidor puede tomar automáticamente el control y asegurarse de que las bases de datos

siguen siendo accesibles por las aplicaciones. Las agrupaciones de SQL Server (cluster) son grupos de una o varias instancias. Un cluster de una “instancia única” es un clúster de Windows que tiene exactamente una instancia de SQL Server instalada. Un cluster de “instancias múltiples” es un clúster de Windows que tiene más de una instancia de SQL Server. Lo que hace que no importe en qué nodo usted configuró para que se ejecuten las instancias, la terminología se mantiene igual.

Componentes de instancia del clúster de conmutación por error

Cuando se instala una instancia stand-alone, los administradores de bases de datos (DBAs)

no se preocupan por las direcciones IP, nombres de red, o incluso la presencia de unidades de

disco. Cada uno de estos componentes tiene que considerarse, en cambio, cuando se instala

una instancia de SQL Server en un clúster.

345

www.detodoprogramacion.com

Page 357: Microsoft SQL Server 2008 Español - Mike Hotek

346 Parte VI Descripción de alta disponibilidad

Los componentes que se necesitan para una instancia de conmutación por error de SQL Server son los siguientes:

 

 

 

 

 

Direcciones IP

Los nombres de red

Las unidades de disco de la matriz (array) de unidad compartida

Servicios de SQL Server

Las cuentas de servicio

Configuración de la red

Cada instancia de SQL Server instalada en un clúster debe tener una dirección IP única, que debe estar en el segmento de la red pública configurada en el clúster. Ligado a cada dirección IP está un nombre único de red que se registrará en el DNS por lo que el Servidor SQL puede ser resuelto por nombre.

Configuración de disco

Debe configurar cada instancia de SQL Server en cluster, con un conjunto dedicado de letras de unidad. En un servidor independiente (stand-alone), varias instancias pueden almacenar bases de datos en la misma unidad o incluso en el mismo directorio que las demás instancias. En un cluster, las unidades se montan a un nodo particular en cualquier momento dado. Cualquier otro nodo no tiene acceso a esas unidades. Puede configurar una instancia de SQL Server para ejecutarse en cualquier nodo. Si se pudiera configurar más de una instancia de SQL Server en cluster para almacenar bases de datos en la misma letra de unidad, sería posible crear una configuración en la que la instancia se está ejecutando en un nodo, mientras que otro nodo tiene la propiedad de los discos, haciendo así que la instancia de SQL Server deje de funcionar.

El concepto de configuraciones de discos en un clúster de SQL Server se conoce como “instante-to-disk.ratio”. Aunque una instancia agrupada (custered) de SQL Server puede referirse a más de una letra de unidad, una letra de la unidad puede estar asociada a una única instancia agrupada de SQL Server. Además, una letra de unidad debe ser configurada como una dependencia del servicio de SQL Server permitiendo almacenar bases de datos.

Configuración de seguridad

Es necesario configurar cada servicio de SQL Server con una cuenta de servicio. En general, debería utilizar una cuenta diferente para cada servicio de SQL Server: para SQL Server, Agente SQL Server, y Full Text (Texto completo).

Aunque las cuentas no necesitan ningún privilegio especial, deben ser cuentas de dominio porque el identificador de seguridad (SID) para una cuenta local no puede ser resuelto en otra máquina.

www.detodoprogramacion.com

Page 358: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 347

SQL Server 2008 no requiere cuentas de servicio con autoridad administrativa en Windows. Esto ha creado una situación en la que una cuenta de Windows puede tener docenas de permisos individuales concedidas a la misma, tales como permisos de acceso al registro, acceso al directorio y acceso a archivos. Cambiar las cuentas de servicio sería muy complicado porque tendría que asignar todos estos permisos individuales para la nueva cuenta de servicio, para asegurarse que los servicios continúen funcionando con normalidad.

Con el cambio en la infraestructura de seguridad, las cuentas de Windows para los servicios de SQL Server 2008 están diseñadas para seguir prácticas aceptadas por la industria para la gestión de cuentas de Windows. A los Grupos de Windows se les conceden permisos sobre los diversos recursos que se accederán. Las cuentas de Windows entonces son agregadas a sus respectivos grupos para obtener acceso a los recursos.

En una máquina independiente (stand-alone), estos grupos se crean de forma predeterminada de la forma : SQLServerMSSQLUser$<machine name>$<instance name>, y SQLServerSQLAgentUser$<machine name>$<instance name>. SQL Server Setup asigna automáticamente los permisos de los directorios, claves de registro y otros recursos necesarios para permitir que un servidor SQL Server funcione para el grupo apropiado. Luego agrega la cuenta de servicio al grupo respectivo.

Aunque este proceso funciona en una máquina independiente, no es tan sencillo en un clúster. Dentro del clúster, una instancia SQL Server de clúster de conmutación por error, puede ejecutarse en cualquier máquina física en el cluster. Los grupos locales de Windows no tienen un contexto de seguridad válido entre todas las máquinas. Por lo tanto, los grupos para las cuentas de servicio de SQL Server se deben crear en el nivel de dominio.

La rutina de instalación no supone que usted tenga la facultad de crear grupos en el dominio. Es necesario crear estos grupos de dominio antes de instalar una instancia de clúster de conmutación por error SQL Server. Usted tiene que definir tres grupos dentro del dominio, los cuales tienen los siguientes propósitos:

 

 

 

Cuenta de servicio de SQL Server

Cuenta de servicio de Agente SQL Server

Cuenta de SQL Server Full Text Search Daemon

Usted especifica los grupos que se crean durante la fase final de la rutina de instalación.

Controles de estado

El clustering realiza dos controles de estado sobre una instancia clúster por conmutación de errores de Sql Server. La primera verificación realizada es la prueba LooksAlive, que es un ping desde cada nodo del clúster a la Dirección IP de la instancia de SQL Server. Sin embargo, una prueba de ping no indica que una instancia está disponible, el ejemplo podría ser la respuesta a un ping, pero aún así ser inaccesible.

Para detectar problemas de disponibilidad de SQL Server, se lleva a cabo un segundo control, la prueba IsAlive. Esta prueba crea una conexión a la instancia de SQL Server y emite SELECT @ @ SERVERNAME. El SQL Server debe devolver un conjunto de resultado válido para pasar este chequeo de estado.

www.detodoprogramacion.com

Page 359: Microsoft SQL Server 2008 Español - Mike Hotek

348 Parte VI Descripción de “alta disponibilidad”

Clúster de conmutación por error (Failover Cluster)

Si cualquier chequeo de estado falla, el cluster inicia una “conmutación por error” (failover) de la instancia de SQL Server. El primer paso en el proceso de conmutación por error es reiniciar SQL Server en el mismo nodo. La instancia se reinicia en el mismo nodo, porque el cluster primero asume que fue un error transitorio el que causó que falle el control de estado.

Si el arranque no responde de inmediato, el cluster de SQL Server conmuta a otro nodo en el clúster (nodo secundario). El nombre de red del servidor SQL no está registrado desde DNS. La dirección IP del Servidor SQL está asociada a la tarjeta de interfaz de red (NIC-Network interface card) en el nodo secundario. Los discos asociados a la instancia de SQL Server están montados en el nodo secundario. Después que la dirección IP está asociada a la tarjeta de red en el nodo secundario, el nombre de red de la instancia SQL Server es registrada en el DNS. Después de que el nombre de la red y los discos están en línea, el Servicio SQL Server es iniciado. Después de que el servicio SQL Server se inicia, se inician el Agente SQL Server y la Indexación de Texto-Completo.

Independientemente de si la instancia se ha reiniciado en el mismo nodo o en un nodo secundario, la instancia de SQL Server se cierra y se reinicia. Cualquier transacción que no se haya completado, cuando se inicia el proceso de conmutación por error, se revierte cuando se reinicia el Servidor SQL. Tras reiniciar, continúa el proceso normal de recuperación.

En general, un clúster "conmutará por error" entre 10 y 15 segundos. El tiempo de conmutación por error se ve afectado principalmente por el registro en el DNS.

Más información Dado que una discusión de Virtual Server (Servidor virtual), así como Windows clustering, va mucho más allá del alcance de este libro, por favor consulte: MCTS Self-Paced Training Kit (Exam 70-432): Microsoft® SQL Server® 2008—Implementation and Maintenance from Microsoft Press..

Database Mirroring (espejado) A pesar de que la conmutación por error proporciona redundancia de hardware, sólo existe una única copia de la base de datos en el array de unidad compartida. Si sólo necesitaba planificar el fracaso del servidor, entonces la conmutación por error sería suficiente para satisfacer sus necesidades de disponibilidad. Sin embargo, la falla de hardware más común, “las unidades de disco”, sólo puede ser mitigada teniendo una segunda copia de la base de datos en otra máquina.

El espejado de la base de datos mantendrá una segunda copia de una base de datos en otra máquina de forma que usted estará protegido de fallas de servidor y de almacenamiento. Por desgracia, sólo se puede utilizar database mirroring con bases de datos que no tengan un grupo de archivos habilitado para FILESTREAM.

www.detodoprogramacion.com

Page 360: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 349

Roles de Database mirroring

Hay dos roles de espejado de base de datos obligatorios y un tercer rol opcional. Usted debe designar una base de datos en un rol principal y otra base de datos en un rol espejo (mirror rol). También puede, opcionalmente, designar una instancia de SQL Server en el rol de “servidor testigo” (witness server) para gobernar conmutación por error automático desde la base de datos principal al espejo.

Las bases de datos designadas en el rol de director o principal y espejo, forman una sesión de database mirroring. Puede configurar un servidor testigo opcional para cada sesión, y un solo servidor testigo puede gestionar múltiples sesiones de creación de database mirroring.

Rol Principal

La base de datos que usted configura con el rol principal, se convierte en la fuente u origen de todas las transacciones en una sesión de database mirroring. La base de datos principal, o primaria, es recuperada y permite conexiones y las aplicaciones pueden leer datos desde ella y escribir datos en ella.

Rol Espejo (Mirror)

La base de datos que usted define en el rol espejo es la base de datos “pareja” de la base de datos principal y recibe continuamente transacciones. El proceso de creación de reflejo de base de datos está constantemente reproduciendo las transacciones de la base de datos principal en el registro de transacciones y haciendo flushing(*) del registro de transacción a los archivos de datos en la base de datos espejo de modo que la base de datos espejo incluye los mismos datos como base de datos principal. La base de datos espejo está en un estado de recuperación, por lo que no permite conexiones de ningún tipo, y no se pueden escribir transacciones directamente sobre ella. Sin embargo, puede crear una instantánea de base de datos contra una base de datos espejo, para darle a los usuarios acceso de sólo lectura a los datos de la base de datos en un punto específico en el tiempo. (*) Flushing: copiar datos de almacenamiento temporario a un medio de almacenamiento permanente. (N. del T.)

Los roles principal y espejo son estados de funcionamiento transitorios dentro de una sesión de database mirroring. Debido a que las bases de datos son exactamente equivalentes y se mantienen en sincronización unas con otras, cualquiera de las base de datos pueden asumir el papel de principal o espejo en cualquier momento.

Servidor Testigo (Witness)

El rol de servidor testigo es el tercer rol (opcional) que puede definir para el espejado de la base de datos. El único propósito del testigo es el de servir como un árbitro dentro del modo de operaciones de alta disponibilidad para garantizar que la base de datos puede ser servida en una sola instancia de SQL Server a la vez. Si una base de datos principal falla, y el testigo confirma el fallo, la base de datos espejo puede tomar el papel primario y hacer que sus datos estén disponibles para los usuarios.

Aunque la creación del espejo de base de datos permite que un principal y un espejo sólo se produzcan en pares (por ejemplo, un principal no puede tener más de un espejo, y viceversa); un servidor testigo puede dar servicio a varios pares de reflejo de base. La vista de catálogo sys.database_mirroring_witnesses almacena una sola fila para cada par de espejo de base que es atendida por el testigo.

www.detodoprogramacion.com

Page 361: Microsoft SQL Server 2008 Español - Mike Hotek

350 Parte VI Descripción de alta disponibilidad

Roles a nivel de base de datos vs. Roles a nivel servidor

Los roles del principal y del espejo se producen a nivel de base de datos y se deben definir dentro de las instancias de SQL Server 2008 que son de edición Standard o Enterprise. Sin embargo, usted define el rol del testigo a nivel de instancia. La instancia de SQL Server 2008 que se utiliza para el servidor testigo puede ser de cualquier edición, incluyendo SQL Server Express Edition, razón por la cual nos referimos a una base de datos principal o espejo, pero no un servidor testigo.

Extremos de Database Mirroring (endpoints)

Todo el tráfico de replicación de bases se transmite a través de un extremo TCP con una carga de DATABASE_MIRRORING. Sólo se puede crear un extremo de Database Mirroring por instancia de SQL Server.

Puede asignar un nombre a cada extremo que cree. El nombre de un extremo de Database Mirroring se utiliza sólo cuando se cambia el estado o se emite la declaración GRANT/REVOKE. Debido a que el nombre del extremo sólo es utilizado por un DBA para operaciones internas, se recomienda que deje el nombre del espejado configurado en su valor por defecto.

En el siguiente ejercicio, usted espejará la base de datos SQL2008SBS. Esta práctica supone que tiene tres servidores separados, cada uno con una instancia de SQL Server. Las instancias que alojan el principal y el espejo deben ser de SQL Server 2008 Standard Edition y superior. La instancia que aloja el testigo puede ser cualquier edición de SQL Server 2008. Usted tendrá que sustituir los nombres de las instancias en los pasos de código que siguen a continuación.

Nota Si sus instancias están instaladas en el mismo servidor, el número de puerto debe ser diferente para cada extremo (endpoint) para no crear un conflicto en la pila TCP/IP. SQL Server Management Studio (SSMS) tiene una interfaz para configurar extremos de database mirroring y configurar, conmutación por error (failover), pausa, reanudación y para la re-configuración del modo de una sesión de database mirroring. Usted puede acceder a esta interfaz gráfica de usuario, haciendo clic-derecho en una base de datos, seleccionando “Propiedades” y, a continuación, seleccionando la página Espejado (Mirroring) en el cuadro de diálogo “Propiedades de la base de datos”.

Crear extremos de Database Mirroring

1. Ejecute la siguiente consulta en la instancia principal (el código está en el archivo Chapter23 \ code1.sql):

CREATE ENDPOINT Mirroring

AUTHORIZATION <principal instance> STATE=STARTED AS TCP (LISTENER_PORT = 5024, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS

NEGOTIATE , ENCRYPTION = REQUIRED ALGORITHM RC4)

www.detodoprogramacion.com

Page 362: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 351

2. Ejecute la siguiente consulta en la instancia espejo (el código está en el archivo Chapter23\ code1.sql):

CREATE ENDPOINT Mirroring AUTHORIZATION <mirror instance> STATE=STARTED AS TCP (LISTENER_PORT = 5024, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = PARTNER, AUTHENTICATION = WINDOWS

NEGOTIATE , ENCRYPTION = REQUIRED ALGORITHM RC4)

3. Ejecute la siguiente consulta en el servidor testigo (el código está en el archivo Chapter23\ code1.sql):

CREATE ENDPOINT Mirroring AUTHORIZATION <witness instance> STATE=STARTED AS TCP (LISTENER_PORT = 5024, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE = WITNESS, AUTHENTICATION =

WINDOWS NEGOTIATE , ENCRYPTION = REQUIRED ALGORITHM RC4)

4. Conéctese a cada instancia y verifique los extremos (endpoints) que acaba de crear mediante la ejecución de los siguientes comandos (el código está en el archivo Chapter23\code1.sql):

SELECT * FROM sys.database_mirroring SELECT * FROM sys.database_mirroring_endpoints SELECT * FROM sys.database_mirroring_witnesses

Modos de funcionamiento

Usted puede configurar el espejado de bases de datos para tres modos de funcionamiento diferentes: Alta disponibilidad, Alto rendimiento y Alta seguridad. El modo de funcionamiento gobierna la forma que SQL Server transfiere las transacciones entre la base de datos principal y la de espejo, así como los procesos de failover que están disponibles en la sesión de Database Mirroring.

Modo de funcionamiento: Alta Disponibilidad

El modo de alta disponibilidad proporciona una transferencia sincrónica duradera entre la base de datos principal y la de espejo, así como la detección automática de falla y la conmutación por error (failover) automática.

SQL Server primero escribe todas las transacciones en los buffers de memoria dentro del espacio de memoria de SQL Server. El sistema escribe estos buffers de memoria al registro de transacciones. Cuando SQL Server escribe la transacción en el registro de transacciones, el sistema activa el reflejo de base para comenzar la transferencia de las filas del registro de transacciones para una transacción determinada para el espejo. Cuando la aplicación emite una confirmación de la transacción, la transacción es primero confirmada (commit) en la base de datos espejo. Un acuse de recibo (acknowledgment) de la confirmación se envía al principal, que entonces permite que la confirmación (commit) sea emitida también en el principal. Después que se emite la confirmación en el principal, el acuse de recibo (acknowledgment) se envía de vuelta a la aplicación, lo que le permite continuar con el procesamiento. Este proceso garantiza que todas las transacciones se confirman y se guardan en el registro de transacciones de ambas bases de datos (la principal y la espejo), antes que la confirmación se envíe a la aplicación.

www.detodoprogramacion.com

Page 363: Microsoft SQL Server 2008 Español - Mike Hotek

352 Parte VI Descripción de alta disponibilidad

La forma en que Database Mirroring maneja las transacciones, la separa de otras tecnologías de redundancia tales como el envío de registros (log shipping) y la replicación, que deben esperar que una transacción se complete antes de que se pueda transferir a la otra máquina. Database Mirroring transmite los registros a medida que ellos son escritos al principal. Por procesar de esta manera, database mirroring puede manejar transacciones que afectan a un gran número de filas con un muy bajo impacto para las aplicaciones. De hecho, a medida que el tamaño medio de transacciones aumenta, el impacto de la transferencia de datos sincrónica para la base de datos espejo disminuye. La disminución del impacto ocurre porque el acuse de recibo requerido para el modo de funcionamiento de alta disponibilidad requiere un porcentaje menor del tiempo total de ejecución de la transacción, a medida que el tamaño de la transacción se incrementa.

La transferencia sincrónica de datos plantea un problema de planificación de las aplicaciones. Debido a que una transacción no se considera confirmada hasta que SQL Server ha cometido (committed) con éxito al registro de transacciones tanto en las bases de datos principal como la espejo, el modo de funcionamiento de alta disponibilidad incurre en una sobrecarga de rendimiento para las aplicaciones. A medida que la distancia entre el principal y las instancias espejo, aumenta, el impacto en el rendimiento también aumenta.

El modo de operación de alta disponibilidad requiere de un servidor testigo junto con las bases de datos principal y espejo, para detectar automáticamente un fallo en el principal y conmutar por error al espejo. Para detectar el fallo, el modo de funcionamiento de alta disponibilidad utiliza un simple “ping” entre cada instancia participante en la sesión de Database Mirroring.

Cuando la sesión de database mirroring conmuta por error, SQL Server revierte los roles del principal y el espejo. SQL Server promueve la base de datos espejo a principal y comienza a servir a la base de datos, a continuación pasa la base de datos principal a espejo. SQL Server también automáticamente invierte el flujo de la transacción. Este proceso es una mejora significativa sobre otros métodos de disponibilidad tales como la replicación o envío de registros (log shipping), que requieren la intervención manual o incluso la reconfiguración para invertir el flujo de la transacción.

En este proceso automático de conmutación por error, el espejo se promueve por si mismo a principal y comienza a servir la base de datos. Pero primero, el servidor testigo debe arbitrar la conmutación por error y la reversión de rol requiriendo dos de los tres roles de database mirroring, o un quórum para acordar la promoción. Un quórum es necesario para evitar que la base de datos sea servida desde más de una instancia dentro de la sesión de database mirroring. Si el principal fallara y el espejo no se pudiera conectar con el testigo, sería imposible alcanzar un quórum y SQL Server no promovería el espejo a principal.

Modo de funcionamiento: Alto rendimiento

El modo de funcionamiento de alto rendimiento utiliza una base de datos principal y un espejo, pero no necesita un servidor testigo. Este modo de funcionamiento proporciona una configuración de espera activa que no soporta la detección automática de fallos o conmutación por error automática.

www.detodoprogramacion.com

Page 364: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 353

El modo de funcionamiento de alto rendimiento no conmuta automáticamente por error porque las transacciones son enviadas al espejo de forma asincrónica. Las transacciones son confirmadas (committed) a la base de datos principal y el acuse de recibo enviado a la aplicación. Un proceso separado envía constantemente las transacciones para el espejo, que introduce latencia en el proceso. Esta latencia impide que una sesión de database mirroring realice de forma automática la conmutación por error ya que el proceso no puede garantizar que el espejo ha recibido todas las transacciones cuando se produce un error.

Debido a que la transferencia es asincrónica, el modo de funcionamiento High Performance no afecta al rendimiento de las aplicaciones, y usted puede tener una mayor separación geográfica entre la base principal y la base espejo. Sin embargo, debido a que la transferencia de datos es asincrónica, puede perder transacciones en el caso de un fallo en el principal o cuando fuerza una conmutación por error en la sesión de espejado.

Modo de funcionamiento: Alta Seguridad

El modo de alta seguridad transfiere las transacciones sincrónicamente, pero no tiene un servidor testigo. La transferencia sincrónica garantiza que todas las transacciones confirmadas en el principal son confirmadas primero en el espejo y eso requiere las mismas consideraciones de rendimiento que para el modo de funcionamiento de Alta disponibilidad (visto anteriormente). Sin embargo, la falta de un testigo impide la conmutación automática al espejo en el caso de un fallo en el principal. Si el principal falla en el modo de Alta Seguridad, debe promover manualmente el espejo para servir a la base de datos.

Una conmutación por error manual sin la pérdida potencial de transacciones sólo es posible en el modo de alta seguridad. Cuando usted realiza manualmente la conmutación por error en el modo de funcionamiento de alta seguridad, SQL Server 2008 desconectará todos las conexiones desde la base de datos principal y cambiará el estado de la sincronización, evitando que se creen conexiones nuevas. La cola del registro de transacción se envía al espejo y luego los roles del principal y el espejo son invertidos. Una vez que los roles se invierten, los clientes pueden volver a conectarse a la base de datos y continuar procesando transacciones.

Almacenamiento en caché

Cada tecnología de alta disponibilidad disponibles en SQL Server 2008 tiene un rendimiento y, posiblemente, consecuencias en la aplicación durante una conmutación por error. El “Clustering” evita los problemas de aplicación, ya que utiliza sólo una instancia, sin embargo, la instancia debe reiniciarse en otro nodo, causando así que los cachés de datos y de consulta sean repoblados. El “Envío de registros” (Log shipping) requiere cambios en la aplicación para reconectarse al servidor secundario, y que la caché de datos y la caché de procedimientos sean repobladas. La replicación requiere cambios en la aplicación para volver a conectar a un suscriptor y tiene algún impacto en el rendimiento debido a que la caché de consultas y parte de la caché de datos deben ser repobladas.

El espejado de base datos (Database Mirroring), sin embargo, no tiene problemas de almacenamiento en caché. Además de enviar las transacciones al espejo, database mirroring también realiza transferencias periódicas de metadatos. El propósito de estas transferencias de metadatos es hacer que el espejo lea las páginas en caché de datos.

www.detodoprogramacion.com

Page 365: Microsoft SQL Server 2008 Español - Mike Hotek

354 Parte VI Descripción de alta disponibilidad

Este proceso mantiene la caché en el espejo en un estado "semi-caliente". La caché en el espejo no refleja el contenido exacto de la memoria caché en el principal, pero contiene la mayoría de las páginas. Por lo tanto, cuando la sesión de database mirroring conmuta por error, SQL Server no tiene que reconstruir por completo la memoria caché y las aplicaciones no experimentan un gran impacto en el rendimiento, como sí ocurre si utiliza las otras tecnologías de disponibilidad.

Redirección transparente de cliente

Uno de los procesos más difíciles de conmutación por error cuando se utiliza el envío de registros (log shipping) o la replicación, consiste en las conexiones de aplicación. Las aplicaciones deben ser redirigidas al servidor secundario para continuar el proceso. Database mirroring puede evitar esta necesidad por medio de una configuración muy particular.

La nueva versión de Microsoft Data Access Components (MDAC) que se incluye con Microsoft Visual Studio 2008 contiene una característica relacionada con database mirroring, dentro del objeto “connection” llamada “Transparent Client Redirect”. Cuando un cliente realiza una conexión a una base de datos principal, el objeto de conexión almacena en caché tanto la base principal como la espejo. Este almacenamiento en caché es transparente para el aplicación, y los desarrolladores no necesitan escribir código para implementar esta funcionalidad.

Si una sesión de database mirroring conmuta por error mientras una aplicación está conectada, la conexión se rompe, y el objeto “conection” enviará un error al cliente. El cliente necesitará solamente volver a conectarse, la caché de conexión dentro de MDAC automáticamente redirige la conexión al servidor espejo. La aplicación pensará que se está conectando al mismo servidor al que estaba conectado originalmente, cuando en realidad se está conectando a un servidor diferente.

Páginas corruptas

SQL Server 2008 introdujo una mejora significativa con el espejado de base de datos. Aunque un evento muy raro, es posible que se corrompan páginas dentro de una base de datos debido a un fallo transitorio de hardware, por lo general dentro del subsistema de disco. Previamente, SQL Server podría marcar la página corrupta y usted tendría que reparar la página mediante una restauración. En SQL Server 2008, si una sesión de espejado de base de datos está en funcionamiento, cuando el motor de almacenamiento se encuentra con una página corrupta, se recuperará automáticamente la copia de la base de datos espejo y reemplazará la página dañada. La sustitución automática permite que database mirroring “auto-sane” una página corrupta dentro de una base de datos.

Instantáneas de base de datos

La base de datos espejo dentro de una sesión de espejado de base de datos está constantemente en un estado de recuperación y es inaccesible a los usuarios. Sin embargo, puede crear una instantánea de base de datos de un espejo base de datos, que proporciona un punto en el tiempo y acceso de sólo lectura.

www.detodoprogramacion.com

Page 366: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 355

Inicialización de Database Mirroring

Usted configura “database mirroring” basado en base de datos-por-base de datos. Cada base de datos que usted define, debe usar el modelo de recuperación completa (Full recovery) para participar en una sesión de “database mirroring”. Cada espejo de base de datos debe estar sincronizado con la principal utilizando una copia de seguridad antes de iniciar la sesión de mirroring. Los cuatro pasos generales que debe realizar para preparar el espejado de la base de datos son:

1. Asegúrese que las bases de datos están configuradas para utilizar el modelo de recuperación completa.

2. Realizar una copia de seguridad de la base de datos primaria.

3. Restaurar la base de datos a la instancia que aloja la base de datos reflejada mediante el uso de la opción NORECOVERY.

4. Iniciar el espejado de base de datos.

Modelo de recuperación

Debido a que el espejado de base mantiene las bases de datos primaria y espejo como duplicados exactos, incluyendo la sincronización de todas las estructuras internas tales como los números de secuencia de registro (LSN); los modelos de recuperación “Simple” y “De registro masivo” son incompatibles con database mirroring. Por lo tanto, el único modelo de recuperación que una base de datos única puede utilizar para participar en el espejado de base es el “modelo de recuperación completa”. Además, no puede cambiar el modelo de recuperación de una base de datos que participa en una sesión de creación de espejo de base de datos.

Copia de seguridad y restauración

Debido a que la base de datos principal y el espejo son duplicados uno del otro, se necesita un mecanismo para asegurar que ambas bases de datos sean inicializadas en el mismo estado. El proceso de inicialización para espejado de bases de datos implica la realización de una copia de seguridad de la base de datos principal y su restauración en el espejo. Una copia de seguridad es también el único mecanismo que puede utilizar para inicializar la base de datos espejo, porque todas las estructuras internas tales como los LSN así como los datos deben ser sincronizados.

Cuando restaura la base de datos al espejo, es esencial que especifique la opción NORECOVERY para el comando RESTORE, el cual garantiza que el estado inicial del espejo refleja el estado de la base de datos principal, incluyendo los LSN.

Usted encontrará que los procesos de copia de seguridad y restauración consumen la mayor cantidad de tiempo durante la configuración del espejado de base de datos. Sin embargo, es probable que no pueda tener la base de datos principal fuera de línea para inicializar reflejo de base. En su lugar, debido a que la base de datos sobre el espejo está en una estado “no recuperado”, puede aplicar una cadena de registros de transacciones para tener el espejo al día.

En el siguiente ejercicio, iniciará un espejado de base de datos e iniciará una sesión de espejo de base de datos para la base SQL2008SBS.

www.detodoprogramacion.com

Page 367: Microsoft SQL Server 2008 Español - Mike Hotek

356 Parte VI Descripción de alta disponibilidad

Nota En el código que aparece a continuación, usted tendrá que reemplazar el nombre de mis máquinas-HOTEK1, HOTEK2 y HOTEK3-con los nombres de las máquinas donde sus instancias principal, espejo y testigo se ejecutan.

Inicializar Database Mirroring

1. Realice una copia de seguridad de la base de datos SQL2008SBS de la instancia principal.

2. Restaure la base de datos a la instancia SQL2008SBS espejo, asegurándose que utiliza la

opción NORECOVERY.

3. Conéctese a la instancia espejo y ejecute el siguiente código:

ALTER DATABASE SQL2008SBS SET PARTNER = 'TCP://HOTEK1:5024';

4. Conéctese a la instancia principal y ejecute el siguiente código:

ALTER DATABASE SQL2008SBS SET PARTNER = 'TCP://HOTEK2:5024'; ALTER DATABASE SQL2008SBS SET WITNESS = 'TCP://HOTEK3:5024';

5. Verifique que el espejado de bases de datos está en ejecución, observando que la base de datos SQL2008SBS, sobre la instancia principal, está en un estado “Principal”, “Sincronizado” y que la base de datos SQL2008SBS sobre el espejo está en un estado “Espejo”, “Sincronizada”.

Envío de registros

El envío de registros es una técnica de alta disponibilidad que ha estado disponible desde las primeras ediciones de SQL Server. El propósito del mismo es mantener al menos una copia adicional de la base de datos con el fin de protegerla de un fallo de hardware o daños en la base de datos. Basado en aplicar una interminable cadena de registros de transacciones a una base de datos de otra instancia, el envío de registros (log shipping) es también la menos complicada de todas las técnicas de disponibilidad. Una de las principales diferencias entre el envío de registros y el espejado de base de datos es que, aunque la base de datos espejo sólo puede mantener una única copia de una base de datos, el envío de registros es capaz de mantener múltiples copias para una mayor redundancia.

Componentes del envío de registros

Los componentes básicos de “log shipping” son los siguientes:

 

 

 

Base de datos primaria

Base de datos secundaria

Server Monitor

www.detodoprogramacion.com

Page 368: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 357

Base de datos principal

La base de datos principal está accesible para las aplicaciones y acepta transacciones. Las copias de seguridad del registro de transacciones se toman en forma periódica y se copian en el servidor que aloja la base de datos secundaria.

Base de datos secundaria

La base de datos secundaria, también referida como “la que está en espera” (standby), normalmente está inaccesible, y las copias de seguridad del registro de transacciones de la base de datos primaria son restauradas de forma continua. La base de datos secundaria puede estar en dos modos diferentes: el modo STANDBY o en el modo NORECOVERY. Cuando la base de datos secundaria está en modo en espera (STANDBY), los usuarios pueden conectarse y emitir una declaración SELECT contra la base de datos. Cuando la base de datos secundaria está en modo NORECOVERY, los usuarios no pueden conectarse a dicha base de datos. En cualquiera de los modos, los registros de transacciones se pueden restaurar en la base de datos secundaria. Los registros de transacciones no se pueden restaurar cuando los usuarios se conectan a la base de datos, por lo que no se debe utilizar el modo STANDBY para arquitecturas de alta disponibilidad.

Server Monitor

El servidor de supervisión (monitor), el cual es opcional dentro de una arquitectura de envío de registros, contiene un conjunto de jobs que envían alertas cuando la sesión de envío de registros se percibe fuera de sincronía.

Inicialización de envío de registros

Lograr ejecutar una arquitectura de envío de registros es un proceso bastante sencillo que no hace incurrir en tiempo de inactividad (caídas) a la base de datos primaria.

El proceso básico para la inicialización del envío de registros es el siguiente:

1. Debido a que las copias de seguridad necesitan ser accedidas a través de servidores, usted necesita crear un recurso compartido tanto en las bases primaria como en la secundaria.

2. Crear jobs para realizar copias de seguridad del registros de transacciones, copiar los logs a la secundaria, y restaurar los registros (logs).

3. Restaurar una copia de seguridad completa en la base de datos secundaria.

4. Restaurar todos los registros de transacciones posteriores.

5. Poner en marcha jobs para automatizar la recuperación de los registros.

6. Copiar todos los objetos a nivel de instancia de los que la base de datos secundaria dependa para los Servicio de aplicaciones.

www.detodoprogramacion.com

Page 369: Microsoft SQL Server 2008 Español - Mike Hotek

358 Parte VI Descripción de alta disponibilidad

Creando Jobs

Cuando configura el envío de registros se crean 3 jobs:

 

 

 

Job de Copia de seguridad

Job de Copia

Job de restauración

El job de copia de seguridad siempre se ejecuta en el primario. La tarea (job) de restauración siempre se ejecuta en el secundario. Aunque el job de copia se puede ejecutar en el primario o el secundario, éste generalmente es configurado para ejecutarse en el secundario.

Exposición de pérdida de datos

La regla general para la exposición de pérdida de datos es dos veces el intervalo de las copias de seguridad del registro de transacciones. Por ejemplo, si las copias de seguridad del registro de transacciones se ejecutan cada 5 minutos, la exposición de pérdida de datos dentro de un entorno de envío de registro se considera que es 10 minutos. Este intervalo representa el tiempo que tarda en completar una copia de seguridad del registro de transacciones y lo copia a la secundaria. En los sistemas que experimentan un volumen de transacciones muy alto, las copias de seguridad del registro de transacciones pueden parecer que se producen casi continuamente, ya que podría tener casi el mismo tiempo para completar una copia de seguridad como el intervalo en el que está programada la copia de seguridad.

Restauración de copias de seguridad

Debido a que el envío de registros se basa en las copias de seguridad del registro de transacciones, primero debe restaurar una copia de seguridad completa sobre la secundaria. La base de datos no puede ser recuperada para permitir restaurar registros de transacciones adicionales.

Durante la configuración del envío de registros, usted puede optar por tener una copia de seguridad completa creada inmediatamente, copiada a la secundaria, y restaurada antes de que el envío de registros siga adelante con copias de seguridad del registro de transacciones adicionales.

Restaurar una copia de seguridad completa durante la configuración

Generalmente, no se recomienda que el envío de registros genere una copia de seguridad completa “sobre la marcha” (on the fly) durante la configuración de la sesión. Esto puede tener un impacto muy grande en un entorno existente, sobre todo si tiene bases de datos de más de aproximadamente 10 GB. Cuando se configura el envío de registros, usted ya tendrá copias de seguridad existentes. Para iniciar el envío de registros en un entorno típico de producción, generalmente deberá seguir estos pasos:

  Buscar la última copia de seguridad completa, copiarla a la secundaria, y restaurarla dejando la base de datos ya sea en el modo NORECOVERY como en el modo STANDBY.

Copiar y restaurar el último respaldo diferencial a la secundaria, dejando la base de datos ya sea en el modo NORECOVERY como en el modo STANDBY.

 

www.detodoprogramacion.com

Page 370: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad

 

359

Copiar y restaurar todas las copias de seguridad del registro de transacciones desde la última diferencial, dejando la base de datos, ya sea en modo NORECOVERY o STANDBY.

Desactivar el job existente para respaldar los registros de transacciones.

Copiar y restaurar las copias adicionales de seguridad del registro de transacciones al secundario.

Iniciar el envío de registros.

 

 

 

Este proceso asegura que se minimice el tiempo necesario para inicializar el envío de registros al no tener que esperar que se complete otro “full backup”. También asegura que se minimiza el espacio de disco consumido.

El envío de registros se basa en una cadena continua de copias de seguridad del registro de transacciones que se aplica a la secundaria. Usted debe tener mucho cuidado al configurar el job de copia de seguridad del registro de transacciones. El job de copia de seguridad para el envío de registros reemplaza cualquier copia de seguridad del registro de transacciones existentes contra la base de datos primaria.

En este ejercicio, configurará una sesión de envío de registros para la base de datos SQL2008SBS entre dos instancias de SQL Server. Usted tendrá que reemplazar los nombres de instancia “HOTEK2” y “HOTEK2\INSTANCE2” con los nombres de las instancias en sus máquinas.

Nota Como se señala en la introducción del libro, estoy usando Windows XP Pro SP2 para todos los ejercicios. Si en cambio, está ejecutando Windows Vista, Windows Server 2003 o Windows Server 2008 los cuadros de diálogo para compartir una carpeta, se verán un poco diferente. También podrá asignar directamente permisos a cuentas específicas, que no es posible con Windows XP Pro SP2. Los ejercicios incluyen las asignaciones de permisos de cuenta específicas para las acciones que corresponden a la configuración para las personas que utilicen Windows Vista, Windows Server 2003, o Windows Server 2008, mientras que las capturas de pantalla muestran sólo lo que se puede ver en Windows XP Pro SP2.

Iniciar envío de registros

1. Abra el Explorador de Windows en el primario y cree una carpeta llamada LSBackup.

2. Comparta esta carpeta y conceda permisos de control total al grupo SQLServerMS SQLUser$<machine>$<instance> en el primario, así como permisos de lectura

al grupo SQLServerSQLAgentUser$<machine>$<instance> en el secundario.

3. Abra el Explorador de Windows en el secundario y cree una carpeta con el nombre LSCopy.

4. Comparta esta carpeta y conceda permisos de control total al grupo SQLServerMSS QLUser$<machine>$<instance> y al grupo SQLServerSQLAgentUser$<machine>$<instance> en el secundario.

5. Pruebe el acceso para asegurarse de que se han concedido los permisos correctamente.

6. Compruebe que la base de datos SQL2008SBS está configurada para el modelo de recuperación Completa (FULL recovery). Si no lo está, cambie el modelo de recuperación a FULL.

7. Inicie SSMS, conéctese a la instancia principal en el Explorador de objetos, haga clic en la base de datos SQL2008SBS, elija Propiedades y seleccione “Envío del registro de transacciones”.

www.detodoprogramacion.com

Page 371: Microsoft SQL Server 2008 Español - Mike Hotek

360 Parte VI Descripción de alta disponibilidad

8. Seleccione la casilla de verificación "Habilitar ésta como base de datos primaria en una configuración de envío de registros" y haga clic en “Configuración de copia de seguridad”.

9. En la caja de texto “Ruta de red para copia de seguridad”, escriba el path para la “Universal Naming Convention” (UNC) para el recurso compartido que creó en el paso 1.

10. En el cuadro de texto “Si la carpeta de copia de seguridad se encuentra en el Servidor Primario”, introduzca la ruta de acceso física al directorio en el que se almacenarán las copias de seguridad.

11. Cambie el intervalo de alerta a 6 minutos, el intervalo del programa de copia de seguridad a 2 minutos, configure para que la copia de seguridad se comprima y haga clic en Aceptar.

www.detodoprogramacion.com

Page 372: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 361

www.detodoprogramacion.com

Page 373: Microsoft SQL Server 2008 Español - Mike Hotek

362 Parte VI Descripción de alta disponibilidad

12. Haga clic en “Agregar” para agregar un nuevo secundario.

13. Haga clic en Conectar y conéctese a la instancia secundaria, deje el nombre de la

base de datos secundaria establecida en SQL2008SBS.

14. Usted permitirá el envío de registros para generar una copia de seguridad completa, así que seleccione “Sí, generar un “Full Backup” de la base de datos principal y restaurarlo en la base de Secundaria”.

15. Haga clic en “Opciones de restauración”, escriba la ruta del directorio en el que desea que los archivos de datos y de registro residan en el secundario y, a continuación, haga clic en Aceptar.

www.detodoprogramacion.com

Page 374: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 363

16. Haga clic en la ficha “Copiar archivos”.

17. Establezca el destino del "recurso compartido de archivo" donde se copiarán las copias de seguridad del registro de transacciones y cambie el intervalo de copia a 2 minutos..

18. Haga clic en la ficha “Restauración del Registro de transacciones”.

19. Seleccione Modo No Recovery, configure 0 minutos de retraso, configure el alerta a los 6 minutos, ajuste el programar de restauración a 2 minutos, y luego haga clic en Aceptar.

20. Haga clic en Aceptar para generar la configuración de envío de registros, realizar la copia de seguridad de la base de datos SQL2008SBS en el primario, restaurar SQL2008SBS al secundario, crear los jobs de envío de registros y alertas, e iniciar el envío de registros.

21. Verifique que las copias de seguridad están yendo a la carpeta correcta, se copian correctamente desde la carpeta LSBackup a la carpeta LSCopy, y se restauran en el secundario.

Replicación

La replicación está diseñada como un mecanismo de distribución de datos. En el nivel más básico, los cambios realizados en una base de datos son distribuidos a uno o más objetivos. El motor de replicación núcleo está diseñado para una aplicación muy flexible, pero la arquitectura de núcleo puede ser aprovechada para proporcionar la disponibilidad de una base de datos ya que una copia redundante de datos se mantiene en sincronización con una copia maestra.

www.detodoprogramacion.com

Page 375: Microsoft SQL Server 2008 Español - Mike Hotek

364 Parte VI Descripción de alta disponibilidad

Los componentes de una replicación

Los datos que se replican se definen por medio de tres componentes básicos en la definición.

Artículos

Un artículo es el bloque de construcción básico de la replicación y define el nivel más granular de distribución de datos. Un artículo puede ser definido en una tabla, vista, procedimiento almacenado o función.

El tipo de artículo que es más relevante para la alta disponibilidad es un artículo definido en una tabla. El artículo define el conjunto de datos dentro de la tabla que SQL Server replica en una o más bases de datos.

Publicaciones

Una publicación es el nivel más granular dentro de la arquitectura de replicación. Las publicaciones son agrupaciones de artículos que definen el conjunto de replicación.

Filtros

La replicación es la única entre las diversas tecnologías de alta disponibilidad que tiene la capacidad de hacer sólo una parte de una base de datos redundante. Usted puede aplicar uno o varios filtros a cada artículo para restringir el conjunto de datos que se replican.

Puede filtrar los artículos por filas o por columnas. Un filtro de columna especifica un subconjunto de las columnas dentro de una tabla. El filtro de la columna permite que los datos se repliquen, pero la información que podría ser sensible puede ser excluida. Un filtro de registro restringe el conjunto de filas que se replican. Hay tres tipos distintos de filtros de fila que se pueden aplicar.

Un filtro de fila estático está predefinido cuando se crea el artículo y restringe el artículo en el mismo subconjunto de datos, independientemente del subscriptor. Un ejemplo de un filtro de fila estático es como sigue:

WHERE State = ‘TX’

Un filtro de fila dinámico, disponible sólo con replicación de mezcla (merge), le permite definir un filtro que no esté fijo en un artículo. Durante el proceso de sincronización, el filtro se calcula basándose en información del subscriptor, que permite una publicación simple para distribuir diferentes conjuntos de datos para cada subscriptor. Un ejemplo de un filtro dinámico es el siguiente:

WHERE UserName = suser_sname()

Un filtro combinado (join), disponible sólo en la réplica de mezcla (merge), le permite filtrar una tabla basada en una relación a una tabla “parent”. Por ejemplo, usted podría tener una tabla con los clientes, sus órdenes correspondientes, y los detalles de los pedidos. Si la tabla de clientes tiene un filtro que restringe el conjunto de datos a un estado en particular, usted también desearía filtrar los pedidos y detalles de las órdenes de la misma manera. Sin embargo, la columna de estado no existiría en ninguna de estas tablas. Mediante el empleo de un filtro de combinación (join filter), puede filtrar los clientes en función del estado y luego también tener los filtros de las tablas órdenes y del detalle de las órdenes basados en el subconjunto de los clientes que están siendo replicados.

www.detodoprogramacion.com

Page 376: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 365

Roles de replicación

Puede configurar las bases de datos (y correspondientemente, las instancias que alojan las bases de datos) en tres roles diferentes.

El editor (publisher) mantiene la copia maestra de los datos dentro de una arquitectura de replicación. Usted

configura la instancia que aloja la base de datos del editor con la publicación que define el conjunto de datos a ser replicados.

El suscriptor (subscriber) es la base de datos que está recibiendo cambios desde el motor de replicación definido por el editor del que está suscripto. Un suscriptor puede recibir cambios de más de una publicación.

El distribuidor (distributor) es el motor principal dentro de una arquitectura de replicación. La base de datos de distribución se almacena en la instancia que está configurada como distribuidor. En cualquier arquitectura de replicación, el distribuidor es el lugar en el que todos los agentes de replicación se ejecutarán de forma predeterminada.

Una instancia de SQL Server puede ser configurada como un distribuidor. Una base de datos puede ser configurada como un editor, suscriptor, o ambos.

Agentes de replicación

Al comenzar a trabajar con replicación, muchas personas están confundidas por la forma en que el motor de replicación reacciona para diversas situaciones de error. Después de todo, SQL Server no entiende cómo es

el tiempo de espera de una transacción o cómo volver a intentar una operación.

Lo fundamental para entender acerca de la replicación es que no es una parte del núcleo del motor de SQL Server en absoluto. La replicación opera externamente al motor de SQL Server a través de un conjunto de ejecutables conocidos como “Agentes de replicación”, que hacen que el motor de replicación sea simplemente otra aplicación que se conecta a SQL Server y procesa datos. Debido a que es una aplicación, el motor de replicación está limitado y reacciona de la misma manera que cualquier otra aplicación que tiene que crear una conexión OLE DB a SQL Server.

Agente de instantáneas

El Agente de instantáneas es actualmente Snapshot.exe. Este agente es responsable de extraer el esquema y los datos que deben ser enviados del editor al suscriptor. Snapshot.exe se utiliza en instantáneas, transaccional y replicación de mezcla (merge replication).

Agente de lector del registro

El Agente de lector del registro, Logread.exe, sólo se utiliza en la replicación transaccional. Se utiliza para extraer las transacciones confirmadas desde el registro de transacciones en el editor que necesita ser replicado. Una vez extraídas, el Agente de lector del registro asegura que cada transacción es

www.detodoprogramacion.com

Page 377: Microsoft SQL Server 2008 Español - Mike Hotek

366 Parte VI Descripción de alta disponibilidad

re-empaquetada y escrita en la base de datos de distribución en exactamente la misma secuencia que la transacción que fue emitida contra el editor. La secuenciación por el Agente de lector del registro es crítica para asegurar que las transacciones no se aplican fuera de orden a un suscriptor.

Agente de distribución

El Agente de distribución, Distrib.exe, se usa con instantáneas y replicación transaccional. El Agente de distribución tiene dos funciones: la aplicación de instantáneas y el envío de transacciones. El Agente de distribución es responsable de la aplicación de cada instantánea generada con instantáneas o replicación transaccional para todos los suscriptores. También es responsable de la aplicación de todas las transacciones escritas a la base de datos de distribución por parte del Agente de lector del registro para todos los suscriptores.

Agente de mezcla (merge)

El Agente de mezcla, Replmerg.exe, se utiliza en la replicación de mezcla. El Agente de mezcla aplica la instantánea generada cuando se inicializa el suscriptor. El Agente de mezcla también es responsable del intercambio de transacciones entre el editor y el suscriptor.

Agente de lectura de cola

El Agente de lectura de cola, Qrdrsvc.exe, se utiliza sólo cuando la opción de actualización de cola para la replicación transaccional o de instantáneas, ha sido habilitada. El agente de lectura de cola es responsable de transferir la cola en el suscriptor al editor.

Métodos de replicación

El motor de replicación tiene tres métodos diferentes que puede utilizar para replicar datos: replicación instantánea, replicación transaccional y la replicación de mezcla.

Replicación de Instantánea

La replicación de instantáneas toma todo el conjunto de datos y los envía durante cada ciclo del motor de replicación. Esta es una copia completa de los datos que se aplica al suscriptor. Cualquier conjunto de transacciones que ocurra contra el editor se capturan y se envían a un suscriptor sólo la próxima vez que se ejecute una instantánea.

La réplica de instantáneas utiliza el Agente de instantáneas y el Agente de distribución. Cuando se inicia la instantánea el Agente de instantáneas extrae el esquema y el programa BCPs (bulk copy program) copia masivamente los datos a la carpeta de la instantánea.

La carpeta de instantánea es un directorio que se especifica al configurar la replicación. Este directorio sirve como ubicación predeterminada para una instantánea. Cuando se crea una publicación, puede sustituir la ubicación de la carpeta de instantáneas para la publicación específica.

www.detodoprogramacion.com

Page 378: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 367

Después de extraer el esquema y todos los datos, el Agente de instantáneas se apaga. El Agente de distribución entonces recoge y aplica la instantánea a cada suscriptor. Durante este proceso, las tablas existentes se eliminan y se vuelven a crear a partir de las secuencias de comandos de esquema en la carpeta de la instantánea, a continuación, los datos se copian en las tablas de cada suscriptor utilizando BCP.

La replicación de instantáneas realiza una sustitución completa de los datos en el suscriptor. No se utiliza normalmente para una alta disponibilidad porque las transacciones emitidas entre las aplicaciones de una instantánea no son enviadas al suscriptor.

Replicación transaccional

La replicación transaccional comienza con una instantánea inicial aplicándola al suscriptor para asegurar que las dos bases de datos están sincronizadas. Como las transacciones posteriores son emitidas contra el editor, el motor de replicación las aplica al suscriptor. El flujo de transacciones incremental desde el editor al suscriptor hace que la replicación transaccional sea una buena opción para mantener una copia secundaria de una base de datos para disponibilidad o para descargar operaciones de reporte. La configuración más común para la replicación transaccional está en un entorno servidor-a-servidor.

Usted puede configurar la replicación transaccional con dos modos opcionales -suscriptores de actualización inmediata y suscriptores de actualización en cola- que permiten que las transacciones sean emitidas contra un abonado. Además de enviar transacciones desde un editor a un suscriptor, la replicación transaccional se puede implementar en dos arquitecturas alternativas: replicación transaccional bidireccional y replicación transaccional peer-to-peer (par a par o P2P).

Replicación con mezcla (merge)

La replicación con mezcla (o merge replication), está diseñada principalmente para el procesamiento móvil, desconectado. El editor y el suscriptor no están normalmente conectados en todo momento con este método de replicación, aunque eso no es requerido.

Al igual que la replicación transaccional, se aplica una instantánea inicial al suscriptor para asegurar que se sincronice y luego los cambios posteriores sean enviados al abonado. A diferencia de la replicación transaccional, la replicación de mezcla está diseñada para permitir que los cambios sean realizados tanto en el publicador como en el suscriptor de forma predeterminada. El motor de mezcla entonces intercambia todos los cambios entre el editor y el suscriptor durante cada ciclo del agente.

En el siguiente ejercicio, configurará la publicación para una instancia.

Nota Los problemas más comunes que causan errores dentro de una configuración de replicación son la seguridad y la conectividad. En los ejercicios de replicación, usted trabajará ambas cuestiones mediante la reproducción de la base de datos SQL2008SBS a otra base de datos dentro de la misma instancia.

www.detodoprogramacion.com

Page 379: Microsoft SQL Server 2008 Español - Mike Hotek

368 Parte VI Descripción de alta disponibilidad

Configurar la publicación

1. Inicie el Explorador de Windows, busque la carpeta llamada repldata dentro de su directorio de instalación, el valor predeterminado es C:\Archivos de programa\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\repldata, y comparta esta carpeta con permisos de control total al grupo

2. Abra el SSMS y conéctese a la instancia del Examinador de objetos.

3. Haga clic derecho en el nodo Replicación, seleccione Configurar Distribución, y a continuación, haga clic en Siguiente.

4. Seleccione el primer botón de la instancia para que actúe como su propio distribuidor y haga clic en Siguiente.

5. Configure la carpeta de instantáneas para el recurso compartido que creó en el paso 1 y haga clic en Siguiente. 6. Deje los valores por defecto en el “nombre y la ubicación” de la base de datos de distribución, y a continuación, haga clic en Siguiente.

7. Asegúrese que la instancia está seleccionada para el editor (publisher) y haga clic en Siguiente.

8. Compruebe que la casilla de verificación “Configurar la distribución” esté seleccionada y haga clic en Siguiente.

9. Haga clic en Finalizar para habilitar la publicación y, a continuación, haga clic en Cerrar.

10. Compruebe que ahora tienen una base de datos llamada distribución creada en la instancia.

www.detodoprogramacion.com

Page 380: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 369

En el siguiente ejercicio, creará una publicación transaccional contra la base de datos SQL2008SBS

junto con una suscripción a la publicación.

Implementar la replicación transaccional

1. Abra SSMS y conéctese a la instancia que va a utilizar para la replicación.

2. Cree una base de datos llamada SQL2008SBSTranSubscriber en la misma instancia que la base de datos SQL2008SBS.

3. Si es necesario, expanda “Replicación”. Haga clic derecho en “Publicaciones locales”, elija nueva publicación, y haga clic en Siguiente.

4. Seleccione la base de datos SQL2008SBS y haga clic en Siguiente.

www.detodoprogramacion.com

Page 381: Microsoft SQL Server 2008 Español - Mike Hotek

370 Parte VI Descripción de alta disponibilidad

5. Seleccione publicación transaccional y haga clic en Siguiente.

6. Seleccione todas las tablas y haga clic en Siguiente.

7. No se aplicará ningún filtro así que haga clic en Siguiente.

8. Seleccione la casilla de verificación “Crear una instantánea inmediatamente y mantenerla disponible para inicializar Suscripciones” y haga clic en Siguiente.

9. Haga clic en Configuración de seguridad.

10. Seleccione la opción para “Correr bajo la cuenta servicio del Agente SQL Server”, junto con la opción “Para suplantar la cuenta de proceso” y haga clic en Aceptar.

11. Haga clic en Siguiente, compruebe que la casilla de verificación “Crear La publicación” está seleccionada y haga clic en Siguiente.

12. Déle un nombre a la publicación y haga clic en Finalizar.

13. Cuando el asistente termine de crear la publicación, haga clic en Cerrar.

14. Si se fija en la carpeta repldata, debería ver un gran número de archivos que se generaron por el Agente de instantáneas.

15. Expanda “Publicaciones locales”, haga clic derecho en la publicación que acaba de crear, seleccione Nuevas Suscripciones y haga clic en Siguiente.

www.detodoprogramacion.com

Page 382: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 371

16. Verifique que su publicación está seleccionada y haga clic en Siguiente.

17. Compruebe que “Ejecutar todos los agentes en el distribuidor” esté seleccionado y haga clic en Siguiente.

18. Seleccione la casilla de verificación situada junto a la instancia, seleccione la base de datos de SQL2008SBSTranSubscriber de la lista desplegable de base de datos de suscripción, y haga clic en siguiente. 19. Haga clic en el botón de puntos suspensivos junto a su suscriptor en la ventana Propiedades de suscripción.

20. Seleccione la opción para “ejecutarse bajo la cuenta de servicio del Agente SQL Server”, junto con la opción para “Suplantar la cuenta de proceso”. Haga clic en Aceptar y, a continuación, haga clic en Siguiente.

www.detodoprogramacion.com

Page 383: Microsoft SQL Server 2008 Español - Mike Hotek

372 Parte VI Descripción de alta disponibilidad

www.detodoprogramacion.com

Page 384: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 23 Alta Disponibilidad 373

21. En la página de “Programación de sincronización”, deje la opción “Programación del Agente para que por omisión se ejecute continuamente"” y haga clic en Siguiente.

22. Deje las propiedades de una suscripción como “iniciar inmediatamente” y haga clic en Siguiente.

23. Compruebe que la casilla de verificación “Crear la(s) suscripción(es) “ está seleccionada. Haga clic en Siguiente y, a continuación, haga clic en Finalizar.

24. Cuando la suscripción es creada, haga clic en Cerrar.

25. Espere unos minutos para que el Agente de distribución aplique la instantánea al suscriptor y luego verifique la base de datos SQL2008SBSTranSubscriber.

26. Usted debería ser capaz de hacer cambios a los datos en la base de datos SQL2008SBS y ver que los cambios aparecen en la base de datos SQL2008SBSTranSubscriber dentro de un período corto de tiempo.

Capítulo 23 Referencia Rápida

Para

Proporcionar conmutación automática por error a sus bases de datos para proteger fallas de hardware únicamente.

Proporcionar conmutación automática por error a sus base de datos para proteger de fallos de hardware y de almacenamiento.

Proporcionar una copia secundaria de su base de datos sin impactar el rendimiento de las transacciones.

Proporcionar más de una copia secundaria

de una base de datos.

Hacer una copia redundante de una porción

de una base de datos.

Haga lo siguiente

Implemente conmutación por error o espejado de base (cualquiera de las dos).

Implemente espejado de base de datos en el modo de operación de “Alta disponibilidad”.

Implemente espejado de base en el modo de operaciones de “Alto rendimiento”, el “Envío de registros” o bien la replicación (cualquiera de los 3).

Implemente el “Envío de registros” o bien replicación.

Implementar la replicación.

www.detodoprogramacion.com

Page 385: Microsoft SQL Server 2008 Español - Mike Hotek

Parte VII

Business Intelligence

En esta parte: Capítulo 24: SQL Server Integration Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 Capítulo 25: SQL Server Reporting Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 Capítulo 26: SQL Server Analysis Services. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451

375

www.detodoprogramacion.com

Page 386: Microsoft SQL Server 2008 Español - Mike Hotek

377

Capítulo 24

SQL Server Integration Services Después de completar este capítulo, usted será capaz de

■ Crear un proyecto de SSIS.

■ Construir un paquete.

■ Implementar tareas y transformaciones.

■ Realizar el control de excepciones.

■ Administrar configuraciones de paquetes.

■ Implementar un paquete.

Los primeros 23 capítulos han proporcionado una visión general de las funciones disponibles en el motor

relacional. Por sí mismo, el motor relacional representa una plataforma flexible y rica para el desarrollo de

aplicaciones empresariales. Lo que diferencia a SQL Server de otro motor de base de datos, es la

inclusión de tres productos adicionales, de clase empresarial, referidos colectivamente como la pila de

inteligencia de negocios. SQL Server Integration Services (SSIS) está diseñado para proporcionar la

infraestructura de componentes que permiten que los datos se trasladen de un sistema a otro, al mismo

tiempo que permite la manipulación de los datos que se mueven, en un formato deseado.

Más información: Para más detalles de SSIS, consulte SQL Server 2008 Integration Services Paso a

paso.

A lo largo de este libro, ha trabajado con una plataforma de desarrollo principal, la ventana de consulta en

SQL Server Management Studio (SSMS). En este capítulo, usted aprenderá sobre la segunda plataforma

importante de desarrollo, el Business Intelligence Development Studio, en lo sucesivo referido como

BIDS. También podrá aprender acerca de los componentes disponibles dentro de SSIS y la forma de

construir paquetes flexible SSIS para su entorno.

Nota Hasta este punto, se ha trabajado con una base de datos básica SQL2008SBS. Los capítulos de

esta Parte IV, "Inteligencia de Negocios", se basan en tener una población mucho mayor de datos

aleatorios. El CD contiene una copia de seguridad para la base de datos SQL2008SBS en

“Chapter24\sql2008sbs.bak” en las muestras que acompañan el presente libro. Usted tendrá que

restaurar esta copia de seguridad sobre la base de datos SQL2008SBS, antes de proceder con los

capítulos de la Parte IV.

www.detodoprogramacion.com

Page 387: Microsoft SQL Server 2008 Español - Mike Hotek

378 Parte VII Business Intelligence

BIDS Vista general

Para aquellos que ya escribieron aplicaciones utilizando Visual Studio, BIDS será muy familiar. BIDS es el shell de Visual Studio en el que han sido registradas las plantillas de proyectos y componentes de Integración de Servicios (Integrations Services), Servicios de Presentación de Informes (Reporting Services) y Servicios de Análisis (Analysis Services). Si usted ya desarrolló con Visual Studio 2008, verá que los proyectos de SSIS, SSRS, SSAS aparecen en su lista de proyectos al iniciar Visual Studio.

Nota Debido a limitaciones de espacio dentro de una página impresa, sólo será capaz de ver partes del entorno general de BIDS. Como cualquier desarrollador de Visual Studio le podrá decir, a medida que aumenta el espacio de la pantalla, su productividad aumenta.

En el siguiente ejercicio, creará un nuevo proyecto SSIS y se podrá familiarizar con los componentes básicos del entorno.

Crear un proyecto de SSIS

1. Abra el Explorador de Windows y cree una carpeta denominada “C:\test” que se utilizará como fuente de ubicación para todas las tareas que se realizarán en la construcción de un paquete SSIS.

2. Inicie BIDS.

3. Seleccione el proyecto de “Integration Services” y especifique la configuración como se muestra en el gráfico que sigue y haga clic en Aceptar.

4. Una vez que el paquete ha sido inicializado, debería ver un entorno similar al del gráfico siguiente.

www.detodoprogramacion.com

Page 388: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 379

En la parte inferior de la pantalla, usted tendrá tres solapas: Lista de errores, Lista de tareas y Salida. La lista de errores muestra los errores o advertencias acerca de su paquete durante el diseño o la depuración. La lista de tareas es un área de pruebas para realizar un seguimiento de una lista de las tareas que debe realizar mientras se trabaja en la solución. Las ventanas de salida mostrarán el estado y la información de progreso junto con los mensajes durante la ejecución de un paquete. Tal como usted ya se ha familiarizado, la chinche en cada panel le permitirá auto-ocultar el panel con el fin de aumentar el espacio en pantalla para otros componentes.

En la parte derecha de la pantalla, se encuentran las ventanas de Explorador de soluciones y de Propiedades. El Explorador de soluciones se utiliza para agrupar todos los objetos en un proyecto y le permite añadir fuentes de datos (data sources), vistas de origen de datos (data source views) y paquetes al proyecto. La Ventana Propiedades, es donde puede ver y editar las propiedades del objeto seleccionado.

Nota En este capítulo, vamos a pasar por alto los orígenes de datos y las vistas de orígenes de datos para simplificar. Usted aprenderá todo sobre los orígenes de datos y vistas de origen de datos en el capítulo 25, "SQL Server Reporting Services ", y el Capítulo 26," SQL Server Analysis Services. "

Cambiar el nombre de un paquete SSIS

1. Seleccione el paquete recién creado en el Explorador de soluciones.

2. En la ventana Propiedades, cambie el nombre a SQL2008SBS.dtsx.

www.detodoprogramacion.com

Page 389: Microsoft SQL Server 2008 Español - Mike Hotek

380 Parte VII Business Intelligence

3. Haga clic en cualquier lugar fuera del campo Nombre de archivo y haga clic en Sí cuando aparezca el cuadro de diálogo preguntándole si desea cambiar el nombre del paquete.

4. Navegue hasta el directorio “C:\Test” en el Explorador de Windows para ver los resultados de la creación del proyecto y cambie el nombre del paquete.

Las dos áreas donde pasará la mayor parte del tiempo son la caja de herramientas en el lado izquierdo y la superficie de diseño en el panel central. La caja de herramientas contiene todas las tareas y transformaciones que se pueden utilizar para construir un paquete SSIS. La superficie de diseño se utiliza para construir el flujo y el movimiento de datos del paquete.

La superficie de diseño se divide en cuatro pestañas distintas: Flujo de control, Flujo de datos, Manejadores de eventos y Explorador de paquetes. La ficha Explorador de paquetes le permite navegar por su paquete de una manera jerárquica para ver todos los componentes que se han configurado. La ficha Flujo de control es donde se diseña el proceso de negocio que será ejecutado por su paquete. La ficha Flujo de datos es donde se diseña cómo se mueven y son manipulados los datos. La ficha Manejadores de eventos le permite especificar las acciones en respuesta a un evento de tal paquete

como por ejemplo un error.

Nota Las tareas y las transformaciones que se discutirán en este capítulo se limitan a las que se incluyen en SQL Server 2008. Usted puede diseñar sus propias tareas y transformaciones que luego pueden ser registradas en BIDS y utilizarse dentro de sus paquetes.

Tareas

SSIS viene con 40 tareas diferentes que se pueden añadir a un paquete. Las tareas se dividen en dos grandes categorías: las tareas de control de flujo y las tareas de plan de mantenimiento.

Nota El plan de mantenimiento que generó en el Capítulo 20, "Recuperación de datos" es un paquete de SSIS.

Las principales tareas que va a utilizar se muestran en la Figura 24-1.

El conjunto de tareas que comienzan con "Transfer" se utilizan para copiar objetos dentro de un entorno y se pueden utilizar para la implementación de código o para sincronizar objetos a un servidor en espera que participe para “envío de registros” (log shipping) o para el espejado de base de datos (database mirroring).

Las tareas de Analysis Services y de minería de datos proporcionan una funcionalidad específica para la gestión de modelos de minería de datos y cubos de Analysis Service. Las tareas de ejecución DDL de Analysis Services le permiten a un paquete SSIS manipular la estructura de un cubo, mientras que la tarea de procesamiento de Analysis Services iniciará el procesamiento del cubo una vez que haya terminado de cargar nuevos datos para el almacén de datos.

www.detodoprogramacion.com

Page 390: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 381

FIGURA 24-1 El control de flujo de tareas

Los objetos contenedores: For Loop, Foreach Loop y Sequence, se utilizan para agrupar tareas o para ejecutar repetidamente un conjunto de tareas. El contenedor Sequence se utiliza para agrupar las tareas en una unidad lógica de trabajo. El bucle For Loop ejecuta las tareas dentro del contenedor siempre y cuando se cumpla una condición, similar a la construcción WHILE discutida en el capítulo 12, "Procedimientos almacenados." Foreach Loop ejecutará las tareas dentro del contenedor para cada elemento dentro de la colección especificada. Por ejemplo, usted podría construir un Foreach Loop utilizando el numerador de archivos para ciclar a través de todos los archivos dentro de un directorio para el procesamiento o podría recuperar un conjunto de resultados de un servidor SQL Server y ejecutar el bucle para cada fila del conjunto de resultados.

Las tareas de scripting, “ActiveX” y “Scripts”, le permiten crear secuencias de comandos en el flujo del proceso de su paquete. La tarea “ActiveX Script” es específica para la creación de scripts ActiveX. La tarea Script proporciona acceso a toda la potencia de programación de Visual Basic. NET o C #. NET donde usted puede llamar a los métodos del Framework. NET y realizar cualquier operación para la que tenga acceso de seguridad.

Las tareas Execute proporcionan la capacidad de ejecutar scripts T-SQL, lanzar paquetes enteros SSIS, ejecutar paquetes DTS legacy (heredados), o abrir una ventana de comandos para ejecutar una aplicación, un archivo por lote, o comandos del sistema operativo.

www.detodoprogramacion.com

Page 391: Microsoft SQL Server 2008 Español - Mike Hotek

382 Parte VII Business Intelligence

La tarea de inserción masiva (Bulk), es una tarea especializada para realizar una operación BULK INSERT. Esta tarea requiere un archivo de entrada y envía los datos directamente a una tabla. No se pueden validar o manipular datos con la tarea de inserción masiva.

La tarea “Sistema de archivos” (File System) le permite interactuar con el sistema de archivos para crear / mover / borrar directorios o mover / borrar / renombrar archivos.

La tarea FTP proporciona la capacidad de interactuar con un servidor FTP. La tarea FTP se limita a comandos estándar de FTP y no puede interactuar con servidores FTP especializados. Con una tarea FTP, usted puede enviar/recibir archivos, así como crear/eliminar directorios y archivos locales o remotos. Una falta de la tarea FTP es que no se puede recuperar una lista de archivos de un servidor FTP para los casos en los que sólo quiere enviar/recibir archivos que aún no existen. Para lograr un envío/recepción incremental, tendrá que llenar con una lista de archivos un bucle Foreach que llamará iterativamente una tarea FTP para cada archivo incremental que desee.

La “cola de mensajes”, “correo enviado”, y las tareas de “Web Service”, se utilizan para permitir que un paquete interactúe con cada uno de estos sistemas respectivos.

La tarea XML es un objeto especializado que le permite emitir comandos XML contra documentos XML tales como la aplicación de una transformación XML para manipular una estructura XML.

Las tareas WMI están diseñadas para que un paquete pueda responder a los eventos de Windows. WMI es la

“Windows Management Instrumentation” (Instrumental de administración de Windows), que es una API expuesta por el sistema operativo. Cualquier acción que se realiza dentro de Windows, tales como iniciar/detener un servicio, la creación de un archivo, y el cambio de permisos, tiene su correspondiente evento WMI que se dispara. WMI también tiene un lenguaje de consulta que puede ser usado contra cualquier objeto del sistema operativo, tales como conseguir el tamaño de un archivo o la lista de miembros de un grupo de seguridad. La tarea WMI Data Reader (Lector de datos), le permite ejecutar consultas WMI. La tarea WMI de “Monitor de eventos” le permite a un paquete responder contra un evento WMI. Uno de los usos más interesantes de una tarea “Monitor de eventos WMI” es la de procesar los archivos que se envían desde sistemas externos. La parte más difícil del proceso de archivos es la de esperar hasta que el remitente haya terminado de escribir el archivo, para que usted no intente procesar un archivo parcial. El Vigilante de eventos WMI elimina este problema, ya que un evento WMI no se produce para una creación de archivos, hasta que el archivo ha sido totalmente escrito y cerrado por el remitente.

La tarea de flujo de datos (Data Flow), se encuentra en el corazón de prácticamente todos los paquetes SSIS. Cada tarea de flujo de datos que se agrega al flujo de control tendrá un correspondiente panel de flujo de datos, donde puede configurar cómo se moverán los datos y cualquier otra manipulación necesaria cuando los datos se procesan.

Transformaciones

Todas las transformaciones se producen dentro de una tarea Flujo de datos. SQL Server viene con 29 transformaciones, como se muestra en la Figura 24-2.

www.detodoprogramacion.com

Page 392: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 383

FIGURA 24-2 Flujo de datos transforma

La transformación “Agregado” (Aggregate) permite calcular agregaciones, como SUM, MIN, MAX, y AVG, mientras que los datos se transmiten a través del paquete. Con el fin de calcular un agregado, primero debe aplicar la transformación Ordenar (Sort) para ordenar el conjunto de datos. La transformación “Aggregate” opera similar a un SELECT. . . GROUP BY mediante el cual se calculan los agregados dentro de los grupos de datos especificados. Dado que SSIS escribe los agregados mientras los datos fluyen a través de la transformación, los datos deben ordenarse según la agrupación de su agregado.

La transformada de búsqueda (Lookup) le permite buscar un valor a partir de una fuente de datos y recuperar datos adicionales basados en el valor de búsqueda. Por ejemplo, puede buscar un código de país dentro de una tabla y recuperar el nombre del país para enviarlo a una tabla de destino.

La transformación de caché le permite almacenar en memoria caché un conjunto de datos que se pueden utilizar dentro del flujo de datos. Almacenar en caché un conjunto de datos es especialmente útil para la transformación Lookup, de modo que no tiene que realizar una llamada a la fuente de consulta para cada fila que pasa a través de la transformada.

“Agrupación aproximada” y “Búsqueda aproximada” (Fuzzy Grouping y Fuzzy Lookup respectivamente) son características que sólo están disponibles en la edición Enterprise de SQL Server. Estas dos transformaciones le permiten realizar coincidencias flexibles (matching) y operaciones de agrupamiento. Aunque otras transformadas requieren una coincidencia exacta, Fuzzy Grouping y Fuzzy Lookup se pueden configurar en función de un umbral de confianza y son capaces de hacer corresponder coincidencias a pesar de la transposición de caracteres o faltas de ortografía.

www.detodoprogramacion.com

Page 393: Microsoft SQL Server 2008 Español - Mike Hotek

384 Parte VII Business Intelligence

La transformación “Mapa de caracteres” permite asignar conjuntos de caracteres en el flujo de datos. Uno de los usos de la transformación Mapa de caracteres es si usted necesita convertir los datos EBCIDC. Considérese afortunado si usted no sabe lo que es EBCIDC.

“División condicional” (Conditional split) se utiliza para romper una fuente de datos en varios flujos en función de una condición. Por ejemplo, el flujo de datos podría contener las ventas de los 50 estados de EE.UU., y tiene como destino una tabla separada para cada estado. La transformación División condicional se puede utilizar para tomar un solo flujo de datos y dividirlo en 50 salidas separadas basadas en el valor de una columna dentro del conjunto de datos.

La transformación Conversión de datos convierte los tipos de datos. Es necesario recordar que está trabajando dentro de Visual Studio. Los tipos de datos que se pueden ver no son tipos de datos de SQL Server, sino que son tipos de datos de Visual Studio. La Tabla 24-1 proporciona la relación entre los tipos de datos de Visual Studio y los tipos de datos más comunes de SQL Server.

TABLA 24-1 Correspondencias de tipos de datos entre Visual Studio y SQL Server

SQL Server

DATE

TIME

DATETIME

BIGINT

INT

SMALLINT

TINYINT

MONEY

DECIMAL

CHAR / VARCHAR

VARCHAR (MAX)

UNIQUEIDENTIFIER

Visual Studio

DB Date

DB Time

Database Timestamp

8-byte signed integer

4-byte signed integer

2-byte signed integer

Single byte unsigned integer

Currency

Numeric

String

Text Stream

GUID

La transformación “Columna derivada” se utiliza cada vez que necesite manipular datos, tales como extraer los espacios anteriores/posteriores, reemplazar cadenas vacías con un valor NULL, eliminar caracteres no válidos o calcular nuevos valores. La transformación “Columna derivada” utiliza expresiones regulares de C# para realizar tareas de manipulación de datos.

“Columna de exportación” envía datos a un archivo, mientras que la “Columna de importación” lee los datos desde un archivo y lo añade al flujo de datos.

La transformada de mezcla (Merge), combina dos flujos de datos ordenados en una sola salida. La transformación “Unión de todo” (Union All) es similar a la fusión que combina secuencias de datos. Sin embargo, los flujos de datos no tienen que ser ordenados y Union All puede combinar más de dos flujos de datos entre sí.

“Combinación de mezcla” (merge join) combina los conjuntos de datos junto con una funcionalidad similar a la ejecución de una declaración SELECT con un JOIN interior o exterior (inner o outer). Para aplicar la transformación “Merge Join), los conjuntos de datos deben estar ordenados.

www.detodoprogramacion.com

Page 394: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 385

Multicast permite emitir una entrada a varios destinos, por ejemplo, escribir una entrada contra un servidor SQL y al mismo tiempo escribir los mismos datos a un archivo.

El Comando de OLE DB permite ejecutar cualquier sentencia SQL válida. La declaración es ejecutada una vez para cada fila que pasa a través de la transformada.

Porcentaje y Muestreo de fila, se utilizan principalmente para actividades de desarrollo. La tarea más difícil en el diseño y prueba de procesos de ETL es la creación de un conjunto de datos representativos, creados para probar la más amplia gama de valores. Con la transformación de “muestreo”, se pueden tomar en vivo los datos de producción y ampliar el volumen a un tamaño manejable en función de sus necesidades. Puesto que el algoritmo de muestreo selecciona las filas al azar, usted puede crear fácilmente un conjunto de muestras representativas.

La transformación “Contador de filas” (Row count) cuenta cada fila a medida que pasa a través del componente. El número de filas procesadas se almacena en una variable que se define y se puede acceder por otros componentes dentro del paquete.

La transformada de Pivot toma el flujo de datos entrante, convierte filas especificas en columnas, y opcionalmente, permite calcular un agregado. La funcionalidad de pivote es equivalente al operador PIVOT en T-SQL o a los servicios de Excel de la tabla dinámica. La transformación Unpivot gira columnas de un flujo de datos entrante y devuelve filas como salida. Unpivot no es lo contrario de pivote, porque cualquier agregación no puede descomponerse nuevamente en las partes que la constituyen.

La transformada de “secuencias de comandos” (script) le permite incluir un script de Visual Basic. NET o C#. NET en un flujo de datos. Un uso común del componente de script es para manipular datos que no se ajustan a uno de los formatos estándar de un adaptador fuente o destino.

Las dimensiones de variación lenta (SCD – Slowly Changing Dimensios) son un problema dentro de los cubos de Analysis Services que requieren procesamiento especializado. SCD maneja casos tales como el de partir una división dentro de una empresa y cómo las ventas se agregan antes y después de la división “split”.

“Extracción de términos” (Term Extraction) y “Búsqueda de términos” (Term Lookup), comúnmente se usan en minería de texto. La transformación Extracción de términos permite buscar palabras dentro de un flujo de datos. El Term Lookup permite comprobar términos contra un conjunto de referencia, así como contar ocurrencias. La minería de texto se puede utilizar para buscar rápidamente grandes cantidades de datos no estructurados, con el fin de encontrar la colección de documentos que son de interés para un tema en particular.

Construcción de un paquete

La construcción de un paquete consta de varios pasos:

 

 

 

 

 

Crear administradores de conexión

Construir el flujo de control

Establecer restricciones de precedencia

Generar el flujo de datos

Agregar el manejo de excepciones

www.detodoprogramacion.com

Page 395: Microsoft SQL Server 2008 Español - Mike Hotek

386 Parte VII Business Intelligence

 

 

Creación de un archivo de configuración

El despliegue del paquete

Nota Como con cualquier actividad de desarrollo, se debe entender que usted guarda su trabajo con frecuencia y que prueba cada cambio que se hace.

Conexiones

Los “Gestores de conexión” (Connection Managers) definen las cadenas de conexión a cualquier objeto con el que su paquete va a interactuar, por ejemplo, archivos y bases de datos. Las conexiones se agregan en ell panel de Gestión de Conexiones, en la parte inferior de la superficie principal de diseño.

En el siguiente ejercicio, definirá los objetos de conexión para un archivo de texto de origen que contiene nuevas opciones de productos que serán importados a la tabla Products.ProductOptions (el archivo junto con un paquete completo se puede encontrar en el directorio Capítulo 24 de las muestras que acompañan el libro).

Crear objetos Connection

1. Copie el archivo productoptions.txt del directorio “Chapter 24” de los ejemplos del libro en “C:\test”.

2. Haga clic derecho en el panel “Connection Managers” y seleccione Nueva conexión de archivos planos (New Flat File Connection).

www.detodoprogramacion.com

Page 396: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 387

3. Déle un nombre al Administrador de conexión y seleccione el archivo ”C:\test\productoptions.txt”.

4. Haga clic en “Columnas” y revise los datos en la ventana de vista previa. Tenga en cuenta que la ventana vista previa tiene comillas dobles alrededor de todos los datos de texto que no quieren ser tratados como caracteres en el flujo de datos.

www.detodoprogramacion.com

Page 397: Microsoft SQL Server 2008 Español - Mike Hotek

388 Parte VII Business Intelligence

5. Haga clic en General y especifique “comillas dobles” para el calificador de texto. Haga clic en Columnas y verifique que las comillas dobles se han eliminado.

6. Muévase a la derecha (con el Scoll horizontal) y observe que tiene una columna 4, que no contiene ningún dato. Por defecto, el delimitador de filas es {CR} {LF}, pero nuestro archivo de entrada tiene un {comma}{CR}{LF} como delimitador. Edite el delimitador de filas a incluya la “coma” y observe que la

ventana de vista previa se redujo.

www.detodoprogramacion.com

Page 398: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 389

7. Haga clic en el botón “Restablecer columnas” y observe que la columna vacía ha sido eliminada.

8. Haga clic en Aceptar.

9. Haga clic derecho en el panel “Connection Managers” y seleccione Nueva conexión OLE DB.

www.detodoprogramacion.com

Page 399: Microsoft SQL Server 2008 Español - Mike Hotek

390 Parte VII Business Intelligence

10. Haga clic en “Nuevo” y especifique la configuración de conexión a la base de datos SQL2008SBS.

11. Haga clic en Aceptar para crear el administrador de conexión.

Control de Flujo

El flujo de control se utiliza para especificar el proceso de negocio que usted desea que el paquete ejecute.

En el siguiente ejercicio, creará una tarea de Flujo de Datos que se utilizará para importar los datos de las nuevas opciones de productos, y una vez que los datos se importen, le cambiará el nombre al archivo.

Construir el flujo de control

1. Arrastre una tarea de “flujo de datos” y una tarea de “sistema de archivos” desde el cuadro de herramientas hasta la superficie de diseño del flujo de control.

2. Dado que sólo desea que el archivo sea renombrado una vez que las opciones de producto han sido importadas correctamente, seleccione la tarea de flujo de datos, arrastre la flecha verde, y arrástrela hasta que toque la tarea “File System” para crear una restricción de precedencia.

3. Haga doble clic en la restricción de precedencia para ver los ajustes que se pueden realizar y haga clic en Cancelar.

www.detodoprogramacion.com

Page 400: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 391

www.detodoprogramacion.com

Page 401: Microsoft SQL Server 2008 Español - Mike Hotek

392 Parte VII Business Intelligence

4. Haga doble clic en la tarea Sistema de archivos (File System).

5. Haga clic en el menú desplegable en el campo “DestinationConnection” y seleccione <Nueva Conexión>.

6. Cree un nuevo administrador de conexión y haga clic en Aceptar.

www.detodoprogramacion.com

Page 402: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 393

7. Configure la “Operación para renombrar el archivo” y el administrador de conexión para la “conexión origen para las opciones de productos” y haga clic en Aceptar.

8. Dado que todavía no estamos preparados para que esto se ejecute, haga clic derecho en la “tarea de flujo de datos” y seleccione Deshabilitar (Disable).

www.detodoprogramacion.com

Page 403: Microsoft SQL Server 2008 Español - Mike Hotek

394 Parte VII Business Intelligence

9. Guarde su paquete.

10. Puede ejecutar el paquete para probar el cambio de nombre del archivo haciendo clic en la flecha verde en la barra de herramientas, pulsando F5, seleccionando “Depurar|Iniciar depuración” o con el botón derecho del ratón sobre el paquete en el Explorador de soluciones y seleccionar “Ejecutar paquete”. Elija una de los métodos de ejecución para ejecutar el paquete.

11. Dado que fue desactivada, la tarea “Flujo de datos” no se ejecutó. Usted debería ver la tarea “File System” en verde y si nos fijamos en la carpeta “C:\ test”, debería ver que el archivo ha sido renombrado.

12. Cámbiele el nombre del archivo a “productoptions.txt” y seleccione “Depurar|Detener depuración” para volver a la zona de diseño del flujo de control.

13. Haga clic en la tarea de flujo de datos y seleccione Habilitar.

14. Cámbiele el nombre de las tareas para darles nombres más descriptivos, haga clic derecho en la tarea y seleccione “renombrar” o seleccione la tarea y cámbiele el nombre en el panel de propiedades.

Flujo de datos

Las tareas de “flujo de datos” están diseñadas para generar el flujo de datos desde un origen a un destino, mientras que también proporcionan una transformación de datos en el medio.

www.detodoprogramacion.com

Page 404: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 395

Aunque un flujo de control define un proceso de negocio con varios componentes, un flujo de datos es un elemento único e indivisible dentro de un paquete.

En el siguiente ejercicio, va a crear la rutina de importación que carga el archivo de opciones de productos en la tabla Products.ProductOptions. Durante la carga, tendrá que transformar los datos desde la fuente de entrada conteniendo el nombre del producto y no el ProductID el que es requerido por la tabla Products.ProductOptions.

Crear un flujo de datos

1. Seleccione la ficha Flujo de datos y arrastre un origen de archivo plano (Flat File Source), una transformación de búsqueda (Lookup) y un Destino OLE DB, todos en la zona de diseño del flujo de datos.

2. Haga doble clic en el origen de archivo plano y configure el administrador de conexión con la Conexión a las Opciones de Producto.

3. Haga clic en el botón de vista previa para asegurarse de que ha seleccionado el administrador de conexión correcto y haga clic en Cerrar.

4. Haga clic en Columnas y asegurarse de que todas las columnas han sido seleccionadas y haga clic en Aceptar.

www.detodoprogramacion.com

Page 405: Microsoft SQL Server 2008 Español - Mike Hotek

396 Parte VII Business Intelligence

www.detodoprogramacion.com

Page 406: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 397

5. Arrastre la flecha verde en el origen de archivo plano y colóquela en la transformación de búsqueda (Lookup). Las flechas dentro de una tarea de flujo de datos definen cómo se mueven los datos de un componente a otro y no son restricciones de precedencia.

6. Haga doble clic en el transformador Lookup, seleccione Full Cache, Administrador de conexión OLE DB, y Falla de componentes (Fail Component).

www.detodoprogramacion.com

Page 407: Microsoft SQL Server 2008 Español - Mike Hotek

398 Parte VII Business Intelligence

7. Seleccione Conexión, especifique el administrador de conexión a la base de datos SQL2008SBS y

seleccione la tabla Products.Product.

8. Seleccione columnas. Arrastre la columna 1 y colóquelo en la columna Nombre del producto. Seleccione la columna ProductID, especifique <agregar como columna nueva>, deje el alias de salida establecido para ProductID, y haga clic en Aceptar.

www.detodoprogramacion.com

Page 408: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 399

9. Arrastre la flecha verde de la transformación de búsqueda al destino de OLE DB. Especifique

Coincidencias de búsqueda de salida para la salida, Destino OLE DB para la entrada y haga clic en Aceptar.

10. Haga doble clic en el destino de OLE DB y seleccione la tabla Products.ProductOptions

y 1000 para las “Filas para la configuración por lotes”.

www.detodoprogramacion.com

Page 409: Microsoft SQL Server 2008 Español - Mike Hotek

400 Parte VII Business Intelligence

11. Haga clic en Mappings, asigne las columnas de entrada con las correspondientes columnas de destino y haga clic en Aceptar.

12. Déle a sus objetos de flujo de datos nombres descriptivos y guarde el paquete.

www.detodoprogramacion.com

Page 410: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 401

13. Con la tarea de flujo de datos seleccionada, ejecute el paquete. Observe que el paquete falla

en la carga de la tabla Products.ProductOptions.

14. Detenga la depuración.

Conversión de datos

Cuando usted tiene archivos de texto como origen de datos, SSIS no sabe cuáles son los tipos de datos para cualquiera de las columnas de entrada. Por lo tanto, cada columna se clasifica de acuerdo con el tipo de datos predeterminado, que es una cadena de 50 caracteres. Como las cadenas no se convierten implícitamente a cualquier otro tipo de datos, es necesario convertir los datos a los tipos de datos adecuados. Las conversiones de tipos de datos pueden ocurrir en dos lugares: en la definición del administrador de conexión de origen y mediante el uso de una transformación “Conversión de datos”. Si no necesita realizar otra transformación de los datos antes de convertir el tipo de datos, el lugar más sencillo para convertir los tipos de datos se encuentra dentro del administrador de conexión de entrada.

En el siguiente ejercicio, vamos a convertir los tipos de datos desde el administrador de conexiones.

Convertir tipos de datos

1. Haga doble clic en el administrador de conexión “Product Options” y seleccione Opciones avanzadas.

2. Configure la “columna 0 “al tipo de datos cadena de 10-caracteres, columna 1 a una cadena de 50 caracteres, columna 2 a una cadena de 50- caracteres, y la columna 3 al tipo currency. Seleccione Vista previa y haga clic en Aceptar.

www.detodoprogramacion.com

Page 411: Microsoft SQL Server 2008 Español - Mike Hotek

402 Parte VII Business Intelligence

3. Usted debería ver un símbolo de advertencia en su origen de datos de importación.

www.detodoprogramacion.com

Page 412: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 403

4. Haga doble clic en la fuente de entrada y seleccione “Sí” para reemplazar los metadatos y haga clic en Aceptar.

5. Guarde y ejecute el paquete.

6. Observe que el paquete todavía falla debido a datos no válidos en una fila del archivo de entrada.

Control de excepciones

Las aplicaciones ETL serían muy simples para generar y ejecutar si siempre podrían contar con los datos de entrada formateados correctamente. Lamentablemente, es una ocurrencia común que los datos no sean válidos. Además, es común en aplicaciones ETL, la búsqueda de los datos no válidos dentro de archivos de gran tamaño, esto consume una gran cantidad de tiempo si se hace prueba y error. La tarea de encontrar los datos no válidos sería muy simple si el paquete pudiera saltear las filas que contienen datos no válidos, mientras que pasaran todas las filas que son válidas.

En el siguiente ejercicio, configurará el control de excepciones para que las tareas de flujo de datos salteen todas las filas que no son válidas a partir de la fuente de entrada, así como las filas que violan cualquier restricción de bases de datos.

Crear controladores de excepción (Exception Handlers)

1. Arrastre dos objetos “Flat File Destination” a la zona de diseño de flujo de datos y póngales los siguientes nombres “Errores de conversión de datos” (Data Convert Error) y “Errores DB” (DB Errors) respectivamente.

www.detodoprogramacion.com

Page 413: Microsoft SQL Server 2008 Español - Mike Hotek

404 Parte VII Business Intelligence

2. Seleccione el adaptador de fuente de entrada, arrastre la flecha roja, y colóquela en el destino “Data Convert Error”.

3. Cuando se abra la ventana de diálogo “Configurar la salida por error” (Configure Error Outpun), configure todas las columnas con la opción “Redirigir filas” tanto para el caso de Error como para el de Truncamiento y haga clic en Aceptar.

4. Haga doble clic sobre el destino “Errores de conversión de Datos” (Data Convert Error) y cree un nuevo administrador de conexión.

5. Seleccione “Delimitado” para el formato de archivo y póngale el nombre de archivo C:\test\dataconverterrors.txt, un nombre de administrador de conexiones Data Convert Errors, y haga clic en Aceptar.

6. Seleccione Asignaciones (Mappings), y asegúrese que todas las columnas de entrada están asignadas a cada columna destino y haga clic en Aceptar.

www.detodoprogramacion.com

Page 414: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 405

7. Repita con la salida de “Error de OLE DB de destino”.

www.detodoprogramacion.com

Page 415: Microsoft SQL Server 2008 Español - Mike Hotek

406 Parte VII Business Intelligence

8. Haga doble clic en el destino “Carga de opciones de producto”, cambie el modo de acceso a datos a Tabla o Vista, y haga clic en Aceptar.

9. Guarde y ejecute el paquete.

10. Compruebe que 1 fila fue expulsada debido a un tipo de datos no válido y que se ha rechazado una fila debido a una violación de una clave principal. Su tabla “Products.ProductOptions” debería tener ahora 208 filas en ella.

Configuración

Ahora que tiene probado el paquete y en funcionamiento, está listo para implementar el paquete en producción. Sólo hay un problema, todas sus fuentes de datos están codificados para apuntar a una instancia, archivos y directorios que existen en el equipo de desarrollo. ¿Son la estructura de directorio, el nombre de archivo y el nombre de la instancia los mismos en producción?

Usted acaba de llegar a la barrera más difícil de un paquete DTS. Antes de que SSIS sea introducido en SQL Server 2005, usted tenía que abrir el paquete DTS y recodificar todas las conexiones para el destino de producción, con la esperanza de que sin querer no modificara cualquier otra cosa.

www.detodoprogramacion.com

Page 416: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 407

Para superar el obstáculo de mantenimiento de ambientes separados, SSIS introdujo las configuraciones de paquete que pueden ser usadas para reemplazar las configuraciones dentro del mismo.

En el siguiente ejercicio, creará un archivo de configuración de paquete que le permitirá sustituir la ubicación de cada archivo, así como el nombre de la instancia.

Agregar archivos de configuración del paquete

1. Vuelva al entorno de antes de la ejecución exitosa de su paquete, eliminando las filas recién agregadas de la tabla Products.ProductOptions (una pista: el ProductID> 8) y cambie la extensión del archivo ProductOptions de nuevo a .Txt.

2. Cree una nueva carpeta llamada C:\Test\ProdDir y mueva el archivo “productoptions.txt” a esta carpeta para asegurarse que si usted ejecutara el paquete en este punto, fallaría.

3. Dentro del BIDS, seleccione “SSIS | Configuraciones de paquetes”.

4. Seleccione “Habilitar configuraciones de paquetes”, haga clic en Agregar y haga clic en Siguiente.

5. Especifique un “Archivo de configuración XML”, póngale un nombre al archivo y haga clic en Siguiente.

www.detodoprogramacion.com

Page 417: Microsoft SQL Server 2008 Español - Mike Hotek

408 Parte VII Business Intelligence

6. Expanda el nodo “Propiedades” debajo de cada “Connection Manager”, seleccione la casilla de verificación ConnectionString y haga clic en Siguiente.

7. Déle un nombre a la configuración, haga clic en Finalizar y luego en Cerrar.

www.detodoprogramacion.com

Page 418: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 409

8. Abra el archivo “sql2008sbs.dtsconfig” en el Bloc de notas.

9. Cambie cada ocurrencia de la cadena “C:\Test” por “C:\Test\ProdDir”.

10. Guarde y cierre el archivo de configuración.

11. Guarde el paquete y vuelva a ejecutarlo. Compruebe que el paquete se ha ejecutado correctamente, lo que demuestra que SSIS aplica el archivo de configuración por encima de la configuración de paquetes previo a la ejecución.

Despliegue (Deployment)

Ahora está listo para implementar su paquete SSIS. BIDS tiene características que le permiten desplegar un paquete directamente a producción, sin embargo, es muy poco probable que el programador de un paquete tenga la autoridad para implementar en un servidor de producción. También puede construir un archivo manifiesto de implementación que puede ser lanzado por un administrador para instalar el paquete. Aunque ambos métodos funcionarán, dado los privilegios suficientes, usted estará gastando una gran cantidad de esfuerzo sin ningún beneficio.

Todo el contenido de su paquete está contenido dentro del archivo. Dtsx en el directorio de su solución. Usted puede simplemente copiar este archivo, junto con cualquier otro archivo de configuración correspondiente, al entorno de producción. Una vez copiado, un administrador puede utilizar SSMS para cargar el paquete ya sea en la base de datos msdb o en el almacenamiento de paquetes SSIS de producción (SSIS Packaged store).

En el siguiente ejercicio, implementará el paquete SSIS que acaba de crear en la instancia y almacenará el paquete en la base de datos msdb.

Implementación de un paquete

1. Inicie SSMS, haga clic en el menú desplegable “Connect” desde el Explorador de objetos y seleccione “Integration Services”.

www.detodoprogramacion.com

Page 419: Microsoft SQL Server 2008 Español - Mike Hotek

410 Parte VII Business Intelligence

2. Introduzca el nombre del servidor y haga clic en Conectar.

3. Expanda el nodo MSDB bajo el nodo Paquetes almacenados.

4. Haga clic en el nodo MSDB y seleccione Importar paquete.

5. Seleccione Sistema de archivos, seleccione su paquete y haga clic en Aceptar.

www.detodoprogramacion.com

Page 420: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 24 - SQL Server Integration Services 411

Capítulo 24 Referencia rápida

Para

Crear un paquete de Integration Services

Crear un administrador de conexiones

Haga lo siguiente

Inicie BIDS y seleccione el proyecto de Integration Services. Especifique un

nombre para el proyecto y un directorio para el almacenamiento.

Haga clic-derecho en el panel “Administradores de conexión” y seleccione Nueva Conexión correspondiente al tipo de “Administrador de conexión” que desea crear. Por ejemplo, una nueva conexión de archivos planos.

Arrastre el objeto de flujo de control deseado desde la caja de herramientas, hacia la zona de diseño del Flujo de control y establezca las propiedades necesarias.

Haga clic-derecho en la tarea de flujo de control y seleccione “Deshabilitar”.

Arrastre una tarea de flujo de datos desde la caja de herramientas hacia la zona de diseño del flujo de control.

Seleccione un objeto de flujo de control, arrastre la flecha verde, y suéltela sobre el objeto de flujo de control al que afectará la restricción. Haga doble clic en la restricción para establecer la acción de precedencia como por ejemplo el éxito en la ejecución, el fracaso, o la finalización.

Seleccione el diseño de flujo de datos. Arrastre el adaptador de origen deseado

desde la caja de herramientas hasta la zona de diseño de Flujo de datos. Configure el Administrador de conexión para el adaptador de datos.

Arrastre el adaptador destino deseado desde la caja de herramientas hasta la zona de diseño del Flujo de Datos. Configure el Administrador de conexión y las asignaciones de las columnas para el adaptador de datos.

Arrastre la transformación deseada desde la caja de herramientas hasta la zona de diseño del flujo de datos. Conecte una entrada y una salida para la transformación. Configure la manipulación de datos deseada.

Seleccione la ficha “Control de errores” de cualquier componente del flujo de datos. Especifique la acción a tomar, por ejemplo: “Error de componente”, “Redireccionar fila”, u “Omitir error”. Si especifica “Redireccionar fila”, configure un adaptador de datos destino para aceptar las filas redirigidas.

Dentro de BIDS, puede lanzar un paquete en el depurador realizando cualquiera de las siguientes acciones:   Pulsando F5

 

 

 

Seleccionando Depurar | Iniciar depuración

Haciendo clic en la flecha verde en la barra de herramientas

Haciendo clic-derecho en el paquete en el Explorador de soluciones y seleccionando Ejecutar

Crear una tarea de flujo de control

Desactivar una tarea del flujo de control

Crear una tarea de flujo de datos

Agregar una restricción de precedencia

Crear un adaptador de datos origen

Crear un adaptador de datos de destino

Añadir una transformada

Configurar el control de excepciones

Probar un paquete

Crear un archivo de configuración Seleccione “SSIS | Configuraciones de paquetes”. Siga el asistente de configuración de embalaje para especificar los parámetros para el archivo de configuración.

www.detodoprogramacion.com

Page 421: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25

SQL Server Reporting Services

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

Configurar una instalación de Reporting Services

Crear informes

Implementar informes

Crear y administrar las suscripciones

Administrar el almacenamiento en caché e instantáneas

SQL Server Reporting Services (SSRS) ofrece la generación de informes a nivel de empresa y una plataforma de distribución para satisfacer una variedad de necesidades de una organización. En este capítulo, aprenderá a configurar y validar una instalación de SSRS. También aprenderá a crear, implementar y administrar informes.

Más información Para una discusión detallada de SSRS, por favor consulte el libro “SQL Server 2008 Reporting Services Paso a paso.

Configurando Reporting Services

Aunque se distribuye con SQL Server, SSRS es una aplicación ASP.NET que almacena los datos en una base de datos. Para que funcione, tendrá que configurar los directorios virtuales y las credenciales para la aplicación Web, junto con la instancia donde se encuentran alojadas las bases de datos de SSRS. Debido a los componentes únicos, SSRS tiene una utilidad de configuración independiente. La Figura 25-1 muestra el Gestor de configuración de SQL Server Reporting Services.

Junto con otras tareas de configuración, el servicio SSRS puede ser iniciado o detenido desde el Administrador de configuración de SSRS. La URL del servicio Web y la dirección URL del Administrador de Reportes, les permiten configurar los directorios virtuales, junto con las direcciones URL que serán utilizados para acceder a la web de SSRS. Además de configurar los directorios virtuales, también tendrá que configurar la instancia en la que desea hospedar las bases de datos de SSRS. La Figura 25-2 muestra la configuración de base de datos que puede ser especificada.

413

www.detodoprogramacion.com

Page 422: Microsoft SQL Server 2008 Español - Mike Hotek

414 Parte VII Business Intelligence

FIGURA 25-1 Gestor de Configuración de Reporting Services

FIGURA 25-2 Configuración de la base de datos de SSRS y credenciales de conexión

www.detodoprogramacion.com

Page 423: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 415

Durante la configuración, se crean dos bases de datos de forma predeterminada en la instancia: ReportServer y ReportServerTemp. La base de datos ReportServer se utiliza para almacenar toda la configuración de SSRS y la información de seguridad junto con la definición de todos los informes. La base de datos ReportServerTemp se utiliza para almacenar todos los datos intermedios utilizados en la creación de un informe. La conexión a la instancia de base de datos utiliza la autenticación de Windows con la cuenta de servicio de SSRS.

SSRS es un motor de ejecución de informes. Como tal, puede hacer que los informes se conecten y recuperen información de una variedad de bases de datos a través de muchas instancias dentro de su organización. Cuando los informes son configurados, puede especificar explícitamente las credenciales para un informe o puede contar con una cuenta de seguridad administrada centralmente. La Figura 25-3 muestra la definición de una cuenta que es utilizada por SSRS para credenciales cuando no se especifica una cuenta de seguridad con el informe que está siendo ejecutado.

FIGURA 25-3 Especificación de la cuenta predeterminada de ejecución de informes.

La definición de un informe contiene una gran cantidad de información sensible que potencialmente puedeponer en peligro su entorno, como los nombres de instancia y base de datos, así como los nombres de las tablas y columnas. Con el fin de proteger a los metadatos de su entorno, SSRS encripta los datos que usted almacenó en el servidor. La gestión de claves de cifrado se maneja en la página “Claves de Encriptación“, que se muestra en la Figura 25-4.

www.detodoprogramacion.com

Page 424: Microsoft SQL Server 2008 Español - Mike Hotek

416 Parte VII Business Intelligence

FIGURA 25-4 Gestión de claves de cifrado SSRS

A través de los años, muchas personas se han preguntado cómo agrupar (cluster) SSRS para garantizar la máxima disponibilidad de una infraestructura de informes. SSRS consiste en una aplicación Web que se conecta a una instancia de base de datos. Aunque es posible “agrupar” la instancia que aloja las bases de datos de SSRS, no es posible agrupar la aplicación SSRS. En su lugar, puede simplemente hacer copias adicionales de la aplicación SSRS a través de varios servidores. Las copias no sólo proporcionan tolerancia a fallos, también proporcionan escalabilidad adicional.

La edición Enterprise de SSRS permite configurar una arquitectura escalable (scale-out), donde tiene múltiples y activos sitios web de SSRS que se conectan al mismo conjunto de bases de datos de SSRS. Usted puede configurar una arquitectura scale-out, como se muestra en la Figura 25-5.

En el siguiente ejercicio, se inspeccionará la configuración de la instalación de SSRS que realizó en el Capítulo 2, "Instalación y configuración de SQL Server 2008".

Configurar Reporting Services

1. Inicie el “Administrador de configuración de Reporting Services” y conéctese a su servidor de informes.

2. Revise la configuración de su instalación SSRS.

www.detodoprogramacion.com

Page 425: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 417

FIGURA 25-5 Construyendo una implementación SSRS escalable

Sitio Web de servicios de informes El sitio web de SSRS permite el acceso a todos los objetos de informe y le permite gestionar objetos, hacer configuraciones generales, configuración de objetos y seguridad. Los usuarios finales también pueden acceder al sitio web de SSRS para ejecutar informes y exportar un informe a un formato deseado.

Se puede acceder al sitio web de SSRS, navegando la url http://machinename:8080/Reports, como se muestra en la Figura 25-6.

En el siguiente ejercicio, se pondrá en marcha el sitio web de SSRS.

Nota La primera vez que inicie el sitio web de SSRS, habrá un retraso notable. El retraso se debe a que IIS necesita cargar todo el framework. NET y los componentes ASP.NET en los que se basa SSRS.

Validar una configuración de Reporting Services

1. Inicie Internet Explorer.

2. Vaya al sitio Web del servidor de reportes, por ejemplo http://hotek2:8080/Reports.

www.detodoprogramacion.com

Page 426: Microsoft SQL Server 2008 Español - Mike Hotek

418 Parte VII Business Intelligence

FIGURA 25-6 El sitio web de SSRS

Creando Reportes

SSRS proporciona los componentes de infraestructura necesarios para gestionar y ejecutar informes. Sin embargo, sin informes a ejecutar, SSRS sería un producto “aburrido”. Microsoft tiene desarrollado un diseñador de informes que le permite crear todos los informes que hacen de SSRS algo útil para una organización. Junto con el diseñador de informes, ha sido creado un “lenguaje de definición de informes de código abierto” llamado Report Definition Language (RDL), para permitir a terceros el desarrollo de herramientas para generar informes de SSRS.

Un informe consta de dos componentes principales:

 

 

Una fuente de datos que define la consulta (query) o el procedimiento (procedure) que proporciona los datos. Una definición de informe que define cómo son formateados y mostrados los datos.

Creando un informe

La construcción de un informe básico consiste en varios pasos:

 

 

Especificar una cadena de conexión

Definir la consulta

www.detodoprogramacion.com

Page 427: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services

 

 

 

419

Darle formato a los datos

Elegir una ubicación para implementar (deploy) el informe

Realizar una vista previa del nuevo informe.

En el siguiente ejercicio, utilizará el Asistente para informes, para crear su primer informe, que se utilizará para explicar la configuración, las opciones de ejecución y el formato adicional dentro del Diseñador de informes y SSRS.

Crear un informe

1. Inicie el BIDS y seleccione Archivo | Nuevo | Proyecto.

2. Seleccione el “Asistente de proyectos del servidor de informes”, nombre el proyecto y la solución, especifique el directorio y haga clic en Aceptar.

3. Cuando se inicia el asistente, haga clic en Siguiente en la pantalla de bienvenida.

4. Colóquele un nombre al origen de datos, haga clic en el botón Editar, especifique su instancia, la base de datos SQL2008SBS, pruebe su conexión y haga clic en Aceptar.

5. Seleccione la casilla de verificación para hacer del origen de datos un origen compartido y haga clic en Siguiente.

6. Especifique la siguiente consulta y haga clic en Next (el código se puede encontrar en el archivo Chapter25\code1.sql en las muestras que acompañan el presente libro).

SELECT CASE WHEN a.CompanyName IS NOT NULL THEN a.CompanyName ELSE a.FirstName + ' ' + a.LastName END CustomerName,

b.City, d.StateProvince, e.CountryName, c.OrderID, c.OrderDate, c.SubTotal, c.ShippingAmount, c.TaxAmount, c.GrandTotal, c.FinalShipDate

www.detodoprogramacion.com

Page 428: Microsoft SQL Server 2008 Español - Mike Hotek

420 Parte VII Business Intelligence

FROM Customers.Customer a INNER JOIN Customers.CustomerAddress b ON a.CustomerID = b.CustomerID INNER JOIN Orders.OrderHeader c ON a.CustomerID = c.CustomerID INNER JOIN LookupTables.StateProvince d ON b.StateProvinceID = d.StateProvinceID INNER JOIN LookupTables.Country e ON b.CountryID = e.CountryID

www.detodoprogramacion.com

Page 429: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 421

7. Seleccione “Tabular” para el tipo de informe y haga clic en Siguiente.

8. Agregue los campos al informe, como se muestra en el siguiente gráfico y haga clic en Siguiente.

9. Seleccione un formato escalonado e incluya subtotales.

10. Seleccione un estilo de tabla y haga clic en Siguiente.

11. Deje la configuración de implementación en el valor predeterminado y haga clic en Siguiente.

www.detodoprogramacion.com

Page 430: Microsoft SQL Server 2008 Español - Mike Hotek

422 Parte VII Business Intelligence

12. Especifique un nombre para su informe, seleccione la casilla de verificación “Vista previa” y haga clic en Finalizar.

www.detodoprogramacion.com

Page 431: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 423

13. Después de revisar el informe, seleccione la pestaña Diseño.

Dando Formato

Una vez que se construye el informe inicial, la mayoría de las tareas que deberá llevar a cabo serán para "hacer que se vea lindo."

La caja de herramientas (toolbox) le permitirá agregar una variedad de ítems a su informe como cuadros de texto, imágenes, líneas y gráficos. También puede agregar tablas, matrices y subinformes para producir prácticamente cualquier tipo de presentación de informe que usted necesite. Si el informe lo requiere, usted puede incluso agregar referencias a “assemblies” .NET y ampliar las capacidades del informe a sus propias bibliotecas de código personalizado.

La mayor parte del trabajo que usted hará durante el “formateo” será “maquetar” (Laing out) el encabezado/pie del informe, agrupar datos, y darle el estilo a los elementos del informe.

El encabezado del informe es donde normalmente se coloca un título para el mismo y se añaden gráficos corporativos utilizando los controles cuadro de texto y de imagen respectivamente. El pie del informe es el que normalmente sirve para agregar elementos como derechos de autor y/o el número de página con los controles de cuadro de texto. Cada informe tiene un conjunto estándar de variables que se pueden utilizar como PageNumbre y TotalPages que sólo se pueden usar en la cabecera o el pie del informe.

En el informe que ha generado previamente, usted agregó grupos para el nombre del país y estado/provincia. Los grupos proporcionan el mismo tipo de capacidad de agregación como la cláusula de T-SQL GROUP BY. Sin embargo, en los informes, tiene un poco más de flexibilidad. Se podría ejecutar una declaración SELECT de las ventas totales por país y luego una por separado una declaración SELECT para

www.detodoprogramacion.com

Page 432: Microsoft SQL Server 2008 Español - Mike Hotek

424 Parte VII Business Intelligence

la agregación ventas totales por estado/provincia de un país. Mediante el agregado de grupos dentro de un informe, puede agrupar los datos y calcular ambos agregados en una sólo representación (rendering) del informe.

La categoría más importante de cambios que hará será “el estilo” (styling). Usted puede manipular cualquier elemento dentro de un informe u obtener el aspecto (look and feel) exacto que desee. Puede configurar:

 

 

 

 

 

El color de fondo y la imagen

El color del borde, el estilo y el ancho

El color del texto

EL tipo de letra, el tamaño, estilo (por ejemplo, cursiva), el espesor del trazo (por ejemplo, negrita), y la decoración (por ejemplo, subrayado)

El formato de visualización

El formato de visualización le permite darle formato a los elementos de datos de acuerdo con las opciones de estilo específicos. Los códigos de formato estándar que se utiliza en SSRS son los códigos de formato. NET. Por ejemplo, “C0” es un código de moneda mientras que “N0” especifica una opción de formato numérico. También puede establecer directamente formatos personalizados, por ejemplo:

 

 

 

 

 

 

# sustituto de cualquier número

sustitutos para el número del mes MM

mm especifica el número de minutos

dd sustituto para el número del día

yy especifica el año en dos dígitos

especifica un año en cuatro dígitos yyyy

En el siguiente ejercicio, usted mejorará su informe básico mediante el agregado de otros grupos, reorganizará los elementos del informe y le dará formato a los elementos del mismo.

Dando formato a los elementos del informe

1. Seleccione los campos de agregado Sum en el grupo cabecera CountryName y StateProvince

para el OrderID y elimínelos.

2. Haga clic en la columna Importe fiscal (Tax amount) y seleccione Eliminar columnas.

3. En el panel “Grupos de filas” en la parte inferior del Diseñador de informes, haga clic-derecho en el grupo StateProvince y seleccione Agregar grupo|Grupo hijo.

4. En el cuadro de diálogo “Grupo de Tablix”, seleccione la columna Ciudad para agrupar y seleccione Agregar Grupo encabezado. Haga clic en Aceptar.

5. En el panel Grupos de filas en la parte inferior del Diseñador de informes, haga clic-derecho en el grupo “Ciudad” y seleccione Agregar grupo|Grupo hijo.

6. En el cuadro de diálogo Grupo de Tablix, seleccione la columna CustomerName para agrupar y Agregar Grupo encabezado. Haga clic en Aceptar.

www.detodoprogramacion.com

Page 433: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 425

www.detodoprogramacion.com

Page 434: Microsoft SQL Server 2008 Español - Mike Hotek

426 Parte VII Business Intelligence

7. Elimine las dos columnas recientemente introducidas para el nombre de ciudad y de cliente.

8. Haga clic-derecho en la columna CustomerName y seleccione Insertar columna | Para agregar una nueva columna a la izquierda del nombre de cliente.

9. Mueva la columna City a la izquierda de CustomerName y mueva las columnas City y CustomerName en la cabecera del grupo correspondiente. Cámbiele los nombres de cada grupo de fila con un nombre amigable.

10. Seleccione el valor OrderDate. Configure el formato a mm/dd/yyyy.

11. Configure el formato de Subtotal, importe del envío, importe de impuesto, y el “Gran Total” con el siguiente formato: $ #, #. # #.

12. Realice la vista previa del informe para comprobar el formato.

www.detodoprogramacion.com

Page 435: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 427

www.detodoprogramacion.com

Page 436: Microsoft SQL Server 2008 Español - Mike Hotek

428 Parte VII Business Intelligence

www.detodoprogramacion.com

Page 437: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 429

Cálculos

Los Informes serían aburridos si lo único que podría hacer sería tomar datos de una consulta y aplicarle un diseño. Las expresiones le permiten introducir cálculos en su informe dentro de la agregación y manipular los datos de origen. Las expresiones también se extienden al formato ya que le permiten utilizar un cálculo para aplicar un formato condicional a los datos.

En el siguiente ejercicio, creará los agregados (aggregates) para los grupos “ciudad” y “cliente” que se han añadido en el ejercicio anterior. También aplicará formato condicional para que los clientes que han realizado pedidos por un total de más de $ 1900 se destaquen con un color diferente.

Crear cálculos de informe

1. Haga clic en el campo SubTotal en la cabecera del grupo de ciudades y seleccione Expresión. Ingrese la fórmula de = Sum(Fields!SubTotal.Value) y haga clic en Aceptar.

2. Agregue una suma para el subtotal por nombre de cliente.

3. Añada agregados de suma en el grupo de “Ciudad” para la cantidad de envío y total general (grand total).

4. Añada agregados de suma en el grupo de “Nombre del cliente” para la cantidad de envío y

Gran Total.

5. Configure el formato de sus nuevos agregados con el siguiente formato: $ #, #. # #.

www.detodoprogramacion.com

Page 438: Microsoft SQL Server 2008 Español - Mike Hotek

430 Parte VII Business Intelligence

6. Seleccione los agregados Subtotal, Cantidad enviada, y Grand Total para el grupo Nombre de Cliente. En la ventana Propiedades, haga clic en la lista desplegable de color y seleccione Expresión. Especifique la expresión condicional siguiente y haga clic en Aceptar.

=iif(Sum(Fields!GrandTotal.Value,"Group_CustomerName")>1900,"Green","Black")

www.detodoprogramacion.com

Page 439: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 431

7. Configure a Subrayado la fila de cabecera del grupo Nombre de País.

8. Configure a cursiva la fila de cabecera del grupo Provincia.

9. Establezca a Negrita la fila de cabecera del grupo Ciudad.

10. Configure a cursiva la fila de cabecera del grupo Nombre de Cliente y realice una vista previa del informe.

Elementos interactivos

El informe de ejemplo con el que usted ha estado trabajando provee una manera razonablemente útil para que los usuarios revisen la información de las órdenes de los clientes. Sin embargo, un usuario tendría que potencialmente navegar por docenas o cientos de páginas de información para encontrar la información específica que buscaba (un pensamiento que me trae recuerdos de informes de 10.000 páginas desde un ordenador central).

Usted puede mejorar la funcionalidad de su informe, y añadir elementos para hacer el informe interactivo al usuario, lo que le permite a un usuario localizar rápidamente la información necesaria. Puede agregar marcadores (bookmarks), capacidades de drill-down y acciones (actions). Los marcadores proporcionan un medio para saltar entre secciones de un informe muy grande. Las acciones permiten al usuario hacer cosas como saltar hasta un favorito, abrir una URL en una ventana del navegador, o incluso lanzar otro informe. La opción Drill-down se puede agregar mediante la especificación de las opciones de visibilidad.

En el siguiente ejercicio, configurará su informe para ocultar y luego mostrar la información basada en el usuario, alternando los elementos del informe que se muestran o no.

www.detodoprogramacion.com

Page 440: Microsoft SQL Server 2008 Español - Mike Hotek

432 Parte VII Business Intelligence

Construir un informe interactivo

1. En la parte inferior del informe, haga clic en la flecha hacia abajo situada junto a los grupos de filas Provincia y seleccione Propiedades del grupo. Seleccione la visibilidad y establezca la opción para ocultar la pantalla.

2. Haga clic en la flecha hacia abajo para el grupo de detalles y seleccione Propiedades del grupo. Seleccione Visibilidad y establezca la opción para ocultar la pantalla.

3. Configure con “ocultar” la visibilidad del grupo Ciudad y Clientes.

4. Realice una Vista previa del informe.

www.detodoprogramacion.com

Page 441: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 433

5. Haga clic en la flecha hacia abajo para el grupo Provincia, seleccione Propiedades del grupo, seleccione Visibilidad y ajuste el elemento de alternancia (toggle) para Nombre del país (CountryName).

6. Haga clic en la flecha hacia abajo para el grupo Ciudad y seleccione Propiedades del grupo y establezca el elemento de alternancia a Provincia.

7. Establezca la columna Nombre de cliente (CustomerName) para que sea alternada por la Ciudad.

8. Establezca la fila de detalle para que inicialmente esté oculta y conmute por el CustomerName.

9. Haga una vista previa del informe y revise las nuevas capacidades interactivas de drill-down.

www.detodoprogramacion.com

Page 442: Microsoft SQL Server 2008 Español - Mike Hotek

434 Parte VII Business Intelligence

Parámetros

Puede crear rápidamente informes y apuntarlos a las bases de datos que contienen grandes cantidades de datos. No sería raro que un informe como el que se está desarrollando en este capítulo devuelva decenas de millones de filas de datos. Si se va a implementar simplemente el informe tal como está en este punto y que los usuarios puedan acceder al mismo, es probable que reciba una llamada muy rápida de un administrador de base de datos (DBA) queriendo saber por qué esta leyendo millones de filas de datos sobre una base en forma constante. Los usuarios además no estarían muy feliz, porque el reporte funcionaría mal, además de ser prácticamente inutilizable ya que los usuarios no desearían recavar el historial de órdenes de hace 30 años, tan sólo para averiguar lo que está pasando en el mes en curso.

Los parámetros de informe proporcionan un medio para restringir el conjunto de datos que devuelve el informe. Los parámetros pueden ser puestos a disposición de los usuarios con el fin de permitir que especifiquen valores antes presentar un informe. Los parámetros también reducen el impacto sobre la fuente de datos mediante la especificación de valores para una cláusula WHERE que restringe los datos.

Nota Como regla general, todos los informes que usted implementa en un entorno de producción deben tener parámetros. Si va a distribuir un informe sin parámetros, usted debe tener una razón explícita para hacerlo, ya que la primera pregunta que un administrador debe hacer es: "¿Por qué su informe no tienen un parámetro?"

En el siguiente ejercicio, agregará parámetros para restringir las órdenes por año y mes. Aunque se puede suministrar una lista de selección de valores estáticos, también se creará una nueva consulta para recuperar sólo los años aplicables y los meses para que un usuario pueda elegir.

www.detodoprogramacion.com

Page 443: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 435

Especificar parámetros de informe

1. Seleccione el panel Datos del informe, haga clic derecho DataSet1 y seleccione Propiedades del conjunto de datos (Dataset). Cambie el nombre del conjunto de datos (dataset) a CustomerOrders y haga clic en Aceptar.

2. Haga clic derecho en SQL2008SBS y seleccione Agregar conjunto de datos (dataset).

3. Nombre el dataset como OrderMonthsandYears, especifique la siguiente consulta y haga clic en Aceptar.

SELECT DISTINCT YEAR(OrderDate) OrderYear, MONTH(OrderDate) OrderMonth FROM Orders.OrderHeader

www.detodoprogramacion.com

Page 444: Microsoft SQL Server 2008 Español - Mike Hotek

436 Parte VII Business Intelligence

4. Haga clic derecho en el nodo Parámetros y seleccione Agregar parámetro.

5. Establezca el nombre AñoPedido, especifique un valor para el Prompt (valor de entrada), y establezca el tipo de datos como Integer.

6. Seleccione “Valores disponibles”, seleccione “Obtener valores desde una consulta”, establezca las propiedades de la consulta para utilizar dataset OrderMonthsandYear y haga clic en Aceptar.

7. Agregue un parámetro para el Mes de la Orden, como en los pasos 4-6.

8. Haga clic derecho en el conjunto de datos CustomerOrders y seleccione Propiedades del conjunto de datos.

www.detodoprogramacion.com

Page 445: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 437

9. En el campo de consulta, agregue una cláusula WHERE de la siguiente manera:

WHERE YEAR(OrderDate) = @OrderYear AND MONTH(OrderDate) = @OrderMonth

10. Seleccione Parámetros, establezca el campo Valor de parámetro para cada uno de los parámetros que acaba de añadir y haga clic en Aceptar.

11. Haga clic-derecho en el cuerpo de su informe y seleccione Propiedades de Tablix.

www.detodoprogramacion.com

Page 446: Microsoft SQL Server 2008 Español - Mike Hotek

438 Parte VII Business Intelligence

12. Configure el nombre del conjunto de datos como CustomerOrders y haga clic en Aceptar.

13. Haga una vista previa del informe y pruebe su selección de parámetros.

www.detodoprogramacion.com

Page 447: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 439

Implementar informes

Aunque el Diseñador de informes proporciona una forma cómoda de trabajar y obtener una vista previa del informe, no instalaría BIDS en el escritorio de un usuario final para que pueda ver los informes.. Una vez que tiene el informe diseñado de la manera que usted lo quería, está listo para implementar (deploy) sus informes.

Puede implementar sus informes de dos formas básicas:

 

 

Directamente a través de BIDS

Cargado por un administrador

Cuando usted creó el proyecto de informe, una de las opciones especificadas es la dirección URL del servidor de reporte. En base a la dirección URL del servidor de informes, puede implementar un informe directamente desde BIDS mediante la selección “Implementar” ya sea desde el menú “Build” o haciendo clic derecho en el informe.

Dado que es poco probable que usted tenga permisos para implementar un informe directamente a un ambiente de producción, BIDS también le permite construir un proyecto que proporciona un manifiesto a un administrador para implementar el informe en producción. Sin embargo, como señalamos en el capítulo 24, "SQL Server Integration Services," lo único que se obtiene es un archivo de manifiesto que va junto con el archivo XML que contiene la definición de lo que se desea implementar. Por lo tanto, es mucho más común simplemente copiar el archivo RDL, junto con los archivos de origen de datos asociado (.rds) a una ubicación para que un administrador acceda a él.

Un administrador puede desplegar su informe usando la opción “Cargar archivo” del sitio Web de informes.

En el siguiente ejercicio, implementará su informe en el sitio Web de informes y luego navegará las carpetas, informes y los orígenes de datos (data source) creados. Este ejercicio asume que usted está usando un servidor de desarrollo de informes y tiene acceso directo a implementar un informe dentro de BIDS.

Implementar un informe

1. En el Explorador de soluciones, haga clic-derecho en la solución SQL2008SBS y seleccione Propiedades. Cambie la TargetServerURL a la dirección de URL del servidor de informes y haga clic en Aceptar.

www.detodoprogramacion.com

Page 448: Microsoft SQL Server 2008 Español - Mike Hotek

440 Parte VII Business Intelligence

2. Haga clic-derecho sobre el informe en el Explorador de soluciones y seleccione “Implementar” (Deploy).

3. Abra Internet Explorer y vaya a su sitio Web de informes.

4. Explore el origen de datos, la carpeta SQL2008SBS, y el informe que ha subido.

www.detodoprogramacion.com

Page 449: Microsoft SQL Server 2008 Español - Mike Hotek

El capítulo 25 - SQL Server Reporting Services 441

Suscripciones

Muchas organizaciones tienen un conjunto de informes que deben ser ejecutados en un horario, en lugar de permitir el acceso ad hoc al usuario. SSRS proporciona la capacidad de ejecutar automáticamente y entregar informes a través de la utilización de “suscripciones”.

Las suscripciones pueden crearse sobre una base ad hoc para cada usuario. Cuando un usuario crea una suscripción, puede especificar el formato de entrega, la configuración para la ubicación de entrega, el formato de representación (rendering) para el informe, una programación de ejecución (schelude), y otros parámetros de informe.

Precaución Cada suscripción de informes creará un trabajo (job) en el Agente SQL Server basado en la configuración de programación especificada por el usuario. Cada suscripción es independiente una de otra, así que si usted tiene 500 usuarios que solicitan el mismo informe con los mismos parámetros, el informe será representado (rendered) 500 veces separadas. Dado que SSRS no puede reconocer y consolidar las solicitudes duplicadas en una sola ejecución, la capacidad de los usuarios para crear una suscripción normalmente se desactiva dentro de una organización.

También puede crear una suscripción basada en datos. Estas son definidas por un administrador mediante una consulta para recuperar datos de una tabla que especifica todas las configuraciones necesarias. Una suscripción basada en datos permite a los administradores controlar la carga en un servidor de informe y eliminar la duplicación de las ejecuciones de informes.

Dado que una suscripción SSRS ejecuta un informe como un proceso en segundo plano, su informe no puede depender de que las credenciales se suministren en tiempo de ejecución por un usuario. Usted tendrá que especificar una cuenta de ejecución en el Administrador de configuración de SSRS que se utilizará para acceder al Origen de datos del reporte. Usted también tendrá que editar las fuentes de datos para almacenar de forma segura las credenciales en el servidor de informes. A menos que las credenciales se almacenen de forma segura en el servidor de informes, no podrá crear una suscripción al informe, porque SSRS no tendrá credenciales válidas para ejecutar el reporte en nombre de un usuario.

En el siguiente ejercicio, creará una suscripción a su informe de ventas que ejecutará el informe, lo pasará a un PDF, y entregará el informe en la bandeja de entrada a las 8 am todos los lunes.

Crear una suscripción a un informe

1. Inicie el Administrador de configuración de Reporting Services.

2. Conéctese a su servidor de informes y seleccione Cuenta de ejecución.

3. Seleccione “Especificar una cuenta de ejecución” que se utilizará para acceder a las fuentes de datos del informe, haga clic en Aplicar y haga clic en Salir.

4. Inicie Internet Explorer y vaya a su sitio Web de los informes.

5. Haga clic en el vínculo Orígenes de datos.

6. Haga clic en la fuente de datos SQL2008SBS.

www.detodoprogramacion.com

Page 450: Microsoft SQL Server 2008 Español - Mike Hotek

442 Parte VII Business Intelligence

7. Seleccione las credenciales almacenadas de forma segura en el servidor de informes, especifique su cuenta de Windows, seleccione la opción “Utilizar como credenciales de Windows”. . . haga clic en la casilla de verificación y haga clic en Aplicar.

www.detodoprogramacion.com

Page 451: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 443

8. Haga clic en el enlace Inicio en la parte superior de la página.

9. Haga clic en la carpeta SQL2008SBS.

10. Haga clic en el vínculo de Informe SQL2008SBS.

11. Haga clic en la ficha Suscripciones y haga clic en Nueva suscripción.

12. Especifique las configuraciones del correo electrónico, la programación y los parámetros de informe a utilizar, y haga clic en Aceptar.

Informes vinculados

Muchas organizaciones necesitan proporcionar múltiples vistas del mismo informe, por ejemplo, un informe de ventas en el que cada director de división sólo puede ver las ventas de su división. Aunque puede agregar parámetros a un informe para que restrinjan los datos, a menos que haya diseñado una capacidad de seguridad a nivel de fila dentro de la fuente de datos, un gerente de división podría especificar cualquier parámetro que sea válido. Con el fin de evitar que los gerentes de división vean cualquiera de los datos de ventas, necesita restringir el contenido de un informe a sólo la división del gerente. Con lo que hemos aprendido hasta ahora, se verá tentado a o bien generar un informe duplicado para cada división que tenga una cláusula Where diferente o bien a incrustar una expresión complicada en el informe que controle los datos que se muestran. Si ha generado un informe duplicado, cada vez que el diseño del informe cambie, tendría que actualizar varias copias del mismo informe. Si incrusta una expresión para controlar la visibilidad de los datos, cada vez que haya un cambio en la organización, usted tendría que editar el informe.

www.detodoprogramacion.com

Page 452: Microsoft SQL Server 2008 Español - Mike Hotek

444 Parte VII Business Intelligence

Debido a que cada informe cargado en el sitio Web de informes tiene seguridad que define los usuarios que pueden acceder al mismo, puede resolver este dilema muy fácilmente a través de la función de informes vinculados.

Un informe vinculado permite generar un nuevo informe basado en un informe existente. Una informe vinculado tiene el mismo formato y el diseño que el informe de base. Si se cambia la definición del informe base, todos los informes relacionados incluirán automáticamente los cambios. Se pueden especificar opciones separadas de ejecución para un informe vinculado, tales como los parámetros predeterminados. Si especifica parámetros por defecto para el informe vinculado y a continuación deshabilita la capacidad de que un usuario especifique sus propios parámetros, puede generar rápidamente una serie de informes derivados que restringen el contenido, mientras que incurre en un gasto reducido de sobrecarga de gestión.

Caché de reporte e instantáneas

Los informes pueden representar una “pesada carga” sobre sus fuentes de datos, así como sobre el servidor de informes. Con el fin de mitigar la carga de consultas debido a los informes, los administradores pueden aplicar opciones para almacenar datos en caché así como un informe completo. Los dos métodos que SSRS tiene para administrar el almacenamiento en caché son las siguientes:

 

 

Caché de informe

Instantáneas de informe

El almacenamiento en caché de informes utiliza los mismos principios que cualquier motor de almacenamiento en caché Web, con la excepción que la memoria caché sólo se aplica a los datos. Al configurar un informe para que se represente a partir de una memoria caché, SSRS almacenará en caché el conjunto de datos para el informe. Cada ejecución posterior de dicho informe no consulta el origen de datos para los datos, sino que va a recuperar el conjunto de datos en caché en la base de datos ReportServerTempDB. SSRS entonces aplica la definición del informe, representa (render) el informe, y lo devuelve al usuario.

Puede establecer que una caché expire en base a un intervalo de tiempo especificado. Cada vez que se ejecuta un informe con “cache habilitada”, se comprobará la caché de informes. Si existe un conjunto valido de datos almacenados en caché, estos se recuperan de la memoria caché. Si el conjunto de datos ha expirado, SSRS se conecta a la fuente de datos, ejecuta la consulta, almacena el conjunto de datos en cache, y luego hace el informe. Las ejecuciones posteriores entonces utilizan el conjunto de datos guardados hasta que el intervalo de caducidad se haya superado y se genere una nueva caché.

Una instantánea de informe funciona de manera similar a un conjunto de datos almacenado en caché. La diferencia principal es que una instantánea de informe es un informe totalmente representado (rendering). Mientras que un usuario puede cambiar el formato de representación de un informe en caché, el formato de presentación será fijo para una instantánea de informe y no se puede cambiar por el usuario. Además, puede mantener varias instantáneas de informe en el servidor de informes. El informe se mostrará siempre a partir de la instantánea de informe más reciente, pero se puede acceder a cualquier otra instantánea a través de la pestaña Historial.

www.detodoprogramacion.com

Page 453: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 445

Nota No puede comparar dos instantáneas de reporte. Las instantáneas de informe no se suelen usar para razones de análisis históricos. Si es necesario realizar un análisis histórico, debe ser implementado un almacén de datos (data warehouse) y aprovechar las capacidades de Analysis Services que se trata en el Capítulo 26, "SQL Server Analysis Services. "

Precaución Ambas, las caches de informes y las “instantáneas de informe” son sensibles a los parámetros utilizados. Cada combinación única de parámetros va a generar un conjunto de datos almacenado en caché o una instantánea de informe. Por lo tanto, es necesario tener mucho cuidado con los informes que tienen muchos parámetros diferentes que se utilizan en un momento dado, ya que puede generar rápidamente docenas de conjuntos de datos almacenados en caché o instantáneas de un único informe. Además, las copias en caché consumen espacio en la base de datos ReportServerTempDB la cual tiene que ser dimensionada y gestionada adecuadamente.

En el siguiente ejercicio, va a crear un “informe vinculado” para septiembre de 2008, que será representado a partir de una instantánea de informe. También se pondrá en marcha el almacenamiento en caché para los usuarios que deseen ejecutar el informe correspondiente para períodos anteriores.

Configurar el almacenamiento de informes en caché y las instantáneas

1. Haga clic en el informe SQL2008SBS y seleccione la ficha Propiedades.

2. Haga clic en Crear informe vinculado (Linked Report).

3. Déle al nuevo informe un nombre y haga clic en Aceptar.

www.detodoprogramacion.com

Page 454: Microsoft SQL Server 2008 Español - Mike Hotek

446 Parte VII Business Intelligence

4. Haga clic en la ficha Propiedades y seleccione el vínculo Parámetros.

5. Especifique valores predeterminados para el AñoPedido (OrderYear) y MesPedido (OrderMonth), desactive el user prompt, y haga clic en Aplicar.

6. Vea el informe.

7. Haga clic en la ficha Propiedades y seleccione el link Ejecución.

8. Seleccione “Representar este informe desde una instantánea de ejecución de informes” y seleccione las casillas de verificación: “Programación de Reporte Específico” y “Crear una instantánea de informe…”.

9. Haga clic en Configurar y establezca la programación para todos los días a las 2 am y haga clic en Aceptar.

10. Revise la configuración de representación (rendering) de instantánea y haga clic en Aplicar.

11. Seleccione el enlace Historial en el menú de navegación de la izquierda.

12. Seleccione las casillas de verificación “Permitir historial de informe… Manualmente y almacenar todos los reportes…”Instantáneas en historial” junto con "Limitar las copias del historial del informe". Ajuste el límite a 10 copias, haga clic en Aplicar y en Aceptar en el cuadro de diálogo pop-up.

13. Haga clic en la ficha Historial en la parte superior de la página.

14. Si usted no tiene las instantáneas listadas, haga clic varias veces en “Nuevas instantáneas” para generar una instantánea de informe nueva.

www.detodoprogramacion.com

Page 455: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 25 - SQL Server Reporting Services 447

www.detodoprogramacion.com

Page 456: Microsoft SQL Server 2008 Español - Mike Hotek

448 Parte VII Business Intelligence

15. Haga clic en el enlace de una de las instantáneas y verifique que aparece una segunda ventana del navegador que muestra el informe relacionado con la instantánea seleccionada.

16. Vuelva a la carpeta de informes SQL2008SBS y verifique que ahora tiene dos informes y los informes de órdenes de Septiembre de 2008 tienen una fecha de ejecución asociada a él.

www.detodoprogramacion.com

Page 457: Microsoft SQL Server 2008 Español - Mike Hotek

El capítulo 25 - SQL Server Reporting Services 449

17. Haga clic en el enlace del informe SQL2008SBS.

18. Haga clic en la ficha Propiedades y luego en el enlace de Ejecución.

19. Especifique las opciones de almacenamiento en caché para el informe, para almacenar en caché una copia temporal que caduca cada día a las 02 a.m. y haga clic en Aplicar y, a continuación, vea el informe.

Capítulo 25 Referencia rápida

Para

Configurar SSRS

Haga lo siguiente

Inicie el Administrador de configuración de SSRS. La configuración mínima debe

especificar las siguientes cosas:

 

 

 

Servicios Web y Dirección URL del Administrador y directorios virtuales

Cuenta de servicio

Base de datos

Si desea utilizar suscripciones e instantáneas de informe, es necesario especificar una cuenta de ejecución. Si desea que los usuarios puedan especificar un e-mail de entrega de una suscripción, tendrá que especificar las configuraciones de correo.

Validar una configuración

Inicial de SSRS

Inicie Internet Explorer y vaya a http://machinename:8080/Reports. para verificar que se vea el sitio Web SSRS.

www.detodoprogramacion.com

Page 458: Microsoft SQL Server 2008 Español - Mike Hotek

450 Parte VII Business Intelligence

Para

Crear un informe con

un asistente

Haga lo siguiente

 

 

 

 

 

 

Inicie el Asistente para informes en BIDS

Especifique la configuración de orígenes de datos

Introduzca una consulta o un procedimiento almacenado para ejecutar

Defina un tipo de informe, el diseño (layout) y el estilo inicial

Introduzca la dirección URL del servidor de informes y la carpeta de destino

Realice una vista previa del informe

Agregar grupos a un informe

Darle Formato a los elementos del informe

Dar Formato de moneda, numérico y datos de fecha

Aplicar formato

condicional

Añadir múltiples conjuntos de datos a un informe existente

Haga clic-derecho en las filas de grupo y agregue un nuevo grupo padre o hijo.

Seleccione el elemento del informe y especifique las opciones de formato en el panel de propiedades, tales como el tipo de letra, tamaño de la fuente, el espesor de la fuente, el color del texto y el color de fondo. Los colores pueden ser especificados usando cualquiera de los dos valores RGB o HTML.

Puede utilizar los estilos de formato. NET o crear formatos personalizados mediante

abreviaturas de elementos tales como #, yyyy, y dd.

Cree una expresión que especifique la configuración de formato basada en una

evaluación condicional como “if”.

En el panel Datos del informe, agregue un nuevo conjunto de datos con su propia consulta basada en la fuente de origen de información (data source). Los conjuntos de datos pueden ser unidos entre sí a través de parámetros de informe y pueden ser usados como elemento de origen para tablas, matrices, gráficos y subinformes. Los conjuntos de datos también se pueden utilizar para proporcionar valores a las listas delplegables usadas como parámetro del reporte.

Haga clic derecho en el elemento de informe, seleccione Propiedades de Tablix y especifique el conjunto de datos necesarios en el conjunto de datos desplegables.

Agregue una cláusula WHERE para una consulta y añada cada uno de los parámetros requeridos. En las propiedades de un parámetro, puede especificar el nombre, tipo de datos, el valor por defecto y si el parámetro es de entrada de datos simple o si los valores se seleccionan de una lista definida de manera estática o una lista generada a partir de una consulta.

Configure las opciones de visibilidad. Puede especificar si un elemento se oculta

inicialmente o si se muestra, así como el elemento de informe que se utiliza para alternar la pantalla.

Después de implementar el origen de datos al servidor de informes, se puede especificar cuales credenciales se almacenan de forma segura en el servidor de informes, en las propiedades de la fuente de datos.

Habilite una instantánea de informe y establezca las propiedades de ejecución de informes para representar (render) el informe desde una instantánea.

La pestaña Historial de cada informe se utiliza para administrar las instantáneas que han sido creadas para un informe. También puede configurar el número máximo de instantáneas para retener en el menú de Historial de un informe.

El almacenamiento del Reporte en cache se gestiona a través de la página de ejecución de informes. Usted puede activar la caché, así como el control de la caducidad de la misma.

Configurar un conjunto de datos como el origen para

un elemento de informe

Crear parámetros de informe

Habilitar un “profundizar” (drill-down) interactivo dentro de un informe

Almacenar credenciales en el servidor de informes

Representar (render) un informe desde una instantánea

Gestión de múltiples instantáneas

Administrar almacenamiento del informe en caché

www.detodoprogramacion.com

Page 459: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26

SQL Server Analysis Services

Después de completar este capítulo, usted será capaz de

 

 

 

 

 

 

 

 

 

Construir almacenes de datos básicos

Comprender el modelo dimensional

Construir un cubo

Construir dimensiones y medidas

Construir jerarquías

Examinar e implementar cubos

Seleccionar algoritmos apropiados de minería de datos

Construir modelos y estructuras de minería

Examinar un modelo de minería

Se han escrito libros enteros sobre SQL Server Analysis Services (SSAS) y todavía rasguñan sólo la superficie de la materia. En este capítulo se tendrá una visión muy básica de las dos principales características en el motor de Analysis Services: el procesamiento analítico en línea (OLAP) y la minería de datos. Usted aprenderá cómo tomar la base de datos SQL2008SBS y convertirla en una estructura que le permita aprovechar el motor de Analysis Services. Usted también aprenderá cómo construir cubos y modelos básicos de minería de datos.

Nota En este capítulo se ofrece una descripción muy básica y no busca un análisis exhaustivo de los principios de diseño de data warehouse. La estructura de la base de datos SQL2008SBSDW está para el único propósito de mostrar las características del motor de Analysis Services. Para una discusión exhaustiva del diseño de datawarehouse, hay decenas de libros dedicados al tema que no se podrían condensar en un solo capítulo en este libro.

Más información Para una discusión detallada de SSAS, consulte SQL Server 2008 Analysis Services Paso a Paso.

Data Warehousing Visión general Aunque Analysis Services se puede utilizar directamente contra una base de datos transaccional, las estructuras normalizadas no son propicias para las actividades analíticas. Con el fin de aprovechar el poder de Analysis Services, va a transformar los datos extraídos de una fuente transaccional

451

www.detodoprogramacion.com

Page 460: Microsoft SQL Server 2008 Español - Mike Hotek

452 Parte VII Business Intelligence

en un formato analítico dentro de un almacén de datos. El principal obstáculo que muchos encuentran con el Analysis Services no está en la construcción de los cubos, sino en encontrar la manera de construir el almacén de datos que sustenta los cubos y las estructuras de minería de datos.

El truco para la construcción de un almacén de datos está en la comprensión de la perspectiva del usuario final respecto a los datos.

En la base de datos SQL2008SBS con la que ha estado trabajando en todo este libro, el propósito de la base de datos era permitir ubicar las órdenes realizadas por un cliente. Si estudia el diagrama de datos de la base de datos SQL2008SBS, verá que todas las tablas de la base de datos giran en torno a la tabla Customers.Customer. Tiene que ir a través de la tabla de clientes para ubicar un pedido. Tiene que ir a través de la tabla de clientes para recuperar información sobre una orden. La entidad central de la base de datos entera es un cliente.

Aunque los clientes son importantes, cuando se quiere analizar la información en la base de datos SQL2008SBS, no se están analizando los clientes. En su lugar, está analizando los pedidos. Cuando los datos transaccionales en la base de datos SQL2008SBS son transformados, la entidad central dentro de la base de datos es una orden. La información del cliente se convierte en un elemento más de información descriptiva.

En el siguiente ejercicio, se restaura una base de datos precompilada llamada SQL2008SBSDW que va a utilizar para el resto de este capítulo.

Configurar la base de datos SQL2008SBSDW

1. Restaure la base de datos utilizando la copia de seguridad SQL2008SBSDW del archivo Chapter26 \SQL2008SBSDW.bak en las muestras que acompañan el libro.

2. Compruebe que la base de datos está en línea y accesible.

3. Revise el contenido de la base de datos SQL2008SBSDW que se generó a partir de la base de datos OLTP SQL2008SBS.

Procesamiento analítico en línea (Online Analytic Processing - OLAP)

El campo de la Inteligencia de Negocios (BI) proporciona procesos, prácticas de diseño y tecnología diseñada para ayudarle a comprender mejor las operaciones de su negocio. El propósito principal de BI es resolver el problema "ver el bosque de los árboles". Al atascarse en el aumento de volúmenes de datos detallados, se hace muy difícil tomar decisiones que tengan un impacto en una organización. Así como la microgestión de su personal, no producirá los resultados deseados, por lo que las decisiones de negocio basadas en volúmenes masivos de datos detallados no le permitirán alcanzar sus objetivos de negocio.

Así como usted necesita dar un paso atrás desde el borde de los árboles para comprender el alcance total del bosque, es necesario reducir el detalle sin perder la información general con el fin de convertir los datos en información procesable.

www.detodoprogramacion.com

Page 461: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 453

Usted resuelve el problema de las cantidades masivas de detalle mediante la aplicación de técnicas de agregación. En lugar de mirar a los millones de filas individuales de información de órdenes, usted puede “resumir” el detalle de la orden en base a varios factores. Dentro de los datos contenidos en la base de datos SQL2008SBS, se pueden producir los siguientes puntos de vista para ayudar a manejar su negocio:

 

 

 

 

 

 

¿Cuántos pedidos por día recibimos?

¿El volumen de pedidos aumenta o disminuye?

¿Están nuestras ventas aumentando o disminuyendo?

¿Cuántos productos vendemos cada mes?

¿Qué productos se venden cada mes?

Si una persona compra el Producto X, ¿qué otros productos está dispuesto a comprar?

Probablemente se podría llegar a cientos de diferentes preguntas para pedir datos. Sin embargo, tratando de responder a estas preguntas a través de la paginación a través de miles o millones de líneas de ítems de pedidos esto se convertirá rápidamente en información abrumadora. Se dará cuenta de que todas las preguntas de negocio que usted se realiza pueden ser resueltas mediante la recuperación y la agregación (acumulación) de un pequeño subconjunto de los datos.

Desafortunadamente, usted no podría escribir todas las consultas SELECT. . . GROUP BY que los usuarios quisieran dentro de los plazos que se necesitan los resultados. OLAP está diseñado para reducir la diferencia entre tener que escribir manualmente miles o millones de consultas de agregado, con el fin de entregar información de negocio para sus usuarios finales. Independientemente de cualquiera de los conceptos que se tratan en este capítulo, todo lo que el motor OLAP realmente hace, es generar todas las permutaciones posibles de los agregados de los datos para que el análisis no tenga que esperar a que se calcule cada agregado.

Modelo Dimensional

Con el fin de obtener información válida de los datos, así como procesar eficientemente grandes cantidades de datos, el motor OLAP se basa en un modelo dimensional subyacente. El modelo dimensional se compone de varias estructuras básicas:

 

 

 

 

Dimensiones

Atributos

Medidas

Jerarquías

Una dimensión es muy similar a una entidad en el modelo relacional. Las dimensiones definen las estructuras básicas de negocio que desea analizar, tales como clientes, productos y tiempo. La atributos dentro de una dimensión definen las columnas dentro de una dimensión que se utilizan para el análisis, como NombreCliente, NombreProducto, Ciudad, CódigoPostal, y FechaOrden.

www.detodoprogramacion.com

Page 462: Microsoft SQL Server 2008 Español - Mike Hotek

454 Parte VII Business Intelligence

Las jerarquías permiten definir una estructura de navegación dentro de una dimensión como por ejemplo:

 

 

 

Los clientes dentro de las ciudades dentro de los Estados dentro de los países

Los Meses del calendario en trimestres dentro de los años calendario

El Mes fiscal en trimestres fiscales dentro de los años fiscales.

Las medidas son el conjunto de agregados que se desea calcular, tales como la suma de la cantidad de órdenes o de los números de órdenes.

La fuente de todas las estructuras OLAP es una tabla dentro de un origen de datos. OLAP tiene dos términos para referirse a tablas de origen: tablas de hecho y tablas de dimensión. Las Tablas de dimensiones almacenan los datos utilizados para definir dimensiones, atributos y jerarquías de dimensiones. La Tabla de hechos se utiliza para definir las medidas.

Aunque pocas personas tienen problemas para definir las tablas de dimensiones, la estructura de las tablas de hechos por lo general trae más dificultades. Un hecho es un solo ejemplo de algo que se desea analizar, como la ocurrencia de un defecto en una línea de fabricación, un elemento de línea en una orden, un paquete enviado, una enfermedad dentro de un registro de salud, o la solicitud de un préstamo. La tabla de hechos es la entidad central dentro de la estructura de base de datos subyacente en el modelo dimensional y contiene una columna para vincular cada fila de hecho a cada dimensión que proporciona información descriptiva adicional.

En la base de datos SQL2008SBS, la tabla de cliente es la entidad central y usted podría necesitar unirse a múltiples tablas para recuperar la información que necesita. Cuando la base de datos SQL2008SBS se convierte en la base de datos SQL2008SBSDW, se toma cada elemento de línea de la orden (ítem de la orden) y se añaden en las claves de la orden, el cliente, la ubicación, el producto, la categoría, la subcategoría, etc. A continuación, puede agregar elementos de línea para cualquiera de las entidades de negocio sin necesidad de unirse a cualquier tabla. Cualquier “join” a una tabla sería para poder recuperar el texto asociado a una clave de entidad particular.

Cubos

Al igual que una base de datos proporciona el contenido estructural, así como los límites de seguridad en las bases de datos relacional, una cubo contiene todos los objetos de análisis que se definen así como la definición del más alto nivel de seguridad que se pueden asignar. En Analysis Services, una base de datos abarca toda la instancia de SSAS. Dentro de una base de datos SSAS, puede crear varios cubos para sus usuarios. A diferencia de un cubo geométrico, un cubo SSAS puede tener un número virtualmente ilimitado de dimensiones y la dimensión de cada uno puede ser de una longitud variable.

En el siguiente ejercicio, usted construirá su primer cubo sobre la base de datos SQL2008SBSDW.

Construir su primer cubo

1. Inicie BIDS.

2. Seleccione Archivo | Nuevo | Proyecto, seleccione el proyecto de Analysis Services, especifique un nombre y una ubicación y haga clic en Aceptar.

www.detodoprogramacion.com

Page 463: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 455

3. Haga clic-derecho en la carpeta Orígenes de datos en el Explorador de soluciones y seleccione Nueva fuente de datos (New Data Source).

4. Haga clic en Siguiente para aceptar la opción predeterminada “Crear un origen de datos. . . para la base de datos SQL2008SBSDW”.

5. En la página Información de suplantación, seleccione “Usar cuenta de servicio”. Complete los pasos restantes del asistente.

www.detodoprogramacion.com

Page 464: Microsoft SQL Server 2008 Español - Mike Hotek

456 Parte VII Business Intelligence

6. Haga clic-derecho en la carpeta “Vistas del origen de datos” en el Explorador de soluciones, seleccione “Nueva Vista de datos de origen” (New Data Source View - DSV) y haga clic en Siguiente.

7. Seleccione la fuente de datos que acaba de crear y haga clic en Siguiente.

8. Añada todas las tablas a la lista de Objetos incluidos, haga clic en Siguiente y en Finalizar.

9. Revise el contenido del DSV (Data Source View).

10. Haga clic derecho en la carpeta Cubos, seleccione Nuevo cubo y haga clic en Siguiente.

www.detodoprogramacion.com

Page 465: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 457

11. Seleccione Usar tablas existentes y haga clic en Siguiente.

12. Seleccione la tabla Pedidos para las tablas de grupos de medida y haga clic en Siguiente.

13. Desactive la columna OrderKey y haga clic en Siguiente.

14. Acepte el valor predeterminado en la página Seleccionar nuevas dimensiones y haga clic en Siguiente.

www.detodoprogramacion.com

Page 466: Microsoft SQL Server 2008 Español - Mike Hotek

458 Parte VII Business Intelligence

15. Haga clic en Finalizar.

16. Agregue la cuenta de servicio de SSAS a la instancia de SQL Server si no tiene todavía sesión de acceso.

17. Agregue la cuenta de servicio de SSAS como un usuario en la base de datos SQL2008SBSDW y concédale a la cuenta el permisos SELECT en la base de datos.

www.detodoprogramacion.com

Page 467: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 459

18. Haga clic-derecho en el cubo que acaba de crear en el Explorador de soluciones y seleccione Procesar.

www.detodoprogramacion.com

Page 468: Microsoft SQL Server 2008 Español - Mike Hotek

460 Parte VII Business Intelligence

19. Haga clic en Sí para crear e implementar el proyecto.

www.detodoprogramacion.com

Page 469: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 461

20. Haga clic en Ejecutar para procesar el cubo.

21. Haga clic en Cerrar.

22. Haga clic en la ficha Explorador.

www.detodoprogramacion.com

Page 470: Microsoft SQL Server 2008 Español - Mike Hotek

462 Parte VII Business Intelligence

23. Gaste un poco de tiempo navegando por el contenido del cubo. En los ejercicios siguientes, se ocupará de todos los elementos de formato para hacer al cubo más fácil de usar.

Dimensiones, medidas y cálculos

Las dimensiones proporcionan los elementos básicos de análisis dentro de un cubo. Estas contendrán uno o más atributos, que definen las columnas de datos que se utilizan en el análisis. Cada atributo tiene un conjunto de propiedades que se pueden configurar, las más comunes son:

 

 

 

 

 

 

 

La columna clave

Nombre

Tipo de datos y, opcionalmente, tamaño de los datos

Intercalación o juego de caracteres (Collation)

Cadena de formato para la visualización

Nombre de columna

Criterio de ordenación

La columna clave identifica el atributo dentro de la estructura del cubo y el nombre se utiliza para hacer referencia al atributo en los elementos que diseñó dentro del cubo. El atributo será conectado a una tabla de origen y la columna con un tipo de datos y, opcionalmente, un tamaño de datos.

www.detodoprogramacion.com

Page 471: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 463

Usted puede especificar una secuencia de intercalación (collation), una cadena de formato y opciones de ordenamiento que van a controlar cómo se muestra la dimensión dentro de cualquier herramienta que examine el cubo. La propiedad Nombre de la columna permite definir una columna desde el origen de datos que está asignado al atributo, para proporcionar la información que se muestra cuando se explora el cubo, por ejemplo convertir un valor numérico CustomerID en el nombre real del cliente.

El nivel más granular (detallado) dentro de una dimensión es un miembro. Las dimensiones definen la entidad de negocio que está siendo analizada. Los Atributos definen las columnas disponibles para el análisis dentro de una dimensión. Los miembros son los valores reales de los datos dentro de un determinado atributo. Mientras se selecciona un atributo dentro de una dimensión para el análisis, un usuario final va a considerar los miembros reales dentro de un atributo, como Estados Unidos, ProductX o CustomerY.

Las Medidas definen los cálculos disponibles para el cubo y están vinculadas a una columna dentro de la vista de datos de origen del cubo. Usted define la función de agregado, tales como SUM, MIN, MAX, o COUNT. Las medidas también permiten especificar una cadena de formato que se utiliza para controlar los datos a mostrar al examinar el cubo.

No todos los agregados que usted quiere en un cubo pueden ser definidos sobre una columna de su fuente de datos. Puede agregar cálculos personalizados a un cubo la que realiza cualquier tipo de agregación que usted quiera, por ejemplo multiplicando la cantidad y el precio unitario para producir un total de ventas por productos individuales.

En el siguiente ejercicio, modificará las dimensiones y las medidas creadas por el asistente de cubo para proporcionar una interfaz de navegación amigable para el usuario. También agregará un cálculo al cubo que proporcionará un total de línea de ítem de la orden para permitir que las ventas se agreguen por producto individual.

Nota El diseñador trabaja con la definición de los elementos del cubo. Cada navegador se conectará a Analysis Services y usará la estructura y los datos que están almacenados. Para ver los cambios que haya realizado en el diseño, es necesario implementar los cambios en SSAS y procesar. En el futuro, las capturas de pantalla y los pasos para la implementación y procesamiento se omiten, como un requisito entendido antes de iniciar cualquier navegador dentro de BIDS.

Diseño de dimensiones, medidas y cálculos

1. En el Explorador de soluciones, haga doble clic en la dimensión Customer.

2. Seleccione la clave de cliente y desplácese (scroll) a la propiedad NameColumn en la ventana propiedades.

3. Haga clic en el botón de puntos suspensivos en la columna derecha, coloque la columna Origen para CustomerName, y haga clic en Aceptar.

4. Expanda la propiedad NameColumn y revise la configuración actualizada.

5. Establezca la propiedad OrderBy para el campo Nombre.

www.detodoprogramacion.com

Page 472: Microsoft SQL Server 2008 Español - Mike Hotek

464 Parte VII Business Intelligence

6. Haga clic en la página del navegador para revisar los nuevos cambios en la dimensión Cliente Customer.

7. Cierre el diseñador de la dimensión Cliente.

8. Establezca la propiedad NameColumn de la clave de categoría en la dimensión Categoría de producto a Categoría (Category). Establezca la propiedad OrderBy para Nombre (Name).

www.detodoprogramacion.com

Page 473: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 465

9. Establezca la propiedad “Nombre de columna” (NameColumn) de la clave del producto en la dimensión Product con el nombre ProductName. Establezca la propiedad OrderBy para Nombre.

10. Establezca la propiedad NameColumn de la clave de Sub categoría en la dimensión Product para

SubcategoryName de la tabla ProductSubCategory. Establezca la propiedad OrderBy para Nombre.

11. Establezca la propiedad NameColumn de la clave Fecha en la dimensión Fechas a FullDate. Establezca la propiedad Format debajo de la propiedad NameColumn a “m/d/ aaaa”. Establezca la

propiedad OrderBy para Nombre (name).

12. Establezca la propiedad NameColumn de la clave de Sub categoría en la dimensión “Sub Categoría de Productos” a SubcategoryName. Establezca la propiedad OrderBy para Nombre.

13. Establezca la propiedad NameColumn de la clave en la dimensión Sub Categoría de producto a Categoría desde la tabla ProductCategory. Establezca la propiedad OrderBy para Nombre.

14. Seleccione la ficha “Estructura de cubo”. Establezca la propiedad FormatString para cada una de las medidas dentro de su cubo.

15. Haga clic en la ficha “Cálculos” y haga clic en el botón Nuevo miembro calculado.

16. Cree un cálculo que multiplica la cantidad y el precio unitario para producir la cantidad de una línea-ítem y agregarla al grupo de medida “Pedidos”.

www.detodoprogramacion.com

Page 474: Microsoft SQL Server 2008 Español - Mike Hotek

466 Parte VII Business Intelligence

17. Examine el cubo.

www.detodoprogramacion.com

Page 475: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 467

Jerarquías

Aunque no son estrictamente necesarias para un cubo, las jerarquías permiten a los usuarios navegar por los datos de una manera más intuitiva transitando organizaciones comunes de datos dentro de su negocio. Por ejemplo, en lugar de que un usuario tenga que extraer por separado el país, estado/provincia, ciudad y nombre del cliente en el explorador de cubos, puede proporcionar una jerarquía Customer Geography con la que un usuario podría simplemente arrastrar y navegar.

En el siguiente ejercicio, definirá las jerarquías de navegación para la geografía, las fechas y los productos.

Jerarquías de diseño

1. Haga doble clic en la dimensión Geografía en el Explorador de soluciones.

2. Añada las columnas Ciudad (city), Provincia (StateProvince) y NombrePais (countryName) como atributos de la dimensión Geografía.

3. Arrastre los atributos nombre del país, provincia, y ciudad al panel de Jerarquías para crear una jerarquía de geografía.

www.detodoprogramacion.com

Page 476: Microsoft SQL Server 2008 Español - Mike Hotek

468 Parte VII Business Intelligence

4. Haga doble clic en la dimensión Cliente (Customer). Haga clic derecho en la tabla de clientes en el panel de la vista de datos de origen (Data source view - DSV) y seleccione Mostrar tablas relacionadas.

5. Añada la ciudad, nombre del país, y la provincia de la tabla Geography a los atributos de dimensión. Añada el nombre del cliente desde la tabla Clientes a los atributos de dimensión.

6. Arrastre el nombre del país, provincia, Ciudad y Nombre del cliente al panel de Jerarquías para crear la jerarquía CustomerGeography.

7. Haga doble clic en la dimensión Producto (Product). Agregue las tablas relacionadas para el producto y luego las tablas ProductSubCategory.

8. Agregue el NombreProducto (ProductName), NombreSubCategoria (SubCategoryName) y Categoría a los atributos de dimensión.

9. Cree una jerarquía de productos para Categoría, Clave SubCategoría (Sub Category Key) y nombre del producto (Product Name).

10. Haga doble clic en la dimension Fechas y añada las Columnas CalendarYear, CalendarSemester, CalendarQuarter, EnglishDayNameOfWeek, EnglishMonthName yWeekNumberOfYear a los atributos de dimensión.

11. Cree una jerarquia: Calendar Year, Calendar Semester, Calendar Quarter, English Month Name, and English Day Name Of Week.

12. Cree una jerarquía: Calendar Year, Week Number Of Year, and English Day Name Of Week.

13. Navegue su cubo para revisar las nuevas jerarquías que ha creado.

www.detodoprogramacion.com

Page 477: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 469

www.detodoprogramacion.com

Page 478: Microsoft SQL Server 2008 Español - Mike Hotek

470 Parte VII Business Intelligence

KPI, particiones, perspectivas y traducciones

Aunque un cubo básico puede satisfacer las necesidades del negocio, mientras que sólo utiliza dimensiones, medidas, y jerarquías, SSAS proporciona un conjunto adicional de funciones que amplían la capacidad y el apoyo regional de los cubos.

Los indicadores clave de rendimiento (KPI)

Todas las organizaciones tienen una serie de objetivos que conducen las operaciones, tales como:

 

 

 

Incrementar las ventas en un 10 por ciento respecto al mismo periodo del año anterior

Aumentar la base de clientes en un 20 por ciento

Incrementar la cantidad media de pedidos en un 15 por ciento

Los KPIs traen las definiciones de sus objetivos de negocio en un cubo con el fin de proporcionar indicadores de progreso contra un objetivo.

Los KPIs se definen como una serie de cálculos que se utilizan para propósitos de comparación. Usando Expresiones multidimensionales, MDX, usted define el cálculo que será realizado con los datos del cubo, el objetivo contra el que comparar, una expresión para indicar su estado hacia la meta, y una tendencia que muestra qué tan bien están progresando hacia esa meta.

www.detodoprogramacion.com

Page 479: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 471

Particiones

Los cubos pueden (y con frecuencia se crean), con los datos de origen que contienen decenas de millones o

miles de millones de filas. Además, se agregan periódicamente a la fuente nuevos conjuntos de datos. Con el fin de que nuevos conjuntos de datos en su fuente sean agregados a un cubo, es necesario procesar los datos. Mientras que se produce el procesamiento, el cubo no está disponible para los usuarios finales.

Con el fin de agilizar la tramitación, así como mejorar el rendimiento del procesamiento de un cubo, se pueden definir particiones dentro del mismo. Similar a la función de partición de las tablas, una partición en un cubo permite especificar los criterios que se utilizan para dividir una tabla de hechos en varias partes, para procesar. Sin embargo, una partición de cubo no afecta al almacenamiento subyacente de la tabla de hechos, sin embargo define el equivalente de una cláusula WHERE para ser usada por SSAS durante una ejecución de proceso.

Una vez definidas, SSAS puede procesar cada partición en paralelo y luego combinar los resultados juntos. También puede orientar el proceso hacia una única partición con el fin de minimizar los datos que necesitan ser procesados.

Además de las capacidades de procesamiento, empleando particiones, usted puede aprovechar los recursos

de varias máquinas para procesar un cubo. Una partición se define contra una tabla de hechos en un DSV. Dado que se pueden definir y utilizar múltiples DSV dentro de un cubo, se puede dividir una tabla de hechos grande a través de varios servidores y aun combinar los datos juntos en un solo cubo con particiones.

Perspectivas

Las Perspectivas le permiten a los administradores proporcionar varias vistas de un cubo. Aunque un cubo puede contener un gran número de dimensiones y grupos de medida que abarquen múltiples áreas de su compañía, no todos los usuarios tendrán que acceder a todas las dimensiones de un grupo de medida con el fin de analizar su área de negocio correspondiente. Cuando se define una perspectiva, se pueden elegir los grupos de medida, las medidas, las dimensiones, los atributos, las jerarquías, los cálculos y los KPI.

Un usuario entonces, selecciona una perspectiva específica con el fin de restringir los elementos disponibles para el análisis. Sin embargo, las perspectivas no están diseñadas como una estructura de seguridad ya que si se sabe cómo escribir una expresión MDX, siempre se podrá acceder a cualquier porción de un cubo con independencia de su perspectiva actualmente vigente. Por lo tanto las perspectivas sólo se deben utilizar para reducir la complejidad expuesta a un usuario que está navegando por el cubo.

Traducciones

Las Traducciones proporcionan un aspecto multi-lingual a sus datos. SSAS no es un motor de traducción, sin embargo, si usted proporciona traducciones, SSAS puede permitir a los usuarios seleccionar desde una lista y examinar los cubos en su idioma preferido.

Las traducciones ocurren en dos niveles diferentes: “estructura de un cubo y datos de origen”. Si desea mostrar los elementos estructurales de su cubo en un idioma determinado, debe insertar la

www.detodoprogramacion.com

Page 480: Microsoft SQL Server 2008 Español - Mike Hotek

472 Parte VII Business Intelligence

traducción para el nombre de un objeto, como una dimensión, una jerarquía o un atributo en la definición del cubo. Si desea visualizar las traducciones por miembros dentro de una dimensión, tendrá que presentar la traducción dentro de los datos de origen y luego asignar las columnas traducidas al atributo correspondiente en el cubo.

Minería de datos (Data Mining)

Analysis Services invoca imágenes de cubos de navegación. Los cubos son sólo una característica dentro del motor de SSAS. SSAS también incluye un motor de minería de datos muy potente.

La minería de datos permite analizar grandes volúmenes de datos para descubrir patrones ocultos. Aunque se puede utilizar la minería de datos para analizar los registros climáticos históricos con el fin de determinar que el sol siempre sale por la mañana y siempre se cae en la noche, no derivaría mucho conocimiento del negocio desde el análisis. Sin embargo, sin la minería de datos, le resultaría mucho más difícil determinar la ubicación en el estante de los 8.000 productos o más, en un supermercado típico basado en el análisis de los patrones de compra de los clientes.

Toda persona interactúa con los algoritmos de minería de datos durante su vida, sin siquiera darse cuenta. Si alguna vez ha entrado en un gran supermercado, usted está interactuando con la minería de datos a partir del momento de llegar a la playa de estacionamiento. Al entrar por la puerta, se encuentran las frutas y hortalizas frescas a su derecha, siempre y cuando la tienda está en los Estados Unidos. Si usted estuviera en Europa, lo más probable sería encontrar las frutas y verduras frescas a su izquierda, porque los estadounidenses generalmente giran a la derecha cuando entran en una tienda mientras que los europeos en general, a la izquierda. Usted puede haber pensado que era muy considerado, así como una gran idea que el gerente de la tienda coloque un alimento salado, tales como papas fritas o galletitas saladas en cada extremo del pasillo donde está la cerveza. La colocación de cada elemento dentro de un gran supermercado no es un accidente o un hecho de consideración. La colocación de cada elemento dentro de un supermercado importante se destina a maximizar la cantidad de dinero que usted gaste, presentándoseles con "impulso" alrededor de los artículos que realmente necesita. Cada uno de los elementos "impulso" derivan de la aplicación de técnicas de minería de datos aplicada a los millones de carritos de la compra que se procesan cada día. Los productos de aperitivo salado con el margen más alto están en el extremo del pasillo de cerveza, porque hay una probabilidad mucho más alta de que una persona que compra la cerveza también se compre un alimento salado, que una persona que compra una botella de vino.

El objetivo de la minería de datos dentro de una empresa es impulsar una decisión de negocios que tenga una mayor probabilidad de ocurrencia. Si el negocio A siempre tomaba decisiones sobre la base del azar (un porcentaje de probabilidad del 50 por ciento), cualquier decisión hecha tendría una probabilidad del 50 por ciento de un favorable resultado. Si el negocio B, un competidor del negocio A, fueron capaces de tomar decisiones basadas en una opción mejor que el azar - más del 50 por ciento de probabilidad decisiones tomadas por el negocio B tendrían una mayor posibilidad de éxito. Si una empresa aplica de forma coherente las decisiones sobre la base de una mayor posibilidad de éxito, está en una posición mucho mejor para superar y vencer a sus competidores.

www.detodoprogramacion.com

Page 481: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 473

Algoritmos

En el centro de la minería de datos hay un conjunto de algoritmos que SSAS aplica a sus datos. Un algoritmo de minería dato es una ecuación matemática que cuando se aplica a sus datos le puede decir la probabilidad del resultado deseado.

Nota El profesor de matemáticas que todos teníamos decía "todo en el mundo es descrito por las matemáticas" esto era correcto aunque todos pensábamos que el maestro estaba loco.

Categorías de algoritmo

Los algoritmos de minería de datos se pueden dividir en seis categorías básicas:

 

 

 

 

 

 

Clasificación

Asociación

Regresión

Pronostico (forecasting)

Análisis de Secuencia

Análisis de desviaciones

Los algoritmos de Clasificación se utilizan para predecir un resultado basado en un conjunto de atributos de entrada. A los atributos se les da una ponderación igual y se envían a través de múltiples iteraciones contra los datos a fin de encontrar agrupaciones naturales.

Un algoritmo de asociación se utiliza para predecir una correlación donde el orden de los elementos considerados no es importante. El resultado de un algoritmo de asociación es la probabilidad de que un resultado particular se produzca basándose en las condiciones actuales. Por ejemplo, si un cliente ya colocó una caja de cerveza en su carro de compras, un algoritmo de asociación puede decirle la probabilidad de que ese cliente también comprará una bolsa gigante de papas fritas.

Los algoritmos de Regresión se utilizan para predecir el rendimiento futuro en base a resultados anteriores. La clave para un algoritmo de regresión es que el atributo de predicción es continuo.

Los atributos se pueden clasificar como:

 

 

 

 

 

Discreto conjunto de valores específicos que no están relacionados y no se superponen

Continuo el dato se construye de una serie que es una secuencia incremental

Ordenado los datos de entrada se clasifican

Cíclico los datos tienen patrones de repetición

Discretizada datos continuos que se han dividido en un conjunto discreto de rangos

www.detodoprogramacion.com

Page 482: Microsoft SQL Server 2008 Español - Mike Hotek

474 Parte VII Business Intelligence

Usted también puede tener un atributo que se discretiza. Los atributos discretizados contienen una serie continua de datos que se han dividido en segmentos para el análisis, como romper un atributo de ingresos o edad en un conjunto de rangos de valores que no se solapan. Por ejemplo, se podría romper una columna de ingresos en tres bloques que son etiquetados como bajo, medio y alto, para fines estadísticos.

Los algoritmos de Pronóstico tratan de predecir el rendimiento futuro en base a los resultados anteriores al igual que un algoritmo de regresión. Sin embargo, un algoritmo de pronóstico requiere una serie de tiempo como entrada e intenta predecir un valor futuro basado no sólo en los resultados pasados, sino también como factor de la evolución cíclica de los datos, tales como la compra de ropa en el tiempo.

Los algoritmos de Secuencia predicen la probabilidad de que un evento futuro suceda basado en los eventos que se han producido en el pasado. Con el análisis de la secuencia, el orden de los acontecimientos del pasado es tan importante como el acontecimiento actual que se ha producido en la predicción de la probabilidad de un evento futuro.

El análisis de Desviación se utiliza para encontrar los datos que divergen desde un estado normal. Una de las aplicaciones de un algoritmo de desviación es identificar personas sospechosas en un aeropuerto en base a su comportamiento significativamente diferentes de lo normal.

Algoritmos de minería de datos SSAS

SQL Server viene con siete algoritmos de minería de datos que abarcan todas las categorías de la minería, excepto el análisis de desviación. Los algoritmos de minería de datos que están disponibles para usted son:

 

 

Naïve Bayes

Árboles de decisión de Microsoft

Regresión lineal de Microsoft

Árboles de regresión Microsoft

 

 

 

 

 

Microsoft Clustering

Clústeres de secuencia

Reglas de asociación

Redes Neuronales

Series de tiempo

Modelos y estructuras de minería

El proceso de extracción se inicia con la definición de la estructura de minería. El modelo de explotación minera se basa en un origen de datos que puede ser una base de datos relacional o un cubo OLAP. Una vez definido, el modelo de minería es procesado. El procesamiento de un modelo de minería que se conoce como "entrenamiento" del modelo, no es más que SSAS mediante una instrucción OPENQUERY para recuperar datos del origen de datos definido y corriendo todos los datos a través del algoritmo de minería de datos seleccionado.

www.detodoprogramacion.com

Page 483: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 475

Nota Dado que cada algoritmo realiza los cálculos utilizando diferentes algoritmos matemáticos y que se pueden aplicar a múltiples problemas, es muy común que incluya más de un algoritmo de minería en una estructura de minería. Cada algoritmo de minería de datos especificado por una estructura de minería se conoce como un modelo de minería.

Cada fila recuperada desde la fuente de datos para el procesamiento se conoce como “un caso”. Las columnas/atributos que se procesan son variables en el algoritmo. Una vez que el “entrenamiento” se haya completado, su estructura de minería está lista para su análisis y contendrá la definición de cada modelo de minería, así como los datos que han sido “entrenados” para la estructura.

En el siguiente ejercicio, creará un modelo de minería para determinar qué productos son más probables que coexisten en un carrito de compras.

Construir un modelo de minería y estructura de minería

1. Haga doble clic en el DSV SQL2008SBSDW para abrir el editor de DSV.

2. Haga clic en Agregar/Quitar objetos, añada las vistas v_CustomerOrders y v_OrderProducts

al DSV y haga clic en Aceptar.

3. Haga clic-derecho en OrderKey en v_OrderProducts y seleccione Nueva relación. Vincule (join) la

columna OrderKey entre v_OrderProducts y v_CustomerOrders, haga clic en Aceptar y haga clic en

Si para crear una clave principal lógica.

www.detodoprogramacion.com

Page 484: Microsoft SQL Server 2008 Español - Mike Hotek

476 Parte VII Business Intelligence

4. Seleccione OrderKey y ProductName en v_OrderProducts, haga clic derecho y seleccione “Configurar Clave Primaria Lógica” (Set Logical Primary Key), guarde y cierre el DSV.

5. Haga clic-derecho en Estructuras de minería en el Explorador de soluciones, seleccione Nueva estructura de minería, y haga clic en Siguiente.

6. Seleccione “Desde la base de datos relacional existente. . .” (From Existing Relational Database) y haga clic en Siguiente.

www.detodoprogramacion.com

Page 485: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 477

7. Seleccione “Reglas de asociación de Microsoft” de la lista desplegable y haga clic en Siguiente.

8. Seleccione la vista de origen de datos SQl2008SBSDW que ya definió en el proyecto y haga clic en Siguiente.

www.detodoprogramacion.com

Page 486: Microsoft SQL Server 2008 Español - Mike Hotek

478 Parte VII Business Intelligence

9. Seleccione v_CustomerOrders como “la tabla de casos” y v_OrderProducts como la tabla anidada y haga clic en Siguiente.

10. Seleccione la columna OrderKey como columna clave para v_CustomerOrders y laProductName como clave, entrada, y columna de predicción para la tabla anidada y haga clic en Siguiente.

www.detodoprogramacion.com

Page 487: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 479

11. Deje los tipos de contenido y de datos con el valor predeterminado que figuran y haga clic en Siguiente.

12. Establezca en 30% el porcentaje de datos para pruebas y haga clic en Siguiente.

www.detodoprogramacion.com

Page 488: Microsoft SQL Server 2008 Español - Mike Hotek

480 Parte VII Business Intelligence

13. Déle un nombre al modelo de minería y a la estructura como “Product Association” y haga clic en Finalizar.

14. Haga clic en la ficha Modelos de minería y revise la configuración del modelo ProductAssociation.

15. Implemente el proyecto en SSAS y procese la estructura de minería.

16. Seleccione la vista de modelo de minería para revisar las reglas que se han encontrado en los datos.

www.detodoprogramacion.com

Page 489: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 481

www.detodoprogramacion.com

Page 490: Microsoft SQL Server 2008 Español - Mike Hotek

482 Parte VII Business Intelligence

17. Seleccione la ficha “Conjuntos de elementos” (Itemsets) para recuperar los conjuntos que se encontraron dentro de los datos.

18. Seleccione la ficha “Red de dependencias” (Dependency Network) para revisar las relaciones entre los diversos productos.

19. Seleccione el visor de contenido genérico (Generic viewer) y revise los resultados.

www.detodoprogramacion.com

Page 491: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 483

Minería de Datos Desmitificada

La Minería de datos siempre ha sido esfera de "gente en batas blancas de laboratorio con 18 doctorados en matemáticas aplicada" y generalmente se considera inaccesible para gente "normal ". La minería de datos no es una forma de arte místico, ni un proceso mágico. La minería de datos es sencillamente la aplicación de las matemáticas, por lo general en el campo de la estadística, a los conjuntos de datos. Dentro de los últimos años, algunos fabricantes como Microsoft, han producido conjuntos de herramientas que permiten a un "simple mortal" definir y aprovechar la minería de datos sin necesidad de entender las matemáticas.

Si usted gasta un poco de tiempo en trabajar a través de algunas de las matemáticas, encontrará que la minería de datos no es muy diferente a muchas otras operaciones que se realizan en SQL Server. Para ayudar a desmitificar la minería de datos, el siguiente entorno utiliza el algoritmo Naïve Bayes a lo largo de cálculos brutos para demostrar cómo se obtienen los resultados dentro de un modelo de minería. Entonces podría crear un conjunto de datos que coincida con el escenario, pasarlo por el algoritmo Naïve Bayes, y ver los mismos resultados dentro de SSAS.

El algoritmo Naïve Bayes es:

P (H | E) = P (E | H) * P (H) P (E)

P (H) define la probabilidad de una hipótesis. P (E) define la probabilidad de la evidencia. P (E | H) define la probabilidad de las hipótesis con respecto a las evidencias reunidas.

www.detodoprogramacion.com

Page 492: Microsoft SQL Server 2008 Español - Mike Hotek

484 Parte VII Business Intelligence

Una encuesta de 1277 personas fueron tomadas para determinar las preferencias de compra. Cada persona fue encuestada con una serie de preguntas para determinar qué factores influyeron en su decisión de compra

de un vehículo particular. Dentro del grupo había 652 hombres y mujeres 625. Su tarea es determinar si un comprador es hombre o mujer en base a las respuestas a las preguntas de la encuesta.

Si tuviera que adivinar al azar que el comprador es un hombre, usted tendría la posibilidad del 51,1 por ciento de ser correcta y el 48,9 por ciento de posibilidades de ser incorrectos, un empate estadístico. Mediante la aplicación Naïve Bayes a las respuestas de la encuesta, usted debería ser capaz de hacer una mejor estimación y aumentar sus posibilidades de ser correcta.

La Tabla 26-1 muestra los cinco factores considerados, así como el número en que cada grupo dijo “sí” o “no” durante cinco factores específicos.

TABLA 26-1 Factores que influyen en la compra de vehículos

Apelación a Marca

M F

482

85

126

518

Respuesta

No

Tipo de carrocería

M

238

397

Garantía

M

631

20

Puntuación de consumidores

M

492

53

Precio

M

141

492

F

522

58

F

479

143

F

603

6

F

463

161

En base a los resultados de la encuesta, se pueden calcular las probabilidades de cada respuesta para cada

factor. La tabla 26-2 muestra las probabilidades de cada respuesta de la encuesta.

TABLA 26-2 Probabilidad de cada respuesta de la encuesta

Tipo de carrocería

M

37,5%

62,5%

Respuesta Atractivo de Marca

M

No

19,6%

80,4%

Garantía

M

3,1%

Puntuación de consumidores

M

91,8%

8,2%

Precio

M

22,3%

77,7%

F

85,0%

15,0%

F

10,0%

F

77,0%

23,0%

F

99,0%

1,0%

F

74,2%

25,8%

90,0% 96,9%

Si te dijeran que un encuestado dijo que el tipo de carrocería del vehículo no era importante y la marca, la garantía, la calificación de los consumidores, y el precio era importante, ahora podría hacer una predicción mucho mejor de si el encuestado es hombre o mujer.

Para calcular la probabilidad de que el encuestado sea hombre, se multiplican las probabilidades de respuesta

para cada factor: 19,6% * 62,5% * 96,9% * 91,8% * 22,3%. Para calcular la probabilidad de que sea una mujer, se multiplica la probabilidad de respuesta correspondientes a cada factor: 85,0% * 10,0% * 77,0% * 99,0% * 74,2%. En este punto, la probabilidad de que el encuestado sea masculino es 0,01238 y la probabilidad de que sea mujer es 0,02354.

Para terminar el cálculo, se toma la probabilidad masculina y se divide por la suma de las probabilidades. Lo mismo sucede con la probabilidad femenino. El resultado final le dice que en base a las respuestas de la encuesta, existe una probabilidad de 65,54 por ciento que el comprador sea mujer, mientras que sólo un 34,46 por ciento de probabilidad que el comprador sea un hombre.

www.detodoprogramacion.com

Page 493: Microsoft SQL Server 2008 Español - Mike Hotek

Capítulo 26 - SQL Server Analysis Services 485

Capítulo 26 Referencia Rápida

Para

Definir una vista de origen de datos DSV

Haga lo siguiente

 

 

 

Crear un origen de datos.

Crear una vista de origen de datos basado en un origen de datos.

Seleccione las tablas/vistas que quiere en su DSV.

Modificar las propiedades de una dimensión

Cambiar el valor mostrado para un miembro dentro de una dimensión

Cambiar el método de agregación

para una medida

Ajustar el formato de visualización

Añadir un atributo a una dimensión

Añadir una jerarquía a una dimensión

Seleccione la dimensión y cambie las propiedades asociadas en el panel Propiedades.

Especifique un NameColumn para un atributo.

Seleccione la medida y cambie la propiedad AggregationFunction.

Configure la propiedad FormatString.

 

 

 

 

Haga doble clic en la dimensión en el Explorador de soluciones.

Arrastre una columna desde el panel de DSV a la lista de atributos.

Arrastre atributos en el panel Jerarquías.

Organice los atributos en el orden que desea navegar por la jerarquía.

Definir el orden de un atributo

Añadir un cálculo personalizado a un cubo

Crear una estructura de minería de datos

Seleccione el atributo y especifique la propiedad OrderBy.

Seleccione la ficha Cálculos en el diseñador de cubos, agregue un nuevo cálculo y especifique la expresión MDX a usar.

 

 

 

 

 

 

Haga clic-derecho en “Estructuras de minería” en el Explorador de soluciones y seleccione Nueva estructura de minería.

Seleccione la técnica de minera.

Especifique el DSV a usar.

Configure la tabla(s) y/o la vista (s) a usar para el caso y, opcionalmente, tablas anidadas.

Seleccione la clave, entrada, y columna de predicción (s).

Configure el tipo de contenido.

Entrenar a un modelo de minería Procese la estructura de minería para leer en los datos de origen y calcular contra el algoritmo de minería seleccionado.

www.detodoprogramacion.com

Page 494: Microsoft SQL Server 2008 Español - Mike Hotek

A

Índice

Símbolos y Números

. Ldf, 53

. Mdf, 53, 57

. Ndf, 53

. NET Framework 2.0, 17

. NET Framework 3.5, 22

ALTER VIEW, 208 Analysis Services. See SQL Server Analysis Server (SSAS) Analysis Services Execute DDL Task, 380 ANSI character set, 70 ANSI_Nulls, 183 API (SQL Trace Application Programming Interface), 44 applications client redirect, 354 line of business, 9–10 architecture data storage, 56 processor, 69 Service Broker, 226–28 archive tables, 108 arrays, 129 articles, 364 AS clause, 104 AS PARTITON clause, 105 AS SNAPSHOT OF, 219 ascending sort, 126 assemblies, 279–80 association algorithm, 473 Association Rules, 474 Asymmetric Key, login, 264–68 asymmetric keys, 265, 281–82, 285–86 asynchronous message queuing architecture, 226–28 contracts, 232–33 conversations, 235–36 message types, 229–32 overview, 225–26 prioritization, 245 queues, 233–34, 242–44 sending/receiving messages, 236–42 services, 234–35 attach, database moving, 59–60 attribute-centric XML format, 151 attributes, OLAP, 453–54 attributes, regression algorithms, 473–74 auditing data capture, 173–75 sys.database_audit, 334 tracking changes, 171–73 authentication modes, 19, 259 AUTO, 151 availability database mirroring, 348 caching, 353–54 client redirect, 354 Database Snapshots, 349, 354 endpoints, 350–51 initializing, 355–56

accent sensitivity, 19 accounts, service, 17–19, 35–38 ACTIVATION, 242 ActiveX scripts, 319–20, 381 Ad Hoc Distributed Queries, 260 administrative procedures, 196 administrative users, 269–73 AdventureWorks2008, 28 AdventureWorksDW2008, 28 AFTER, 213 after image, 167 aggregate functions, 199, 279–80 Aggregate transform, 383 aggregating data, 123, 138–39 derived tables, 139–40 fi ltering aggregates, 143–44 multiple permutations, 140–42 OLAP (Online Analytic Processing), 453–54 pivot tables, calculating, 145 ranking data, 146–47 result sets, 147–49 running aggregates, 144–45 alerts, 6. See also SQL Server Agent creating, 329–32 Database Mail, 42–43 jobs, 321–25 monitor server, 357 algorithms data mining, 472 categories, 473–74 hash algorithms, 282–84 aliases, 123 ALL, 105, 263 ALTER, 76–77, 208, 275 ALTER DATABASE, 59, 216 ALTER FUNCTION, 208 ALTER INDEX, 99–100 ALTER INDEX. . .REBUILD, 309–10 ALTER PARTITION SCHEME, 105 ALTER PROCEDURE, 208 ALTER TABLE, 216 ALTER TRIGGER, 208

487

www.detodoprogramacion.com

Page 495: Microsoft SQL Server 2008 Español - Mike Hotek

488 AVG

operating modes, 351–53 page corruption, 354 roles, 349–50 failover clustering, 345–48 log shipping, 356 components, 356–57 initialization, 357–63 overview, 7 replication, 363 agents, 365–66 components, 364 confi guring, 367–73 methods, 366–67 roles, 365 AVG, 183, 383

Bulk Insert task, 382 Bulk Logged recovery model, 309–11 bulkadmin, 266 Business Intelligence (BI), 9–14 Business Intelligence Development Studio (BIDS), 46 overview, 378–80 tasks, 380–82 transforms, 382–85

C

CA (certifi cate authority), 285–86 Cache transform, 383 caches, 353–54, 444–49 calculations data retrieval, 122 functions, 199–205 key performance indicators (KPIs), 470 measures, OLAP, 454 OLAP, 462–66 pivot tables, 145 processors and, 69 variables and, 187 CALLED ON NULL INPUT, 201–2 CALLER, 202 CASE function, 125–26 case sensitivity, 19 CAST, 123–26 catalogs, full-text, 223 CATCH, 192–93 CDOC (Cross Database Ownership Chaining), 260 certifi cate authority (CA), 285–86 Certifi cate, login, 264–68 certifi cates, 265, 281–82, 285–86 change tables, 171–73 change tracking, 171–75, 333 CHANGE_TRACKING, 250 char, 70 char(n), 70 CHAR/VARCHAR, 249 CHAR/VARCHAR/XML, 249 character data, 19, 69–71, 129, 384 Character Map, 384 charts, formatting, 423–28 CHECK, 204–11 check constraints, 82 CHECK_EXPIRATION, 265 CHECK_POLICY, 265 CHECKSUM, 304, 309 classifi cation algorithms, 473 client connections, 37 client redirection, 354 CLOSE, 194–96 CLOSE MASTER KEY, 282 CLR (Common Language Runtime), 196, 260, 279–80, 333 CLR Enabled, 260 clustered indexes, 91–93

B

background processing, reports, 441 backup job, 358 BACKUP MASTER KEY, 282 backups, 301 database mirroring, 355–56 database restores, 311–16 Database Snapshot, 220 db_backupoperator, 269 differential backups, 307–8, 314–15 fi legroups, 308 full backups, 302–5, 311–12 log shipping, 358–59 maintenance plans, 325–28 page corruption, 308–9 partial, 107 recovery models, 309–11 transaction log backups, 305–7, 315–16 balanced trees (B-trees), 88–89 BCP (Bulk Copy Program), 34, 309–10, 366 before image, 167 BEGIN statements, 190–91 BEGIN TRAN, 167–68 BEGIN. . .END statements, 190–91 BI (business intelligence), 9–14 BIDS (Business Intelligence Development Studio), 46 overview, 378–80 tasks, 380–82 transforms, 382–85 bigint, 68 binary data, 72 bit, 72 BLOBs (Binary Large Objects), 74 blocking, tables, 112 bookmarks, reports, 431 Books Online, 31–33 boundary points, 103–5, 128 BREAK, 191 B-trees (balanced trees), 88–89 Bulk Copy Program (BCP), 34, 309–10, 366 BULK INSERT, 309–10, 382

www.detodoprogramacion.com

Page 496: Microsoft SQL Server 2008 Español - Mike Hotek

creating clustering key, 91–93 clustering, failover, 7, 345–48 clustering, SSRS, 416 COALESCE, 124 Code Access Security, 279–80 CodePlex web site, 28 COLLATE, 75 collation, 75 collation sequences, 19 column fi lter, 364 columns, table clustered indexes, 91–93 computed, 77–78 data retrieval, 122–23, 126 included columns, indexes, 95–96 properties, 75 sparse, 78–79 views, 181–82 command line utilities OSQL, 34 SQLCMD, 34 commenting code, 186 COMMIT, 167 COMMIT TRAN, 167–68 Common Language Runtime (CLR), 196, 260, 279–80, 333 common table expressions (CTEs), 149–50 communications protocols endpoints, 260–63 Service Broker architecture, 226–28 contracts, 232–33 conversations, 235–36 message types, 229–32 overview, 225–26 prioritization, 245 queues, 233–34, 242–44 sending/receiving messages, 236–42 services, 234–35 SQL Server Confi guration Manager, 37 compound criteria, fi ltering data, 127–30 compression, backups, 304 computations Aggregate transforms, 383 data retrieval, 125 views, 181 COMPUTE, 179, 183 COMPUTE BY, 179, 183 concatenated data, 124 conditional expressions, 125 Conditional Split, 384 conditions, 290–93 confi guration fi le, SSIS packages, 406–9 confi guration functions, 199 Confi guration Manager, 35–38 confi guring. See also Confi guration Manager Database Mail, 42–43 SQL Server Management Studio (SSMS), 39–40

CONNECT, 261–62 connection strings, 386–90 connections, server endpoints, 260–63 query execution stats, 339–40 SSIS, 386–90 consistency checks, 325–28 constants, 122 constraints check, 82 clustered indexes, 92 default, 82–83 DML triggers, 213 foreign keys, 83–84 primary keys, 79–81 unique, 81 XML indexes, 101 CONTAINS, 251–55 CONTAINSTABLE, 251–55 CONTINUE, 191 CONTINUE_PAST_ERROR, 304 CONTROL, 275 control fl ow, 390–94 control fl ow constructs, 189–92 control fl ow options, 320 Control Flow, SSIS tab, 380 CONVERT, 123–26 COOKIE INTO, 202 cookies, 202 copy job, 358 Copy Objects Wizard, 22 copying BCP (Bulk Copy Program), 34, 309–10, 366 Object Explorer, 95 Copy-On-Write, 220–21 correlated sub-queries, 133 COUNT, 125 covering indexes, 95–96 CREATE, 76–77 CREATE BROKER PRIORITY, 245 CREATE DATABASE, 52, 57–58, 216, 219–20 CREATE ENDPOINT, 262 CREATE INDEX, 309–10 CREATE PARTITION SCHEME, 105 CREATE TABLE, 159 CREATE USER, 268–69 creating alerts, 329–32 clustered indexes, 92–93 cubes, 454–62 database diagrams, 85–86 databases, 51–58 functions, 200–3 indexes, 93–94, 96, 98–99, 101, 107–8 jobs, 319–25 maintenance plans, 325–28 reports, SSRS, 418–38 schemas, 64–66, 72–74

489

www.detodoprogramacion.com

Page 497: Microsoft SQL Server 2008 Español - Mike Hotek

490 Cross Database Ownership Chaining (CDOC)

service accounts, 17–19 stored procedures, 185 tables, 76–77, 80–82 XML indexes, 101 Cross Database Ownership Chaining (CDOC), 260 CROSS JOIN, 131–33, 181 CROSS/OUTER APPLY, 183, 204–11 cryptographic functions, 199 CSS (Microsoft Customer Service and Support), 34–35 CTEs (common table expressions), 149–50 CUBE operator, 141–42 cubes, OLAP (Online Analytic Processing), 13–14, 454–62 dimensions, measures, calculations, 462–66 hierarchies, 467–70 partitions, 471 perspectives, 471 translations, 471–72 cursors, 194–96, 199 cut, Object Explorer, 95

models and structures, 474–83 overview, 472 Data Mining Engine, 14 Data Mining Extensions (DMX), 38 Data Mining Query, 380 data recovery backups, 301 database restores, 311–16 differential backups, 307–8, 314–15 fi legroup backups, 308 full backups, 302–5, 311–12 page corruption, 308–9 recovery models, 309–11 transaction log backups, 305–7, 315–16 data retrieval aggregating data, 138–39 derived tables, 139–40 fi ltering aggregates, 143–44 multiple permutations, 140–42 pivot tables, calculating, 145 ranking data, 146–47 result sets, 147–49 running aggregates, 144–45 common table expressions (CTEs), 149–50 fi ltering data, 127–30 functions, 204–11 multiple tables, 131–33 overview, 121 SELECT statement, 126, 137–38 sorting results, 126 unique results, 134–35 views creating, 179–80 indexed views, 182–84 modifying data, 181–82 XML data querying, 150–51 Data Transformation Services (DTS), 10 data types changing, 123–26 security, 279–80 Visual Studio to SQL Server mapping, 384 data warehousing, 451–52 data, unstructured. See full-text indexing DATA_BASE_MIRRORING, 350–51 Database Diagrams, 85–86 Database Engine availability, 7 creating account, 17–19 installing, 22–29 overview, 3 programming interface, 5–6 replication, 6–7 security subsystem, 4–5 Service Broker, 6 SQL Server Agent, 6 Storage Engine, 4 Database Engine Tuning Advisor (DTA), 44–45 database level principals, 268–69 Database Mail, 42–43, 260

D

DAC (Dedicated Admin Connection), 260 data availability, 7 BLOBs (Binary Large Objects), 74 Bulk Copy Program (BCP), 34 character, 69–71 data fl ow, SSIS, 394–403 date and time, 124 loss exposure, 358 numeric, 67–69 SPATIAL, 74–75 storage, 56, 72–75 Tablediff, 34 types of, 67 data cache, 353 Data Collectors, Performance Studio, 45–46 Data Conversion transform, 384 Data Defi nition Language (DDL), 76–77, 269, 380 data encryption. See encryption data fi legroups, 56 data fi les, 53–57 Data Flow, SSIS, 380, 382–85 data manipulation deleting data, 161–64 functions, 123 inserting data, 153–59 MERGE, 164–66 OUTPUT, 166–67 tracking changes, 171–75 transaction handling, 167–71 updating data, 159–61 Data Manipulation Language (DML), 76–77, 236–37, 290–93 data mining, 380 algorithms, 473–74 demystifi ed, 483–84

www.detodoprogramacion.com

Page 498: Microsoft SQL Server 2008 Español - Mike Hotek

disabling, index

database master key, 281–82 database mirroring, 263, 348 caching, 353–54 client redirect, 354 Database Snapshots, 354 endpoints, 350–51 initializing, 355–56 operating modes, 351–53 overview, 7 page corruption, 354 roles, 349–50 TCP endpoints, 262 Database Snapshots, 221–22 Copy-On-Write, 220–21 database mirroring, 349, 354 overview, 219–20 reverting data, 222–23 DATABASE_MIRRORING, 261 databases creating, 57–58 designing, 64–67 diagrams, 85–86 fi le structure, 53–57 maintenance plans, 325–28 moving, 59–60 attach, 60 overview, 51–53 sample, installing, 28–29 vs. spreadsheets, 67 data-driven subscriptions, 441 DATEADD, 208 dates, 71–72, 124, 199, 424 datetime, 71–72 datetime2, 71–72 datetimeoffset, 71–72 db_accessadmin, 269 db_backupoperator, 269 db_datareader, 269 db_datawriter, 269 db_ddladmin, 269 db_denydatareader, 269 db_denydatawriter, 269 db_owner, 269–73 db_securityadmin, 269 dbcreator, 266 dbo.syspolicy_managment_facets table, 290 DCM (Differential Change Map), 307–8 DDL (Data Defi nition Language), 76–77, 269, 380 DDL triggers, 216, 218, 295 deadlocking, tables, 112 DEALLOCATE, 194–96 debugging IF statements, 191 WHILE statements, 191 decimals, 67–69 DECLARE, 186, 194–96 decryption, 284. See also encryption Dedicated Admin Connection (DAC), 260

DEFAULT, 154, 204–11 default constraints, 82–83 DEFAULT fi legroup, 56–58 defense in depth, 259 defragmenting, indexes, 99–100 DELETE db_datawriter, 269 db_denydatawriter, 269 deleting data, 161–63 DML triggers, 213 locks, 168 MERGE, 164–66 OUTPUT, 167 performance degradation, 93–94 permissions, 275 transaction handling, 167–68 deleted tables, 166–67 deleting data, 161–64 DENSE_RANK, 146 dependent objects, 202 deploying packages, SSIS, 409–10 deploying reports, SSRS, 439–40 Derived Column transform, 384 derived tables, 139–40 descending sort, 126 designing databases, 85–86 designing tables, 63–64 binary data, 72 columns, 75, 77–79 constraints, 79–84 creating tables, 76–77 data types, 67–71 database design, 64–67 database diagrams, 85–86 date and time data, 71–72 FILESTREAM, 74 hierarchyID data, 75 naming objects, 64 schemas, 64–66 SPATIAL data, 74–75 XML data, 72–74 detach, database moving, 59–60 deviation analysis, 474 diagnostics object size, 336 SQLDiag, 34–35 sys.dm_os, 334 DIALOG, 236 dialog handles, 236 differential backups, 307–8, 314–15 Differential Change Map (DCM), 307–8 Digital Rights Management (DRM), 201 digital signatures, 285–86 dimension tables, 454 dimensions, OLAP, 453–54, 462–66 directories, permissions, 347 DISABLED, 261–62 disabling, index, 100

491

www.detodoprogramacion.com

Page 499: Microsoft SQL Server 2008 Español - Mike Hotek

492 disaster recovery

disaster recovery. See also database mirroring backups, 301 database restores, 311–16 differential backups, 307–8, 314–15 fi legroup backups, 308 full backups, 302–5, 311–12 page corruption, 308–9 recovery models, 309–11 transaction log backups, 305–7, 315–16 discretized attributes, 474 disk confi guration, 346 disk drives, failover clustering, 345–48 disk space, installation requirements, 17 diskadmin, 266 DISTINCT, 134–35, 138, 181, 183 Distrib.exe, 366 Distribution Agent, 366–67 distribution statistics, 97 distributor, 365 DML (Data Manipulation Language), 76–77, 236–37, 290–93 DMVs (dynamic management views) indexes, 337–39 object size, 336 overview, 333–34 query execution stats, 339–40 retrieving object metadata, 334–35 DMX (Data Mining Extensions), 38 documentation, 31–33 documents, XML, 72–73 drag and drop, Object Explorer, 95 DRM (digital rights management), 201 DROP, 76–77 DROP TRIGGER, 216 DROP/CREATE, 208 DTA (Database Engine Tuning Advisor), 44–45 DTS (Data Transformation Services), 10 dynamic execution, 193–94 dynamic management views (DMVs) indexes, 337–39 object size, 336 overview, 333–34 query execution stats, 339–40 retrieving object metadata, 334–35 dynamic row fi lter, 364 dynamic scalability, 242

conversations, 235–36 message types, 229–32 overview, 225–26 prioritization, 245 queues, 233–34, 242–44 sending/receiving messages, 236–42 services, 234–35 EMPTY, validation option, 229 encryption asymmetric keys, 285–86 certifi cates, 285–86 Extensible Key Management (EKM), 287 hash algorithms, 282–84 key management, 260 master keys, 281–82 overview, 280–81 SQL Server Confi guration Manager, 37 SSRS, 415 symmetric keys, 284 TCP endpoints, 263 Transparent Data Encryption (TDE), 286–87 ENCRYPTION, 201, 236 Encryption Keys, 415 END statements, 190–91 endpoints, 260–63, 350–51 equality, 127–28 equality joins, 133 errors, 192–93, 329–32 evaluation order, 125 event groups, 216 Event Handlers, SSIS, 380 event logs, SQLDiag, 34–35 EVENTDATA(), 216 events alerts, creating, 329–32 confi guration, 334 notifi cation policies, 295 SQL Server Profi ler, 44 WMI, BIDS tasks, 382 Excel documents, 249 EXCEPT, 148–49, 181, 183 exception handling, SSIS, 403–6 exclusive locks, 168 EXEC, 189, 193–94 EXECUTE, 202, 275 EXECUTE AS, 201–2, 273 Execute tasks, 381 execution, dynamic, 193–94 EXISTS, 133 EXPLICIT, 151 Export Column, 384 exporting data, 34 Extensible Key Management, 287 Extensible Markup Language (XML). See XML (Extensible Markup Language) extents, 55 External Key Management (EKM), 260 EXTERNAL_ACCESS, 279–80

E

editions, SQL Server, 15–16 EKM (Extensible Key Management), 287 EKM (External Key Management), 260 element-centric XML data, 151 ELEMENTS, 151 ELSE statements, 190–91 e-mail architecture, 226–28 contracts, 232–33

www.detodoprogramacion.com

Page 500: Microsoft SQL Server 2008 Español - Mike Hotek

HTTP, los puntos finales 493

F

facets, 290 fact tables, 454 failover clustering, 7, 345–48 fatal error codes, 193 FETCH, 194–96 File System task, 382 FILEGROUP, 248 fi legroups, 56–57 backups, 308 database mirroring, 348 message queues, 233 partitions, 105, 110 FILEGROWTH, 54–55 fi les. See FILESTREAM fi les, structure of, 53–57 FILESTREAM, 219. See also full-text indexing creating, 57–58 data storage, 74 database mirroring, 348 Database Snapshot, 223 fi legroups, 56–57 index fi les, 55 security, 260 Filestream Access Level, 260 fi ll factor, indexes, 99–100 fi ltered indexes, 97–98 fi ltering aggregate fi ltering, 143–44 data retrieval, 127–30 EXISTS, 133 full text indexes, 249 replication, 364 table joins, 131–33 fi rewalls, endpoints, 261 fl oat(n), 68 footers, formatting, 423–28 For Loop, 381 FOR PATH, 101 FOR PROPERTY, 101 FOR VALUE, 101, 104 FOR XML, 151 Foreach Loop, 381 forecasting algorithm, 474 foreign keys, 83–84 formatting date and time data, 124 reports, SSRS, 423–28 XML data queries, 151 FORMSOF, 254 forwarding pointers, 91 fragmentation, 99–100, 337 FREETEXT, 251–55 FREETEXTTABLE, 251–55 FROM, 138–39 data retrieval, 122 deleting data, 161–62

functions, 204–11 pivot tables, 145 updating data, 159–61 FROM clause, 131–33 FTP tasks, 382 FULL OUTER JOIN, 131–33 Full recovery model, 309–11 full text catalogs, 57, 223, 247–48 full text fi legroups, 56–57 full text indexing, 249–51 Database Snapshot, 220 Dynamic Management Views (DMVs), 334 fi le structure, 55 fi legroups, 57 partitions, 112 querying, 251–55 Full Text Search, 17–19. See also full-text indexing functions, 199 CLR security, 279–80 creating, 200–3 nesting in queries, 125 retrieving data from, 204–11 system functions, 199 Fuzzy Grouping, 383 Fuzzy Lookup, 383

G

geography data, 74, 102 geometry data, 74, 102 global variables (@@), 186–88 GOTO, 192 GROUP BY, 138–39, 142, 181 grouping data, reports, 423–28 GROUPING SETS, 142

H

hash algorithms, 282–84 HAVING, 144–45, 181 headers, formatting, 423–28 health checks, 347 heap, 91 hidden tables, 228, 233–34 hierarchies encryption, 281–82 OLAP, 453–54, 467–70 permissions, 274–77 ROLLUP operator, 142 hierarchyID, 75 high availability operating mode, 351–52 high performance operating mode, 352–53 high safety operating mode, 353 histogram, 97 HTML, full text indexes, 249 HTTP, endpoints, 261

www.detodoprogramacion.com

Page 501: Microsoft SQL Server 2008 Español - Mike Hotek

494 identifiers, objecto

I identifi ers, object, 64 IDENTITY, 75 IF statements, 190–91 image, 72, 104, 423–28 IMAGE data type, 126, 249 image functions, 200 IMPERSONATE, 273 Import Column, 384 importing data, 34 IN, 129 IN PATH, 248 included columns, indexes, 95–96 INCREMENT, 75 indexed views, 103–8, 182–84 indexes administrative procedures, 196 clustered indexes, 91–93 covering indexes, 95–96 Database Engine Tuning Advisor (DTA), 44–45 dynamic management views (DMVs), 337–39 fi ltered indexes, 97–98 full text, 55, 57, 220, 249–51, 334 full text catalogs, 247–48 included columns, 95–96 index key, 129 maintenance plans, 325–28 management and maintenance, 93–95, 99–100 nonclustered, 93–95 online index creation, 98–99 partitions, 103–8, 110–16 querying full text data, 251–55 searching, 129 spatial, 102 structure, 87–91 XML, 100–1 inequality, 127–28 INFLECTIONAL, 254 infrastructure requirements, 17 INIT/NOINIT, 304 initiator, communication, 227 injection attack, SQL, 194 inline table valued functions, 201 INNER JOIN, 131–33, 149 in-place upgrades, 20–21 input parameters, 189 INSERT, 153–59 Database Snapshots, 222 db_datawriter, 269 db_denydatawriter, 269 DML triggers, 213 locks, 168 MERGE, 164–66 OUTPUT, 167 performance degradation, 93–94 permissions, 275 SELECT INTO, 159 transaction handling, 167–68

inserted tables, 166–67 installing SQL Server 2008, 22–29 authentication modes, 19 collation sequences, 19 edition descriptions, 15–16 infrastructure requirements, 17 instances, 20 sample databases, 28–29 service accounts, 17–19 upgrading, 20–22 instance level principals, 264–68 instances, 20, 216, 345–48. See also policy-based management instance-to-disk ratio, 346 INSTEAD OF, 181, 213 int, 68 integers, 67–69 Integration Services. See SQL Server Integration Server (SSIS) interactive elements, reports, 431–34 INTERSECT, 148–49, 181, 183 INTIATOR, 232 INTO, 159, 165, 179 IP addresses, 262–63, 345–48 IsAlive test, 347 ISNULL, 124, 130 isolation levels, 170–71 ISQL, 34

J

jobs, 319–25, 358 join fi lter, 364 join operators, 131–33, 144–45, 149, 204–5

K

kana sensitivity, 19 KEY INDEX, 250 key performance indicators (KPIs), 470 keys Asymmetric Key login, 264–68 asymmetric keys, 265, 281–82, 285–86 clustering key, 91–93 Encryption Keys, 415 foreign keys, 83–84 index key, 129 KEY INDEX, 250 management of, 260, 287 master keys, 281–82 partitioning key, 107, 113 primary keys, 79–81, 92, 101, 113, 171 private keys, 285 public keys, 285–86 symmetric keys, 284 KPIs (key performance indicators), 470

www.detodoprogramacion.com

Page 502: Microsoft SQL Server 2008 Español - Mike Hotek

mensajes 495

L

language fi les, 249, 471–72 leaf page, indexes, 88–91, 93–95, 99–100 LEFT OUTER JOIN, 131–33 LIFETIME, 236 LIKE operator, 129 lines, formatting, 423–28 linked reports, 443–44 LISTENER_IP, 262–63 LISTENER_PORT, 262–63 local SID, 264–68 local variables (@), 186–88 lock escalation, 169–70 locks partitions and, 112 shared, 168 transaction handling, 168–70 log fi les performance, 309–10 transaction log, 53 Log Reader Agent, 365–66 Log Sequence Number (LSN), 305–7, 355 log shipping, 356 components, 356–57 database mirroring, 353–54 initialization, 357–63 overview, 7 LOGIN, 202 loginless users, 271 logins administrative users, 269–73 instance level principals, 264–68 security of, 260 logon triggers, 218 Logread.exe, 365–66 LooksAlive test, 347 lookup tables, 84 Lookup transform, 383 LSN (Log Sequence Number), 173, 305–7

M

mail. See e-mail maintenance indexes, 99–100 plans, creating, 325–28 Manage Schedules, 320 management disk storage, 54–55 dynamic management views (DMVs) indexes, 337–39 object size, 336 overview, 333–34 query execution stats, 339–40 retrieving object metadata, 334–35 encryption keys, 415 indexes, 93–95, 99–100 locks, 169–70

membership roles and permissions, 269 messaging process, 235–36 partitions, 110–16 performance, 44–46 policy-based management compliance, 298 conditions, 290–93 facets, 290 overview, 289–90 policies, 295–98 targets, 293–94 transaction log data, 56 Management Studio, SQL Server (SSMS), 38–40, 290–93 management system functions, 199 management tools Bulk Copy Program (BCP), 34, 309–10, 366 Database Mail, 42–43 OSQL, 34 Resource Governor, 35, 334 SQL Server Confi guration Manager, 35–38 SQL Server Management Studio (SSMS), 38–40, 290–93 SQLCMD, 34 SQLDiag, 34–35 Tablediff, 34 manipulating data. See data manipulation mantissa, 68 master database, 52 master keys, 281–82. See also keys materialized views (indexed views), 103–8, 182–84 mathmatical functions, 200 matrices, formatting, 423–28 MAX, 183, 383 MAX_QUEUE_READERS, 242 MAXSIZE, 55 MDAC (Microsoft Data Access Components), 354 MDX (Multidimensional Expression), 38 measures, OLAP, 453–54 memory, 35, 67 memory buffers, 351 MERGE, 110, 164–66 Database Snapshots, 222 db_datawriter, 269 db_denydatawriter, 269 inserted and deleted tables, 167 performance degradation, 93–94 Merge Agent, 366 Merge Join, 384 merge replication, 364, 367 Merge transform, 384 Message Queue, 382 MESSAGE TYPE, 237 MESSAGE_FORWARDING, 263 MESSAGE_FORWARDING_SIZE, 263 messages, 6, 42–43, 229–32 architecture, 226–28 contracts, 232–33 conversations, 235–36

www.detodoprogramacion.com

Page 503: Microsoft SQL Server 2008 Español - Mike Hotek

496 metadata

message types, 229–32 overview, 225–26 prioritization, 245 queues, 233–34, 242–44 sending/receiving messages, 236–42 services, 234–35 metadata database mirroring, 353–54 functions, 200 operation, 111 retrieving object metadata, 334–35 security, 277–78 SSRS, 415 Microsoft Clustering, 474 Microsoft Connect, 32–33 Microsoft Customer Service and Support (CSS), 34–35 Microsoft Data Access Components (MDAC), 354 Microsoft Decision Trees, 474 Microsoft Developer Network (MSDN), 32 Microsoft Linear Regression, 474 Microsoft Regression Trees, 474 MIN, 183, 383 mirror databases, 220 mirror role, database, 349 MIRROR TO, 304 mirrored backup, 304 model database, 52 monetary data, 67–69 monitor server, 357 MOVE, 312 moving, databases, 59–60 msdb database, 52 MSDN (Microsoft Developer Network), 32 Multicast, 385 Multidimensional Expression (MDX), 38, 470 multi-platform processing, 225–26 multiple-instance cluster, 345

NTEXT, 70, 104, 126 NTILE, 147 NULL, 75 CUBE operator, 141 data retrival, 124 functions, 201–2 search queries, 130 transforms, 384 XML data queries, 151 nullability, 75 numeric data, 67–69 nvarchar(max), 70–71 nvarchar(n), 70

O

Object Explorer, 40, 95 objects dependent, 202 dynamic management views (DMVs), 336 metadata, retrieving, 334–35 naming, 64 permissions, 278–79 policy-based management conditions, 290–93 facets, 290 overview, 289–90 policies, 295–97 policy categories, 297–98 policy compliance, 298 policy targets, 293–94 schemas, 273–74 OFFLINE, indexes, 98–99 OLAP engine (Online Analytic Processing). See also Database Engine cubes, 454–62 dimensional model, 453–54 dimensions, measures, calculations, 462–66 hierarchies, 453–54, 467–70 key performance indicators (KPIs), 470 overview, 13–14, 452–53 partitions, 471 perspectives, 471 translations, 471–72 OLE Automation Procedures, 260 OLE DB, 385 OLTP (online transaction processing), 13–14. See also Database Engine ON, 92 ON ALL SERVER, 216 ON clause, 106–7, 131–33 ON DATABASE, 216 Online Analytic Processing (OLAP) cubes, 454–62 dimensional model, 453–54 dimensions, measures, calculations, 462–66 hierarchies, 453–54, 467–70 key performance indicators (KPIs), 470

N

naming objects, 64 Nave Bayes, 474, 483–84 nchar(n), 70 NEAR, 254 network confi guration, failover clustering, 346 network names, failover clustering, 345–48 Neural Networks, 474 NEXT USED fl ag, 110 NO REVERT, 202 NODE, 101 noise words, 249 nonclustered indexes, 93–95 NONE, validation option, 229 NORECOVERY, 312 NOT NULL, 75 NOT, search queries, 130 notifi cations, jobs, 321–25

www.detodoprogramacion.com

Page 504: Microsoft SQL Server 2008 Español - Mike Hotek

gestión basada en políticas

overview, 13–14, 452–53 partitions, 471 perspectives, 471 translations, 471–72 online indexes, 98–99 online transaction processing (ONTP), 93–94. See also Database Engine ONLINE, indexes, 98–99 OPEN, 194–96 OPEN MASTER KEY, 282 OPENDATASOURCE, 260 OPENROWSET, 260 operating system, 56–57, 260, 319–20 operations, order of, 139 operators, jobs, 321–25 Optimizer, 97, 169–70, 201, 338 OPTION, 179 ORDER BY, 126, 130, 138, 146, 179, 183 order of operations, 139 OSQL, command line utility, 34 OUT, 189 outbound mail messages, 42–43. See also e-mail OUTPUT, 166–67, 188–89

partition schemes, 105 SSAS (SQL Server Analysis Services), 471 sys.partition, 334, 336 tables and indexes, 106–8 partitioning key, 107, 113 PARTNER, 263 passwords instance level principals, 264–68 security of, 260 SQL Server Confi guration Manager, 35–38 paste, Object Explorer, 95 patches, 20 PATH, 101, 151 PATH XML, 101 payloads, endpoints, 261 percent (%), wildcard searches, 129 Percentage transform, 385 performance alerts, creating, 329–32 backups, 304 cubes, processing, 471 database mirroring, 351–54 indexed views, 183 key performance indicators (KPIs), 470 locks, 169–70 logging, 309–10 management tools, 44–46 Performance Studio, 45–46 queries, 93–94, 133, 184, 204–5, 252 report caching, 444–49 report parameters, 434–38 Resource Governor, 35 searching, 129 SQL Server Profi ler, 44 stored procedures, 340 performance counters, 34–35 Performance Data Warehouse, 45–46 Performance Reports, 45–46 Performance Studio, 45–46 permissions, 274–77 access permissions, 279–80 directories, 347 objects, 278–79 service accounts, 347 perspectives, 471 phantom read, 170 ping, 347 PIVOT, 145, 183 pivot tables, 145 Pivot transform, 385 pointers, 91, 111–13 policies, 265, 295–97. See also policy-based management policy-based management conditions, 290–93 facets, 290 overview, 289–90 policies, 295–97

497

P

Package Explorer, SSIS, 380 packages confi guration fi le, 406–9 connections, 386–90 control fl ow, 390–94 data fl ow, 394–403 deploying, 409–10 exception handling, 403–6 page splitting, 90 PageNumber, 423 pages, 55 corruption of, 354 Database Snapshot, 220–21 fi ll factor, index, 99–100 full backups, 302–5 indexes, 88–91, 93–95 nonclustered indexes, 93–95 object size, 336 page corruption, 308–9 page-level locks, 169 partitioning, pointers, 111–13 parameters, reports, 445 parameters, stored procedures, 188–89 parent-child relationship, 84 parsing data, 123 PARTITION BY, 146 partitioning Database Engine Tuning Advisor (DTA), 44–45 managing partitions, 110–16 overview, 103 partition functions, 103–5

www.detodoprogramacion.com

Page 505: Microsoft SQL Server 2008 Español - Mike Hotek

498 port 1433

policy categories, 297–98 policy compliance, 298 policy targets, 293–94 port 1433, 262–63 ports, 262–63 PowerPoint documents, 249 primary database, 357 PRIMARY fi legroup, 56–57 primary keys, 79–81 change tracking, 171 clustered indexes, 92 partitions, 113 XML indexes, 101 PRIMARY, XML indexes, 100–1 principal role, database, 349 principals administrative users, 269–73 database level, 268–69 impersonation, 273 instance level, 264–68 private keys, 285 procedures, stored, 260, 277, 279–80 processadmin, 266 processing, multi-platform, 225–26 processors, 35, 69 Profi ler, 44 profi ler traces, 34–35 programming interface, 5–6 PROPERTY, 101 proximity searching, 254 public key certifi cates, 285–86 public keys, 285 public, fi xed database role, 269 publications, 364 publisher, 365

query() method, 150 Queue Reader Agent, 366 queuing, messages, 6 architecture, 226–28 contracts, 232–33 conversations, 235–36 message types, 229–32 overview, 225–26 prioritization, 245 queues, 233–34, 242–44 sending/receiving messages, 236–42 services, 234–35

R

RANGE LEFT, 104 RANGE RIGHT, 104 RANK, 146, 254 ranking data, 146–47 ranking functions, 200 RAW, 151 Read Committed isolation, 170 Read Uncommitted isolation, 170 read/write data fi les, 55 real, 68 RECEIVE, 237 RECOVERY, 312 recovery, data. See also database mirroring backups, 301 database mirroring model, 355–56 database restores, 311–16 differential backups, 307–8, 314–15 fi legroup backups, 308 full backups, 302–5, 311–12 page corruption, 308–9 recovery models, 309–11 transaction log backups, 305–7, 315–16 redirection, clients, 354 redundancy. See database mirroring; replication REFERENCES, 275 Registered Servers, 39 registry keys, 347 regression algorithm, 473 RELATED_CONVERSATION, 236 RELATED_CONVERSATION_GROUP, 236 Relational Engine, 8 relational indexes, 91–95 Remote Admin Connections, 260 remote connections, 259–60 Repeatable read isolation, 170 replication, 363. See also database mirroring agents, 365–66 caching, 353–54 components, 364 confi guring, 367–73 creating jobs, 319–20 Database Engine, 6–7 methods, 366–67 roles, 365

Q

Qrdrsvc.exe, 366 quality assurance, testing, 20 queries. See also indexes Data Mining Query, 380 Database Engine Tuning Advisor (DTA), 44–45 execution stats, 339–40 full text indexing, 251–55 functions, performance of, 204–5 indexed views, 184 multiple tables, 131–33 NULL values, 124, 130 Optimizer, 97 OSQL, command line utility, 34 performance of, 184 SQLCMD, 34 sub-queries, 133 views, substitution, 180 WHERE clause, 138 XML data, 150–51 query cache, 340, 353

www.detodoprogramacion.com

Page 506: Microsoft SQL Server 2008 Español - Mike Hotek

seguridad

Replmerge.exe, 366 Report Designer, 12 Report Manager URL, 413 reporting building reports, 418–23 computations, 429–31 confi guring, 413–16 deploying, 439–40 formatting, 423–28 interactive report elements, 431–34 linked reports, 443–44 parameters, 434–38 Performance Studio, 45–46 report caching and snapshots, 444–49 SQL Server Management Studio (SSMS), 40 subscriptions, 441–43 Web site, 417 Reporting Services. See also SQL Server Reporting Services ReportServer, 415 ReportServerTemp, 415 ReportServerTempDB, 444–49 requirements, SQL Server 2008 installation, 17 Resource Governor, 35, 334 resources, 169–70, 242, 245 restore database mirroring, 355–56 job, 358 log shipping, 358–59 partial, 107 RESTORE, 312 RESTORE MASTER KEY, 282 restore paths, 312–14 RETENTION, 233, 237 retrieving data aggregating data, 138–39 derived tables, 139–40 fi ltering aggregates, 143–44 multiple permutations, 140–42 pivot tables, calculating, 145 ranking data, 146–47 result sets, 147–49 running aggregates, 144–45 common table expressions (CTEs), 149–50 fi ltering data, 127–30 functions, 204–11 multiple tables, 131–33 overview, 121 SELECT statement, 126, 137–38 sorting results, 126 unique results, 134–35 views, 179–84 XML data querying, 150–51 RETURN, 190 return codes, 188 RETURNS NULL ON NULL INPUT, 201–2

reverting data, Database Snapshots, 222–23 RIGHT OUTER JOIN, 131–33 ROLLBACK, 167 ROLLBACK TRAN, 167–68 ROLLUP operator, 142 root pages, indexes, 88–91, 93–95 Row Count transform, 385 row fi lter, 364 Row Sampling, 385 ROW_NUMBER(), 146 rows, table cursors, 194–96 row-level locks, 169 TRUNCATE, 164 rowset functions, 200 run-time activity, 337

499

S

SAFE, 279–80 salting a hash, 284 sample databases, 28–29 SARG (search argument), 127–31 scalability, dynamic, 242 scalar functions, 200, 203 scheduling, 6, 320. See also SQL Server Agent SCHEMABINDING, 183, 201–2 schemas, 64–66, 72–74, 273–77, 366 SCOPE_IDENTITY(), 158 Script, 381 script generators, 335 Script transform, 385 scripting tasks, 381 SEARCH, 134–35 search argument (SARG) fi ltering data, 127–30 join clauses, 131 WHERE clause, 138 searching. See also full-text indexing character data, fragments, 129 full text queries, 251–55 Full Text Search, 17–19 index pages, 88–91 weighted proximity searches, 254 wildcards, 253 secondary database, 357 SECONDARY, XML indexes, 100–1 securables, 273–77 security attack surface, confi guring, 259–60 authentication modes, 19 backups, 301 certifi cates, 285–86 CLR security, 279–80 cubes, OLAP, 454–62 Database Engine, 4–5 database level principals, 268–69

www.detodoprogramacion.com

Page 507: Microsoft SQL Server 2008 Español - Mike Hotek

500 security functions

database mirroring, 351–53 encryption asymmetric keys, 285–86 Extensible Key Managment (EKM), 287 hash algorithms, 282–84 master keys, 281–82 overview, 280–81 symmetric keys, 284 TCP endpoints, 263 Transparent Data Encryption (TDE), 286–87 endpoints, 260–63 EXECUTE AS, 202 failover clustering, 346–47 impersonation, 273 job steps, 320 metadata, 277–78 ownership chains, 277–79 permissions, 274–77 principals, 264–73 reports, linked, 443–44 schemas, 273–74 securables, 273–74 SQL Server Confi guration Manager, 35–38 security functions, 200 Security Identifi er (SID), 346 securityadmin, 266 SEED, 75 SELECT Database Snapshots, 222 db_datareader, 269 db_denydatareader, 269 DMVs (dynamic management views), 334 functions, retrieving data, 204–11 locks, 168 permissions, 275 recovering data, 312 script generators, 335 SELECT INTO, 159 variables, 187 SELECT INTO, 139, 159, 309–10 SELECT statements, 137–38 embedded (sub-queries), 133 fi ltering data, 127–30 general syntax, 121–26 multiple tables, data from, 131–33 sorting results, 126 views creating views, 179–84 self-signed certifi cates, 285 SEND, 236–37 Send Mail, 382 Sequence, 381 sequence analysis, 474 Sequence Clustering, 474 Serializable isolation level, 170 server blocking, 34–35 server confi guration, 34–35 server connections, 260–63

Server Management Objects (SMO), 290 server roles, 264–68 serveradmin, 266 service accounts creating, 17–19 failover clustering, 346–48 SQL Server Confi guration Manager, 35–38 Service Broker architecture, 226–28 contracts, 232–33 conversations, 235–36 endpoints, 263 message types, 229–32 overview, 6, 225–26 priortization, 245 queues, 233–34, 242–44 sending/receiving messages, 236–42 services, 234–35 TCP endpoints, 262 service master key, 281–82 service packs, 20 SERVICE_BROKER, 261 SET, 159–61, 187, 192–93 setupadmin, 266 shared lock, 168 SID, local, 264–68 side-by-side upgrades, 21–22 signatures, digital, 285–86 Simple recovery model, 309–11 single-instance cluster, 345 Slowly Changing Dimensions, 385 smalldatetime, 71–72 smallint, 68 smallmoney, 68 SMO (Server Management Objects), 290 Snapshot Agent, 365–67 Snapshot isolation level, 170–71 Snapshot.exe, 365 snapshots, 221–22 Copy-On-Write, 220–21 Database Engine, 6–7 database mirroring, 349, 354 overview, 219–20 replication, 366–67 reports, 444–49 reverting data, 222–23 SOAP, 261 sorting, 126 sp_confi gure, 260 sp_executesql, 193–94 space utilization, 336 SPARSE, 78–79 sparse fi les, 220 SPATIAL data, 74–75 spatial indexes, 102 SPLIT operator, 110 spreadsheets, 67 SQL injection attack, 194

www.detodoprogramacion.com

Page 508: Microsoft SQL Server 2008 Español - Mike Hotek

SSRS (SQL Server Reporting Services)

SQL Mail XPs, 260 SQL Server Agent account, creating, 17–19 alerts, creating, 329–32 change tracking, 173 jobs, creating, 319–25 maintenance plans, creating, 325–28 msdb database, 52 overview, 6 schedule policies, 295 SQL Server Analysis Services (SSAS), 13–14 Analysis Services Execute DDL Task, 380 creating account, 17–19 data mining, 472 algorithms, 473–74 demystifi ed, 483–84 models and structures, 474–83 data warehousing, 451–52 installing, 22–29 OLAP (Online Analytic Processing) cubes, 454–62 dimensional model, 453–54 dimensions, measures, calculations, 462–66 hierarchies, 467–70 key performance indicators (KPIs), 470 overview, 452–53 partitions, 471 perspectives, 471 translations, 471–72 SQL Server Compact Edition, 16 SQL Server Confi guration Manager, 35–38 SQL Server Developer Edition, 16–17 SQL Server Enterprise Edition, 16–17 SQL Server Evaluation Edition, 16 SQL Server Express Edition, 16 SQL Server Integration Services (SSIS), 10–11 account, creating, 17–19 BIDS, 378–80 tasks, 380–82 transforms, 382–85 jobs, creating, 319–20 msdb database, 52 overview, 377 package building confi guration fi le, 406–9 connections, 386–90 control fl ow, 390–94 data fl ow, 394–403 deploying, 409–10 exception handling, 403–6 SQL Server Management Studio (SSMS), 38–40, 290–93 SQL Server Profi ler, 44 SQL Server Reporting Services (SSRS), 12–13 building reports, 418–23 computations, 429–31 confi guring, 413–16 creating account, 17–19

deploying reports, 439–40 formatting, 423–28 installing, 22–29 interactive report elements, 431–34 linked reports, 443–44 parameters, 434–38 report caching and snapshots, 444–49 subscriptions, 441–43 Web site, 417 SQL Server Standard Edition, 16 SQL Server Workgroup Edition, 16 SQL Trace Application Programming Interface (API), 44 SQLCMD, 34 SQLDiag, 34–35 SSAS (SQL Server Analysis Services ), 13–14 Analysis Services Execute DDL Task, 380–85 BIDS, 380 creating account, 17–19 data mining, 472 algorithms, 473–74 demystifi ed, 483–84 models and structures, 474–83 data warehousing, 451–52 installing, 22–29 OLAP (Online Analytic Processing) cubes, 454–62 dimensional model, 453–54 dimensions, measures, calculations, 462–66 hierarchies, 467–70 key performance indicators (KPIs), 470 overview, 452–53 partitions, 471 perspectives, 471 translations, 471–72 SSIS (SQL Server Integration Services) BIDS, 378–80 tasks, 380–82 transforms, 382–85 creating account, 17–19 creating jobs, 319–20 installing, 22–29 msdb database, 52 overview, 10–11, 377 package, building confi guration fi le, 406–9 connection managers, 386–90 control fl ow, 390–94 data fl ow, 394–403 deploying, 409–10 exception handling, 403–6 SSMS (SQL Server Management Studio), 38–40, 290–93 SSMS Reports, 40 SSRS (SQL Server Reporting Services), 12–13 BIDS, 378 building reports, 418–23 computations, 429–31 confi guring, 413–16

501

www.detodoprogramacion.com

Page 509: Microsoft SQL Server 2008 Español - Mike Hotek

502 Gestor de configuración SSRS

creating account, 17–19 deploying reports, 439–40 formatting, 423–28 installing, 22–29 interactive report elements, 431–34 linked reports, 443–44 parameters, 434–38 report caching and snapshots, 444–49 subscriptions, 441–43 Web site, 417 SSRS Confi guration Manager, 413 Standard SQL Server login, 264–68 STANDBY, 312 STARTED, 261–62 startup mode, service, 35–38 static computations, 205 static row fi lter, 364 statistics, 325–28, 337, 339–40. See also algorithms STATUS, 233 STDEV, 183 stemmers, 249 stop words, 249 STOP_ON_ERROR, 304 STOPAT, 315 STOPATMARK, 315 STOPBEFOREMARK, 315 STOPPED, endpoints, 261–62 storage. See also message queuing binary data, 72 character data, 69–71 data, architecture, 56 date and time data, 71–72 FILESTREAM data, 74 hierarchyID, 75 histograms, 97 index pages, 88–91, 93–95 management of, 54–55, 110–16 memory and, 67 numeric data, 67–69 object size, 336 partitions, 103–8, 110–16 sparse columns, 78–79 SPATIAL data, 74–75 temporary, 52–53 XML data, 72–74 Storage Engine, 4 stored procedures, 185 administrative procedures, 196 CLR procedures, 196 CLR security, 279–80 commenting code, 186 control fl ow constructs, 189–92 creating, 185 cursors, 194–96 dynamic execution, 193–94 error handling, 192–93 executing, 189

message queue, 242 ownership chains, 277 parameters, 188–89 performance, 340 return codes, 188 variables, 186–88 string functions, 200 striped backup, 303 sub-queries, 133 sub-reports, formatting, 423–28 subscriber, 365 subscriptions, reports, 441–43 SUM, 383 SWITCH operator, 111–13 symmetric keys, 281–82, 284 synchronizing fi les, 164–66. See also FILESTREAM sys.assembly, 333 sys.change_tracking, 333 sys.conversation, 333 sys.database_fi les, 336 sys.database_mirroring, 334 sys.database_mirroring_witnesses, 349 sys.dm.db, 334 sys.dm_audit, 334 sys.dm_broker, 334 sys.dm_clr, 333 sys.dm_db_index_operational_stats, 337 sys.dm_db_index_physical_stats, 337 sys.dm_db_index_usage_stats, 337 sys.dm_db_missing_index, 338 sys.dm_db_missing_index_group_stats, 338 sys.dm_exec, 334 sys.dm_exec_cached_plans, 340 sys.dm_exec_connections, 340 sys.dm_exec_procedure_stats, 340 sys.dm_exec_query_plans, 340 sys.dm_exec_query_stats, 340 sys.dm_exec_requests, 340 sys.dm_exec_sessions, 340 sys.dm_exec_sql_text, 340 sys.dm_fts, 334 sys.dm_os, 334 sys.dm_resource_governor, 334 sys.dm_xe, 334 sys.fulltext, 334 sys.partition, 334, 336 sys.resource_governor, 334 sys.server_events, 334 sys.service, 334 sys.sp_cdc_enable_db, 173 sys.trace, 334 sys.xml, 334 sysadmin, 266, 269–73 system functions, 199–200 system statistics, 200 system stored procedures, 260

www.detodoprogramacion.com

Page 510: Microsoft SQL Server 2008 Español - Mike Hotek

desencadenadores 503

T

Tablediff, 34 tables. See also indexes; also Tablediff change, 171–73 columns, 91–93, 95–96 creating, 76–77 data retrieval aliases, 123 derived tables, 139–40 multiple tables, 131–33 SELECT, general syntax, 121–26 table joins, 131–33 deleted, 166–67 designing, 63–64 binary data, 72 character data, 69–71 columns, 75, 77–79 constraints, 79–84 data types, 67 database design, 64–67 database diagrams, 85–86 date and time data, 71–72 FILESTREAM data, 74 hierarchyID data, 75 naming objects, 64 numeric data, 67–69 schemas, 64–66 SPATIAL data, 74–75 XML data, 72–74 formatting reports, SSRS, 423–28 inline table valued functions, 201 inserted, 166–67 lookup, 84 partitions, 103–8, 110–16 pivot, calculating, 145 table-level locks, 169 temporary tables, 139–40 triggers DDL triggers, 216, 218, 295 DML triggers, 213–15 views creating views, 179–80 indexed views, 182–84 modifying data, 181–82 table-valued functions, 203 TAKE OWNERSHIP, 275 TARGET, 232 target, communication, 227 TCP endpoints, 261–63 TDE (Transparent Data Encryption), 286–87 Template Explorer, 39 templates, model database(s), 52 temporary storage, 52–53 temporary tables, 139–40 Term Extraction, 385 Term Lookup, 385 terminating executions, 190

testing, quality assurance, 20 text, 70 full, 56–57 partitions, 104 report formatting, 423–28 TEXT, 126, 249 text functions, 200 text index fi les, 55, 57, 112 text mining, 385 THESAURUS, 254 thesaurus fi les, 251, 254 time, 71–72, 124, 424 time functions, 199 Time Series, 474 timestamp, 104 tinyint, 68 tmpdb database, 52–53 TO clause, 105 Toolbox, SSIS, 380 tools BI Dev Studio, 46 Bulk Copy Program (BCP), 34 Database Engine Tuning Advisor (DTA), 44–45 Database Mail, 42–43 documentation, 31–33 OSQL, 34 Performance Studio, 45–46 Resource Governor, 35 SQL Server Confi guration Manager, 35–38 SQL Server Management Studio (SSMS), 38–40 SQL Server Profi ler, 44 SQLCMD, 34 SQLDiag, 34–35 Tablediff, 34 TOP, 183 TOP (n), 237 TOP operator, 130, 138, 179, 181 TotalPages, 423 Trace Application Programming Interface (API), 44 traces, 334 tracking changes, 171–75 transaction handling, 167–71, 216 transaction log, 351 backups, 305–7, 314, 325–28 database mirroring, 349 recovery models, 309–11 restoring backup, 315–16 transaction log fi le, 53, 56, 223 transactional replication, 367 Transact-SQL (T-SQL), 5, 38, 319–20 transforms, SSIS, 382–85 translations, 471–72 Transparent Data Encryption (TDE), 286–87 transports, endpoints, 261 triggers CLR security, 279–80 DDL triggers, 216, 218, 295 DML triggers, 213–15

www.detodoprogramacion.com

Page 511: Microsoft SQL Server 2008 Español - Mike Hotek

504 Triple DES

Triple DES, 281–82 troubleshooting IF statements, 191 SQLDiag, 34–35 WHILE statements, 191 TRUNCATE, 164 TRUNCATE TABLE, 164 TRY, 192–93 T-SQL (Transact-SQL), 5, 262–63 TYPE, 151 TYPE COLUMN, 250

VARP, 183 verb tenses, 249 verifi cation, 309 VIEW DEFINITION, 275 views dyanamic management views (DMV) indexes, 337–39 object size, 336 overview, 333–34 query execution stats, 339–40 retrieving object metadata, 334–35 indexed, 182–84 modifying data, 181–82 triggers DDL triggers, 216, 218 DML triggers, 213–15 virtual tables, 139–40 Visual Studio, 378, 384

U

underscore (_), wildcard searches, 129 Unicode data, 70, 252 UNION, 147–49, 179, 181, 183 UNION ALL, 147–49, 179, 181 unique constraints, 81, 92 unique indexes, 92 uniqueidentifi er, 236 UNPIVOT, 183 Unpivot transform, 385 UNSAFE, 279–80 unstructured data, 74 UPDATE Database Snapshots, 222 db_datawriter, 269 db_denydatawriter, 269 DML triggers, 213 locks, 168 MERGE, 164–66 OUTPUT, 167 performance degradation, 93–94 permissions, 275 transaction handling, 167–68 update locks, 168 updating data, 159–61 upgrading, 20–22 USER, 202 USING. . .ON, 165 utilities, 34

W

WAITFOR, 191 WAITFOR DELAY, 191 WAITFOR RECEIVE, 191 WAITFOR TIME, 191 Web Service URL, 413 Web Services, 382 web sites CodePlex, 28 SSRS Web site, 417 weighted proximity searches, 254 WELL_FORMED_XML, 229 WHEN, 165 WHERE clause, 181 conditions, 290–93 data retrieval, 127–30 fi ltering data, 133, 143–44 functions, retrieving data, 204–11 join clauses, 131 queries, 138 updating data, 159–61 WHILE, 191, 195 wildcard characters, searching, 129, 253 Windows accounts, 347 Windows group, login, 264–68 Windows login, 264–68 Windows Management Instrumentation (WMI), 329–32, 382 Windows password policy, 265 Windows performance counters, 34–35 Windows security API, 265 Windows Server 2003, 17, 265 Windows Server 2008, 17, 265 Windows Service Control Applet, 35 Windows versions, 19 Windows Vista, 17

V

VALID_XML WITH SCHEMA COLLECTION, 229 VALIDATION, 229 VALUE, 101 value() method, 216 VALUES, 154 VAR, 183 VARBINARY, 72, 249 VARBINARY(MAX), 104, 249–50 varchar(max), 70–71, 104 varchar(n), 70 variables, stored procedures, 186–88

www.detodoprogramacion.com

Page 512: Microsoft SQL Server 2008 Español - Mike Hotek

Directiva XSNIL

Windows XP Professional, 17, 19 WITH CHECK OPTION, 181 WITH FORMAT, backup, 304 WITNESS, 263 witness server, 349, 352–53 WMI (Windows Management Instrumentation), 329–32, 382 WMI Data Reader task, 382 WMI Event Watcher, 382 word breakers, 249 Word documents, 249 words, full text searches, 251–55 workload, 35 write/read data fi les, 55

XML (Extensible Markup Language), 5–6. See full-text indexing BIDS tasks, 382 data querying, 150–51 data storage, 72–74 documents, 72–73, 216 full text indexes, 249 indexes, 100–1 message types, 229 schemas, 72–74, 151 sorting results, 126 sys.xml, 334 thesaurus fi les, 254 XML for Analysis (XMLA), 38 XMLA (XML for Analysis), 38 Xp_cmdshell, 260 XQUERY, 216 XSNIL directive, 151

505

X

X.509 standard, 285 XACT_ABORT, 192–93

www.detodoprogramacion.com

Page 513: Microsoft SQL Server 2008 Español - Mike Hotek

Acerca del Autor

Mike Hotek

Mike Hotek es el vicepresidente de las Empresas de MHS, Inc., y Semiologic, Inc., ambas empresas de los Estados Unidos, y el presidente de Filam Software Technology, Inc., una corporación de Filipinas. Mike ha sido un profesional de SQL Server por casi dos décadas y un desarrollador de aplicaciones que se remonta casi a tres décadas. Él enseña, escribe, da consultaría, y desarrolla productos y soluciones que abarcan todas las funciones dentro de SQL Server, así como desarrollo de aplicaciones en múltiples lenguajes. Es autor o coautor de ocho libros, siete de esos libros de SQL Server, junto con la edición de docenas de artículos para varias revistas comerciales. Ha impartido cientos de sesiones de conferencias y seminarios, además enseñar en docenas de clases en todo el mundo.

www.detodoprogramacion.com

Page 514: Microsoft SQL Server 2008 Español - Mike Hotek

Juegos, Revistas, Cursos, Software, Sistemas Operativos, Antivirus y más … Gratis para el Conocimiento...!

www.detodoprogramas.com

Visítanos y compruébalo

Material para los amantes de la Programación Java, C/C++/C#,Visual.Net, SQL, Python, Javascript, Oracle, Algoritmos,

CSS, Desarrollo Web, Joomla, jquery, Ajax y Mucho Mas…

www.detodoprogramacion.com

Visitanos

Libros Universitarios, Contabilidad, Matemáticas, obras literarias, Administración, ingeniería y mas…