Documente Academic
Documente Profesional
Documente Cultură
Agradecimientos
Contenido
Durante el mdulo, ver cuales los requisitos hardware/software necesarios para instalar SQL Server 2005 Express, y cmo realizar la instalacind el producto. Se introducir al alumno brevemente los componentes del producto, enfocado en las necesidades del desarrollador de software. A su vez se ver cmo se integra SQL Server 2005 Express con las herramientas de desarrollo de las ediciones Express. Para finalizar se presentarn los drivers de acceso a datos que se usarn para conectar a SQL Server 2005 Express. o o o o o o o o
Introduccin
En esta leccin, conocer los requisitos para instalar SQL Server 2005 Express; adems, ver las diferentes opciones disponibles durante la instalacin asistida. A continuacin se le introducir los componentes instalados, explicandose su funcionalidad. Para finalizar la leccin se hablar de otros componentes disponibles con el producto como cdigo y bases de datos de ejemplo, y documentacin del producto (Libros en pantalla). o o o o o o o
Componentes instalados
Administrador de configuracin Configuracin de superficie de SQL Server SQLCMD
Sistema operativo
Proceso de instalacin
La instalacin de SQL Server 2005 Express se puede realizar de dos formas: Como parte de la instalacin de algn producto Express. Como instalacin independiente. Si se instala como parte de la instalacin de algn producto Express (por ejemplo Visual Basic Express), el proceso de inslatacin le pedir si desea incluir SQL Server 2005 Express en la instalacin: en la imagen puede ver la ventana en la que se le solicita la opcin (la instalacin por defecto no incluye instalar SQL Server 2005 Express).
Si se instala de forma independiente, el proceso de instalacin requiere los siguientes pasos: El primer paso de la instalacin consiste en instalar Microsoft .NET Framework 2.0 que es uno de los requisitos de la instalacin; si ya est instalado previo al proceso de instalacin, este paso ser omitido. La actualizacin desde versiones anteriores de .NET Framework est soportada hasta la versin 1.1, en caso de haber instalado una versin posterior, deber desinstalarla antes de instalar SQL Server 2005 Express; en otras palabras, la actualizacin se puede realizar slo desde versiones soportadas de .NET Framework.
Ventana de bienvenida de instalacin de los prerequisitos necesarios para SQL Server 2005 Express; pulsar Instalar.
Ventana de bienvenida al asistente de instalacin de SQL Server 2005 Express; pulsar Siguiente.
Ventana de comprobacin de requerimientos del sistema; si la comprobacin ha sido satisfactoria, todas las opciones aparecern con la opcin de verificacin en color verde, en caso de haber algn requerimiento no severo, aparecer en color amarillo; si hay algn requirimiento crtico que no se cumple, aparecer en color rojo y no podr seguirse con el
Introduzca la informacin de registro, desmarque la opcin Ocultar opciones avanzadas de configuracin, y pulse Siguiente.
Seleccione el nombre de la instancia de SQL Server 2005 Express (por defecto SQLExpress), y pulse Siguiente.
Seleccione el nombre de la cuenta que arrancar el servidor de SQL Server 2005 Express (Network Service por defecto), y habilite que el servicio de SQL Server se arranque al finalizar la instalacin; a continuacin pulse Siguiente.
10
Seleccione el modo de autenticacin (por defecto autenticacin integrada de Windows), y pulse Siguiente.
11
Seleccionar la opcin de configuracin de la instancia de SQL Server sobre la posibilida de permitir a usuarios no-administradores de crear instancias. Por defecto habilitado; durante las siguientes lecciones se hablar de ello, habilitelo y pulse Siguiente.
12
Opciones para informar a Microsoft sobre los errores no esperados sucedidos en la aplicacin, y para enviar automticamente informacin sobre las caractersticas usadas del producto; por defecto estn deshabilitadas, pero se recomienda habilitarla para mejorar el producto enviando automticamente informacin del uso que se hace del producto; a continuacin se pulsa en Siguiente.
13
Finalizacin del proceso de instalacin con estado de casa funcionalidad instalada; en caso de haber algn error durante la instalacin, aparecern botones en color Rojo indicando el error; pulsando en la casilla correspondiente de la columna Status, podr ver informacin del error producido; pulse Siguiente.
14
Infome final de la instalacin de SQL Server en el que se podr ver todas las caractersticas instaladas, y un fichero de resumen con cada paso realizado durante la instalacin. Pulse Finalizar, y ya est preparado para poder utilizar SQL Server 2005 Express.
15
Las opciones disponibles son las siguientes: Administrador de configuracin Informes de uso y errores de SQL Server Configuracin de superficie de SQL Server SQLCMD (opcin de lnea de comando)
Administrador de configuracin
Componente basado en Microsoft Management Console (MMC), con el que se puede administrar la configuracin de los servicios SQL Server, protocolos de red utilizados, y configurar el cliente nativo de acceso a SQL Server. Es una herramieta que realiza todas las modificaciones haciendo uso de las nuevas APIs de administracin SMO (sustituto de SQLDMO). El hecho de usar tales APIs nos da la posibilidad de poder crear aplicaciones personalizadas para configurar el servidor; por ejemplo, se podra crear una aplicacin basada en SMO que implemente o extienda las funcionalidades expuestas a travs de la aplicacin MMC. La aplicacin tiene la siguiente apariencia:
16
Al igual que desde el administrador de servicios del sistema operativo, se pueden cambiar las propiedades del servicio; la gran diferencia, es que mientras las llamadas de la aplicacin MMC de los servicios realiza llamadas a las APIs del Kernel de Windows, el Administrador de Configuracin, realiza las llamadas a travs de las APIs de SMO.
17
As como establecer el orden de los protocolos de Red; en el siguiente ejemplo, estn habilitados los protocolos Shared Memory, TCP/IP, y Named Pipes, mientras que el protocolo VIA est deshabilitado:
18
Nota. Recuerde que la mayora de estos cambios no tendrn efecto hasta que el servicio de SQL Server haya sido reiniciado.
19
20
21
Tambin permite configurar el tipo de conexiones permitida sobre el servidor. Por ejemplo, SQL Server 2005 Express permite por defecto slo conexiones locales; esto quiere decir que no se pueden realizar conexiones desde equipos externos a menos que se configure de servidor para permitirlo. Desde la aplicacin, se podr habilitar la posibilidad de conexiones de equipos remotos, y los protocolos de conexin permitidos.
22
En cuanto a las opciones de configuracin de funcionalidades del motor de base de datos, se incluyen: Posibilidad de habilitar o deshabilitar la ejecucin de consultas con OPENROWSET y OPENDATASOURCE: lo que estas funciones permiten es realizar consultas a servidores remotos (servidores expuestos a travs de un origen de datos del que se provea drivers de acceso como ODBC, OLEDB, etc.) sin la necesidad de tener que crear un servidor vinculado. Habilitar el soporte del CLR: creacin de objetos de base de datos con cualquier lenguaje .NET Framework. Habilitar el soporte nativo de Servicios Web: opcin slo disponible en la versin Enterprise de SQL Server 2005 que permite exponer SQL Server 2005 sin necesidad de implementar Servicios Web expuestos por IIS. Habilitar el uso de Automatizacin OLE con sentencias T-SQL: posibilidad de realizar llamadas a objetos COM desde Transact-SQL con los procedimientos almacenados de sistema sp_OACreate, sp_OAGetProperty, sp_OASetProperty, sp_OAMethod, sp_OAStop, y sp_OADestroy. Automatizacin OLE entrar en desuso debido a la integracin del CLR y su consiguiente facilidad para implementarlo mediante .NET Framework en lugar de objetos COM. Habilitar el uso del procedimiento almacenado de sistema xp_cmdshell que permite ejecutar comandos de sistema en el servidor (tales como DIR, DELETE, COPY, etc.) Habilitar el uso de endpoints de Service Broker.
23
SQLCMD
SQL Server 2005 Express no incluye la herramienta SQL Server Management Studio como el resto de versiones de SQL Server 2005. Para poder conectarse a SQL Server, el producto incluye una utilidad de lnea de comando que permite conectarse a una instancia de SQL Server y realizar operaciones de manera similar a las herramientas grficas. Evidentemente, la funcionalidad que nos proveen Management Studio no puede ser alcanzada con la utilidad de lnea de comando, pero si provee lo necesario para conectarse e interactuar con la instancia. Tpicamente esta utilidad suele ser utilizada para realizar tareas administrativas bsicas. Por ejemplo, un ISV que desarrolla una aplicacin y necesita ejecutar un script contra la instancia de SQL Server; imaginese que el ISV no ha desarrollado sus propias herramientas para ejecutar consultas ad-hoc contra el servidor; en este caso, puede utilizar SQLCMD para conectarse a la instancia de SQL Server y ejecutar el script deseado. Incluso, el ISV tiene la posibilidad de crear el script con SQL Server Management Studio en sus equipos de desarrollo porque Management Studio incorpora la posibilidad de ejecutar scripts en modo SQLCMD. La documentacin del SQLCMD la puede encontrar en los Libros en Pantalla en "SQL Server 2005 Express Edition", "Working with SQL Server Express", "Using the sqlcmd Utility (SQL Server Express)". La funcionalidad ms novedosa implementada en SQLCMD es la posibilidad de utilizar variables a la hora de ejecutar scripts; por ejemplo:
24
25
Introduccin Compatibilidad con versiones "mayores" de SQL Server Instancias de nombre para usuarios no-administradores
Introduccin Cmo funciona Consideraciones
Despliegue de la aplicacin
Introduccin
Uno de los objetivos de la versin Express de SQL Server 2005, es simplificar el proceso de despliegue de aplicaciones de bases de datos; a diferencia del resto de versiones de SQL Server (Workgroup, Standard, Enterprise) en el que las bases de datos se cambian de lugar poco o casi nunca, la versin Express est pensada para aplicaciones de bases de datos que requieren en cierto modo que los ficheros de base de datos sean dinmicos. Esta movilidad de los ficheros se consigue durante la fase de depliegue.
26
Cmo funciona
En primer lugar, para habilitar el uso de instancias de usuario, en la cadena de conexin de la aplicacin cliente debers aadir la cadena "User Instance=true". De esta forma se indica a SQL Server Express, que la conexin se realizar sobre una instancia de usuario. En caso de que no existiera la instancia de usuario, SQL Server automticamente, crear la instancia de usuario; consiste en crear una nueva instancia de SQL Server para el usuario requerido, en el que:
Se copiarn las bases de datos de sistema de la instancia por defecto de SQL Server 2005 Express, y Se iniciar otra "copia" del servicio de SQL Server Express; el nombre de la instancia es un valor aleatorio, por ejemplo (2E67C75A-1693-4D), y se debe considerar a la nueva instancia hija de la instancia principal de SQL Server Express.
27
En .NET 2.0, aparece la palabra clave |DataDirectory|, que representa un path relativo a la instalacin de la aplicacin; por ejemplo, distribuimos una aplicacin que admite personalizar la ruta de instalacin, con |DataDirectory| podemos especificar rutas relativas. A su vez, tambin se puede especificar el valor de DataDirectory de la siguiente manera: AppDomain.CurrentDomain.setData(DataDirectory,C:\ruta_por_defecto\);
Consideraciones
Como la instancia de usuario es hija de la instancia SQLEXPRESS, si la instancia SQLEXPRESS no est arrancada, la instancia de usuario no arrancar. Un usuario slo puede tener una instancia de usuario. Las bases de datos de la instancia de usuario se crean en la ruta: \Documents and Settings\nombre_usuario\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS La rplica se deshabilita. La instancia de usuario no admite Autenticacin de SQL Server. Slo se admite la Autenticacin de Windows.
28
Despliegue de la aplicacin
El objetivo principal de las instancias de usuario, es disponer de un fichero de base de datos, que se utiliza en una instancia cuando el usuario necesita acceder a la base de datos. Cuando no se est usando, la base de datos se desadjunta. Qu se consigue con esto? Acercar la base de datos al concepto de base de datos de escritorio (como si fuera Access). De esta forma, el despliegue de la aplicacin relacionada con la base de datos consistir en:
Copiar los binarios de la aplicacin. Copiar el fichero de base de datos. Nota. Fijate que slo hay que copiar el fichero de base de datos; no se necesita adjuntar la base de datos a ninguna instancia de SQL Server, porque la propia aplicacin se encarga de hacerlo por nosotros. Por lo tanto, para desplegar la aplicacin deberemos incluir en la distribucin la copia de la base de datos de la aplicacin. Para ello lo podremos hacer de dos formas: Usar el concepto de XCOPY copiando el contenido del directorio \bin\release de la aplicacin generada en el directorio destino. Usar la nueva tecnologa ClickOnce, cuyo objetivo es facilitar el despliegue de la aplicacin, y a su vez, gestionar las actualizaciones; en el proceso de instalacin, adems de la realizar la propia instalacin, se podr configurar la aplicacin para actualizar automticamente la aplicacin cuando existan nuevas versiones.
29
Contenido
Sin lugar a dudas uno de los mbitos ms importantes de un lenguaje o entorno de programacin es su capacidad de acceso a datos. Prcticamente todas las aplicaciones conllevan la realizacin de accesos a datos. Le gustar saber que la plataforma .NET, y por lo tanto ASP.NET, ofrecen un potente modelo de acceso a fuentes de datos. Se le conoce con el nombre genrico de ADO.NET. Nota: No se deje engaar por el nombre: ADO.NET no tiene casi nada que ver con el anterior ADO utilizado en los tiempos de ActiveX y COM. S, dispone de conexiones, comandos e incluso una clase que recuerda a los Recordset, pero crame cuando le digo que es mejor que se olvide para siempre de todos ellos. Tanto la filosofa de trabajo como la tecnologa son diferentes por completo y es mejor que utilice una estrategia de "ojos limpios" para acercarse correctamente a la nueva tecnologa. Los conocimientos adquiridos en este mdulo le servirn para cualquier tipo de desarrollo con .NET, no slo para aplicaciones Web. Los conceptos explicados son vlidos tambin para cualquier versin de .NET no slo para la 2.0. o o o o o o o o
30
Ver video Leccin 1 (Herramientas instaladas) Ver video Leccin 2 (Instancias de usuario en Visual Basic Express) Ver video Leccin 3 (Acceso a Datos)
Introduccin a ADO.NET
Esta leccin presenta los fundamentos de ADO.NET, su arquitectura y sus principales clases. Una vez que sepamos por donde pisamos pasaremos a estudiar ms a fondo cada uno de los conceptos analizados aqu. o o o o
31
Introduccin a ADO.NET
Como cualquier otro modelo de acceso a datos, ADO.NET es un conjunto de clases relacionadas entre s que estn especializadas en ofrecer toda la funcionalidad que un programador necesita para realizar acceso a datos y manejarlos una vez los ha obtenido. Las clases genricas expuestas por ADO.NET se encuentran bajo el espacio de nombres System.Data. Este espacio de nombres define clases genricas de acceso a datos que posteriormente son extendidas para ofrecer caractersticas y funciones especficas de cada proveedor. El objeto ms importante a la hora de trabajar con el nuevo modelo de acceso a datos es el DataSet. Sin exagerar demasiado podramos calificarlo casi como un motor de datos relacionales en memoria. Aunque hay quien lo asimila a los clsicos Recordsets su funcionalidad va mucho ms all como se ver en breve.
Arquitectura de ADO.NET
El concepto ms importante que hay que tener claro sobre ADO.NET es su modo de funcionar, que se revela claramente al analizar su arquitectura:
32
Figura 4.1.- Arquitectura de ADO.NET Existen dos capas fundamentales dentro de su arquitectura: la capa conectada y la desconectada.
33
34
No se trata de un cdigo optimizado (es ms bien burdo) pero nos ayudar a entender perfectamente el proceso. Los datos los obtendremos de la conocida base de datos de ejemplo Northwind (que viene con todas las versiones de SQL Server). Nota: Para poder escribir cdigo de acceso a datos en nuestro mdulo debemos agregar referencias a los espacios de nombres que contienen las clases que vamos a utilizar. Para ello usamos las dos sentrencias Imports siguientes:
La primera de ellas agrega las clases genricas de acceso a datos (como DataSet) y la siguiente las especficas de SQL Server. Si no lo hacemos recibiremos un error. Lo primero que se debe hacer es instanciar un objeto que represente la conexin a la base de datos. Dado que nos estamos conectando a SQL Server esta conexin ser del tipo SqlConnection. Es lo que se hace en la primera lnea del cdigo anterior. La conexin debe realizarse con un servidor de datos y un esquema de datos concreto. Esto se indica mediante la cadena de conexin (al igual que se haca en ADO tradicional). En este caso la cadena de conexin es la tpica de SQL Server. Cada gestor de datos tiene la suya y hay que construirla de manera adecuada. El entorno de desarrollo Visual Studio 2005 nos ayuda a crearlas como veremos luego. Una vez creado el objeto con el que nos conectaremos hay que definir el comando a lanzar a la base de datos. Para ello se utiliza un objeto SqlCommand. Las propiedades bsicas que hay que establecer para ste son la consulta que se lanzar (propiedad CommandText) y la conexin que se emplear para lanzarla (propiedad Connection) que es lo que se refleja en las lneas 6 y 7. Ahora que ya sabemos cmo nos conectaremos y qu queremos obtener debemos lanzar la consulta y recoger el resultado de alguna manera.
35
La clusula Using
Qu ocurre si se produce un error durante el procesamiento del bucle anterior en el que se trata el DataReader?. La respuesta es que la conexin, que debemos tener abierta durante el procesamiento, no se cerrar pues el cdigo no llega al final. Esto es algo muy grave ya que las conexiones que no se cierran no se pueden reutilizar y por lo tanto puede llegar un momento en que no tengamos conexiones disponibles, lo que limita enormemente la escalabilidad del sistema. Podemos evitar el problema escribiendo:
36
De este modo, con la clusula Finally nos aseguramos que siempre se va a cerrar la conexin. De todos modos escribir este cdigo es algo tedioso sobre todo si queremos que la excepcin se replique y slo metemos la clusula Finally por el hecho de cerrar la conexin. Para facilitar el trabajo VB.NET en .NET 2.0 incluye una clusula especial denominada Using que habilita la destruccin automtica de los objetos a los que se hace referencia. As el cdigo anterior quedara simplemente:
Al terminar la clusula Using (aunque haya un error por medio) se llama de manera automtica al mtodo Dispose del objeto utilizado (en este caso una conexin). Entre otras cosas este mtodo se encarga de cerrar el objeto si estaba abierto, por lo que no nos tendremos que preocupar de este aspecto.
Grupos de registros
Aunque los DataReader se asemejan al funcionamiento de un cursor firehose, en realidad difieren bastante de stos. Imaginemos que conectamos con la base de datos en el ejemplo anterior y, mientras estamos procesando el bucle de los registros, se interrumpe la conexin a la base de datos pr el motivo que sea.
37
Ventajas e inconvenientes
El cdigo anterior, aunque sencillo, es un poco lioso y el uso de los DataReader est algo limitado dada su idiosincrasia (de slo lectura y hacia adelante). Este cdigo es adecuado si no necesitamos almacenar los resultados de la consulta en memoria ni regresar sobre ellos una vez procesados una primjera vez. Tambin es muy til para obtener resultados con miles o millones de registros que queremos tratar secuencialmente pero no almacenar en memoria. Sin embargo para un uso cotidiano se trata de un cdigo muy poco til y complicado de utilizar salvo para cosas muy sencillas. Adems slo hemos utilizado clases de la capa conectada de ADO.NET. Todava debemos aprender a obtener los resultados dentro de un DataSet para su explotacin de manera cmoda. Hay que tender un puente entre ambos mundos (conectado y desconectado): el DataAdapter.
38
Controles de datos
Aparte de la escritura manual de cdigo y el uso directo de objetos de ADO.NET, ASP.NET 2.0 proporciona un nuevo modelo de trabajo declarativo para acceso a datos que nos permite realziar tareas comunes de acceso a datos sin escribir cdigo alguno. ASP.NET 2.0 presenta dos nuevos tipos de controles Web que participan en este modelo declarativo de enlace a datos. Estos controles nos abstraen por completo de las complejidades de manejo de las clases de ADO.NET por un lado, y de las dificultades inherentes al modo de trabajo desconectado de las pginas Web. Equiparan en muchos aspectos el desarrollo web al tradicional desarrollo de aplicaciones de escritorio. Estos controles se encuentran agrupados en el cuadro de herramientas bajo el nombre de "Datos", tal y como se ve en la figura.
Orgenes de datos
Estos controles de datos representan conexiones con diferentes tipos de orgenes de informacin que van desde bases de datos a objetos de negocio. No disponen de apariencia visual pero se arrastran igualmente sobre los formularios Web para trabajar con ellos visualmente y poder usar sus paneles de tareas. Abstraen al programador de las
39
AccessdataSource Esta especializado en trabajar con bases de datos Microsoft Access. ObjectDataSource Se enlaza con objetos de negocio y capas personalizadas de acceso a datos. XmlDataSource Trata datos contenidos en documentos XML.
SiteMapDataSource enlaza con la jerarqua de clases Se expuesta por el modelo de navegacin de sitios de ASP.NET 2.0.
ATENCIN!: El control SqlDataSource sirve para enlazar con cualquier gestor de datos relacional para la que haya proveedor ADO.NET disponible, no slo para enlazar con SQL Server. No se deje despistar por su nombre.
Concurrencia optimista
Durante la configuracin de un origten de datos SQL (luego lo ver en el primer vdeo de esta leccin) una de las opciones avanzadas que se presenta habla de la Concurrencia optimista. La concurrencia optimista evita la actualizacin de registros en el caso de que haya variado cualquiera de sus campos desde que se obtuvieron de la fuente de datos. Este comportamiento puede ser bueno en ciertas ocasiones, cuando queremos preservar los cambios realizados por cualquier usuario. En otras sin embargo no resulta de utilidad y s aade una gran sobrecarga al acceso a datos. Se le denomina concurrencia optimista porque parte de la base de que la posibilidad de coincidencia de dos usuarios sobre el mismo registro es baja y es un caso que apenas se dar. Al caso contrario a la concurrencia optimista se le denomina concurrencia pesimista. Nota: En mi opinin debera llamarse "concurrencia realista" ya que, lo cierto es que si se analiza con detenimiento la posibilidad de conflicto en un sistema grande tiende a ser realmente pequea en la mayora de los casos. Y de todos modos el sobreescribir cierta informacin no suele ser un problema grave salvo cuando hablamos de cuestiones de dinero, facturas y similares.
40
mientras que en un caso de concurrencia pesimista se emplea simplemente la clave primaria del registro para localizarlo:
DELETE FROM [Customers] WHERE [CustomerID] = @original_CustomerID
Es decisin suya qu tipo de actualizacin utilizar pero en la mayor parte de los casos usar seguramente la pesimista que, de hecho, es la que usted utiliza normalmente si escribe las funciones a mano de manera independiente.
41
Contenido
La mayora de aplicaciones comerciales (y principalmente las de gestin) utilizan datos que deben guardarse en algn sitio. Gerenalmente esta informacin se guarda en bases de datos. En ste mdulo, vers cmo crear una base de datos para SQL Server 2005 Express, y crears tablas para guardar la informacin a almacenar; aprenders sobre los tipos de datos que forman las columnas de las tablas, cmo relaciona las tablas, integridad, y cmo realizar consultas sobre las tablas. o o o o o o o o o
Ver video Leccin 1-1 (Objetos bsicos del sistema - Creacin de una base de datos) Ver video Leccin 1-2 (Objetos bsicos del sistema - Creacin de una tabla) Ver video Leccin 1-3 (Objetos bsicos del sistema - Relacionar tablas) Ver video Leccin 1-4 (Objetos bsicos del sistema - Creacin de ndices) Ver video Leccin 2 (Consultas sobre la base de datos)
42
Introduccin
En esta leccin, conocers los conceptos bsicos para crear una base de datos para trabajar con SQL Server 2005 Express; definirs los ficheros de la base de datos y aprenders los modelos de recuperacin que se pueden definir para la base de datos. Despus conocers los tipos de datos que se usarn para definir tablas, definicin de restricciones entre tablas, y para finalizar aprenders los conceptos bsicos de indexacin, y sentencias bsicas para realizar operaciones de consulta y modificacin de datos. o o o o o o o o o o o
Tipos de datos
Tipos de datos numricos Tipos de datos de caracteres Tipos de datos fecha Otros tipos de datos
Crear tablas
Creacin de tablas Propiedad identity en las columnas
Relacionar tablas
Relacionar tablas Otras restricciones (UNIQUE, CHECK, DEFAULT)
43
Creacin de ndices
ndices agrupados Consideraciones ndices no-agrupados Consideraciones
Creacin de base de datos desde SQL Server 2005 Management Studio Express SQL Server Management Studio Express es la herramienta de administracin incluida con SQL Server Express; la herramienta no fu incluida en la primera distribucin de SQL Server Express, y se puede descargar de forma gratuita de la siguiente url: Microsoft SQL Server Management Studio Express - Community Technology Preview (CTP) November 2005: http://www.microsoft.com/downloads/details.aspx?familyid=82afbd59-57a4-455e-a2d61d4c98d40f6e&displaylang=en Para crear una base de datos desde SQL Server 2005 Management Studio, expande la lista de bases de datos, de la lista de instancias de SQL Server 2005 registradas, y selecciona la opcin "New database":
44
Debers rellenar el nombre de base de datos, nombres lgico y fsico de los archivos relacionados, y tamao de los ficheros, as como su crecimiento:
45
Y debers establecer el modo de recuperacin de la base de datos; en la versin Express al crear una base de datos por defecto se establece como recuperacin SIMPLE:
46
Para famializarte con la sintaxis del lenguaje T-SQL, te recomiendo que utilices la opcin de men script (en recuadro verde en las dos imgenes anteriores), que mostrar la instruccin T-SQL correspondiente a las operaciones que has ido configurando en las distintas opciones.
Consideraciones Dependiendo de las necesidades a cubrir del sistema de base de datos a desarrollar, debers configurar los archivos de una forma u otra; por ejemplo, en grandes sistemas llegars a configurar niveles de redundancia de discos (RAID), y repartiras la informacin de las tablas en distintos ficheros. Aunque no est soportado en la versin Express, funcionalidades del producto como Particionado de datos, llegan a ser primordiales, y es un factor a considerar desde el momento de diseo del sistema. Por otro lado, para familiarizarte con SQL Server, recomendara entender las opciones de configuracin de base de datos que aparecen en la pestaa opciones, que aunque no son necesarias para comenza a disear bases de datos SQL Server, si ayudan a comprender un poco el funcionamiento interno de SQL Server (shrink, statistics, etc.):
47
Tipos de datos
Empezaremos por los tipos de datos. Las tablas tienen columnas, y las columnas se definen en base a un tipo de datos; los tipos de datos acotan el tipo y tamao de la informacin que se guardar en una columna. La importancia de la eleccin de los tipos de datos reside en el almacenamiento que ocupa; para varios cientos de filas, el tamao no es tan crucial, pero cuantas ms filas se aadan a la tabla, mayor ser la repercusin en el rendimiendo de las operaciones de E/S. Como veremos, habr tipos de datos en los que habr que seleccionar el tamao, e incluso algunos tendrn la posibilidad de ofrecer tamao variable; vamos a analizar los ms significativos. Tipos de datos numricos Los tipos de datos numricos se utilizan para guardar valores numericos enteros, o decimales. Los dividiremos en dos grandes grupos: enteros, y decimales. Tipos de datos numricos enteros
Tipo de datos bigint Intervalo De -2^63 (-9.223.372.036.854.775.808) a 2^63-1 (9.223.372.036.854.775.807) Almacenamiento
8 bytes
48
Tradicionalmente el tipo de datos ms usado es el int; el tipo de datos bigint apareci en SQL Server 2000, y es la alternativa al tipo de datos int, cuando los valores son muy grandes. Tipos de datos numricos decimales Decimal, numeric Tipo de datos numrico con precisin y escala fijas. decimal[ (p[ ,s] )] y numeric[ (p[ ,s] )] Nmeros de precisin y escala fijas. Cuando se utiliza la precisin mxima, los valores permitidos estn comprendidos entre - 10^38 +1 y 10^38 - 1. Numeric equivale funcionalmente a decimal p (precisin) El nmero total mximo de dgitos decimales que se puede almacenar, tanto a la izquierda como a la derecha del separador decimal. La precisin debe ser un valor comprendido entre 1 y la precisin mxima de 38. La precisin predeterminada es 18. s (escala) El nmero mximo de dgitos decimales que se puede almacenar a la derecha del separador decimal. La escala debe ser un valor comprendido entre 0 y p. Para especificar la escala es necesario haber especificado la precisin. Y la relacin entre precisin y almacenamiento es:
Precisin Almacenamiento -9 10-19 20-28 29-38 13 17
49
float(n), single Tipos de datos numricos y aproximados que se utilizan con datos numricos de coma flotante. Los datos de coma flotante son aproximados; por tanto, no todos los valores del intervalo del tipo de datos se pueden representar con exactitud.
Tipo de datos float Precisin Almacenamiento
De - 1,79E+308 a -2,23E-308, 0 y de 2,23E-308 Depende del valor de n (4 u 8 a 1,79E+308 bytes) De - 3,40E + 38 a -1,18E - 38, 0 y de 1,18E - 38 4 bytes 3,40E + 38
real
Tipos de datos de caracteres Los tipos de datos caracter se puede definir de longitud fija y de longitud variable. Los de longitud fija son char(n) y su tamao lo define el valor que tenga n. Por ejemplo, una columna char(15) ocupa 15 bytes. Los de longitud variable son varchar(n), y su tamao lo define la logitud de la columna guardada; por ejemplo una columna varchar(250), que guarda el valor "columna variable" el almacenamiento que ocupa es 16 bytes. En caso de desear valores Unicode, debers anteponer al tipo de datos la letra n, siendo los tipos nchar, o nvarchar. La principal diferencia con los tipos de datos no-unicode, es que utilizan el doble de bytes. Por ejemplo, el texto "Tutorial", en una columna varchar(100) ocupara 8 bytes, mientras que siendo unicode ocupara 16 bytes.
El tamao de las columnas char, varchar, nchar, nvarchar est limitado a 8000 bytes de almacenamiento; en caso de necesitar mayor longitud puedes usar el tipo de datos varchar(max) o nvarchar(max), que es nuevo en SQL Server 2005.
50
El tipo de datos smalldatetime almacena las fechas y horas del da con menor precisin que datetime. El Database Engine (Motor de base de datos) almacena los valores smalldatetime como dos enteros de 2 bytes. Los dos primeros bytes almacenan el nmero de das despus del 1 de enero de 1900. Los otros dos, almacenan el nmero de minutos desde medianoche. Los valores datetime se redondean con incrementos de 0,000; 0,003 o 0,007 segundos, como se muestra en la siguiente tabla. Otros tipos de datos Se pueden crear tipos definidos de usuario que suele ayudar para unificar el diseo de las tablas; por ejemplo, se puede crear un tipo llamado NIF que corresponde al tipo de datos CHAR(20), y admite valores nulos. CREATE TYPE NIF FROM char(20) NULL
XML La versin 2005 de SQL Server incorpora el tipo de datos nativo XML. El tipo de datos obliga a que el dato sea por lo menos bien formado (well-formed). Adicionalmente, la columna puede asociarse a un esquema XSD. Esta es una caracterstica muy interesante porque cada da se estn guardando ms datos en formato XML, y las aplicaciones cliente tienen que soportar el coste y codificacin de validar el dato a guardar. La otra gran funcionalidad que incorpora el tipo de datos XML es que se puede hacer consultas XPath 2.0 contra la columna XML; adems la columna se puede indexar para optimizar las consultas XPath. Tipos de datos definidos de usuario en .NET La integracin del CLR, permite la posibilidad de definir tipos de datos con cualquier lenguaje .NET; durante el curso no se va a tratar este tema, pero como recomendacin general, slo deberan usarse para definir estructuras complejas; por ejemplo, coordenadas 3D, o 2D, nmeros complejos, etc. nunca para implementar estructuras relacionales.
51
52
En el cuadro marcado en rojo, se aaden cada una de las columnas que forman parte de la tabla a crear; se pone nombre a la columna (debe comenzar por un caracter alfabtico), se selecciona el tipo de datos y precisin (ver leccin anterior para ms informacin), y se establece si la columna aceptar valores nulos o no. En el cuadro de debajo (en color azul), se podrn establecer las propiedades de cada columna de la tabla; se podrn modificar las propiedades vistas anteriormente, si la columna es calculada o no, si tiene propiedad identidad (que veremos ms adelante en el captulo), etc. A la derecha, en el cuadro verde, se podrn establecer propiedades de la tabla; como esquema al que pertenece la tabla, nombre de la tabla, descripcin de la tabla, y grupo de ficheros donde se almacenar la tabla. Adems toda tabla debe tener una columna o conjunto de columnas que identifique de manera nica cada fila de la tabla; para ello selecciona la columna que deseas como clave primaria, y despus de hacer click en el botn derecho del ratn, selecciona "Primary Key" como se muestra en la imagen (tambin se puede hacer sobre el botn marcado en rojo en la imagen):
53
A continuacin, para grabar los cambios, es decir, para generar la tabla, pulsars sobre la zona en color verde de la siguiente imagen, y seleccionars la opcin Save Clientes (que es el nombre de la tabla):
54
Relacionar tablas
Relacionar tablas Las tablas se relacionan entre s; podra decirse que existe informacin de la fila que est guardada en varias tablas. El nexo de unin de las filas es la clave primaria en la tabla padre, y la clave primaria en la tabla hija. Por ejemplo, una relacin entre clientes y pedidos; en la tabla pedidos existir un identificador de cliente que est asociado a un identificador de cliente en la tabla clientes. La informacin estara repartida como sigue:
55
Tabla Pedidos IDPedido IDCliente Importe ... 1200 1300 ... ...
Fijate que el cliente 1 (Julia Herrera), tiene los pedidos del 1 al 3, y el cliente 2 el pedido 4. La informacin la "interpretamos" como si las filas de cliente en "embebiera dentro de la tabla pedidos:
Nuestra interpretacin de la relacin Pedidos-Clientes IDPedido IDCliente Nombre-Cli Apellido-Cli Importe ... Julia Julia Julia Javier Herrera Herrera Herrera Alonso 1200 1300 12000 1000 ... ... ... ...
Visto el esquema, vamos a implementar la tabla Pedidos, definiendo la clave ajena a la tabla clientes. Para ello, despus de haber aadido las columnas que definen la tabla pedidos (ID, IDCliente, y Cantidad), pulsaremos en el botn habilitado para establecer relaciones, o seleccionaremos la opcin "Relationships...":
56
Aparecer una ventana como la que se muestra a continuacin, en la que expandirs la opcin "Tables and columns specifications", y pulsars en el botn encuadrado con bordes azules, para establecer la relacin entre las tablas:
57
Para finalizar pulsa en aceptar, y expandes la opcin "Insert and Update Expecifications", en la que se podr especificar cmo establecer el valor de la columna en caso de que la fila padre haya sido borrada o modificada. En SQL Server 2005, se permiten dos opciones:
No Action. Que indica que no actual, que se deja la columna como estaba. Cascade. Que se realiza la misma operacin que se hizo en la fila de la tabla padre. Set Null. Que establece a nulo el valor de las columnas afectadas. Set Default. Que establece la columna a un valor por defecto.
58
Con un ejemplo se ver ms claro; digamos que se borra el cliente 2 (Javier Alonso); al borrar al cliente, las opciones que acabamos de comentar se activarn, y actuarn segn las hayamos configurado; Veamos como se comportara en cada uno de los casos:
No Action. El pedido se quedara igual, es decir, el pedido nmero 4 se quedara con referencia al cliente 2, que en realidad ya no existe. Cascade. Como se trataba de una operacin de borrado de clientes, al borrar al cliente, tambin se borraran los pedidos asociados al cliente 2; en nuestro ejemplo, el pedido nmero 4, se eliminara. Set Null. Al realizar el borrado, el pedido nmero 4 se quedara con identificador de cliente a un valor nulo; es decir, el pedido seguira existiendo, pero no estara asociado a ningn cliente. Set Default. Se establecera un valor por defecto; en nuestro caso no hemos definido ningn valor por defecto, pero podramos establecer un valor por defecto para identificar los pedidos cuyos clientes han sido eliminados. Todas estas operaciones que hemos realizado desde las herramientas grficas, tambin se pueden hacer con sentencias T-SQL; de hecho, llegar un momento en que tu experiencia ser tan profunda que te resultar ms sencillo realizar gran parte de las operaciones mediane sentencias T-SQL. En concreto, las palabras clave para definir este tipo de sentencias son ALTER TABLE, CREATE TABLE, CONSTRAINT, FOREIGN KEY, PRIMARY KEY.
Otras restricciones (UNIQUE, CHECK, DEFAULT) Adems, existen restricciones que "acotan", limitan, o establecen el valor de una columna en ciertas condiciones. Se llaman restricciones (CONSTRAINTS), y forman parte del estandard SQL-99. Estas restricciones que vamos a ver son: restriccin UNIQUE, restriccin CHECK, y restriccin DEFAULT. Restriccin UNIQUE
59
Restriccin CHECK La restriccin CHECK establece que el valor de la columna se ajuste a ciertas condiciones. Se define para limitar el valor que pueda tener la columna; por ejemplo, se puede definir que la columna Importe sea de un valor positivo mayor que cero. SQL Server, se encargar de "validar" el valor que tendr la columna cuando se intente hacer una modificacin, o insercin de un valor para esa columna. En caso de que el valor no cumpla la restriccin, se generar una excepcin y se cancelar la operacin en curso.
La restriccin CHECK se implementa en T-SQL con la palabra clave CHECK; por ejemplo, si queremos que la columna Cantidad de la tabla Pedidos sea un valor mayor que cero, podriamos ejecutar el siguiente cdigo T-SQL: ALTER TABLE dbo.Pedidos ADD CONSTRAINT RestriccionCantidad CHECK (Cantidad>0).
Restriccin DEFAULT La restriccin DEFAULT establece el valor para una columna cuando no se ha especificado valor en la sentencia de insercin. SQL Server, comprobar si la sentencia de insercin establece un valor para la columna, y en caso negativo, establecer el valor por defecto.
La restriccin DEFAULT se implementa en T-SQL con la palabra clave DEFAULT; por ejemplo, si queremos aadir una columna Importe a la tabla Pedidos, y su valor por defecto sea cero, podriamos ejecutar el siguiente cdigo T-SQL: ALTER TABLE dbo.Pedidos ADD Importe DEFAULT (0).
60
ndices agrupados
Los ndices agrupados, definen el orden en que almacenan las filas de la tabla (nodos hoja/pgina de datos de la imagen anterior). La clave del ndice agrupado es el elemento clave para esta ordenacin; el ndice agrupado se implementa como una estructura de rbol b que ayuda a que la recuperacin de las filas a partir de los valores de las claves del ndice agrupado sea ms rpida. Las pginas de cada nivel del ndice, incluidas las pginas de datos del nivel hoja, se vinculan en una lista con vnculos dobles. Adems, el desplazamiento de un nivel a otro se produce recorriendo los valores de claves. Consideraciones para usar ndices agrupados Columnas selectivas Columnas afectadas en consultas de rangos: BETWEEN, mayor que, menor que, etc. Columnas accedidas "secuencialmente"
61
ndices no-agrupados
Los ndices no agrupados tienen la misma estructura de rbol b que los ndices agrupados, con algunos matices; como hemos visto antes, en los ndices agrupados, en el ltimo nivel del ndice (nivel de hoja) estn los datos; en los ndices no-agrupados, en el nivel de hoja del ndice, hay un puntero a la localizacin fsica de la fila correspondiente en el ndice agrupado. Adems, la ordenacin de las filas del ndice est construida en base a la(s) columna(s) indexadas, lo cual no quiere decir (a diferencia de los ndices agrupados), que la organizacin fsica de las pginas de datos corresponda con el ndice. Consideraciones para usar ndices agrupados Columnas con datos muy selectivos Consultas que no devuelven muchas filas. Columnas en WHERE. Evitar acceso a pginas de datos realizando el acceso slo por el ndice.
62
Introduccin
En esta leccin, conocers los conceptos bsicos para poder realizar consultas y modificaciones sobre la base de datos. La leccin se dividir en dos partes: cmo realizar consultas de seleccin, y cmo realizar consultas de modificacin. Durante la primera parte de la leccin se introducirn distintas clausulas que a pesar de estar en la seccin de consultas de seleccin, tambin sern vlidas para sentencias de modificacin; por ejemplo, dentro de una operacin de borrado se podrn usar clusulas JOIN, WHERE, TOP, etc. o o o o o o o o o
Consultas de seleccin
Seleccin de columnas y clasula FROM Clausula WHERE Clausula JOIN Clausula GROUP BY Clausula TOP Expresiones de tablas comunes (CTE)
Consultas de modificacin
Sentencia INSERT Sentencia UPDATE Sentencia DELETE
63
Seleccin de columnas y clasula FROM Usando la clasula FROM cuales son las tablas, vistas, funciones, tablas derivadas o expresiones de tablas comunes que se utilizan en la instruccin SELECT. A su vez, se deber indicar las columnas a recuperar de la consulta. Si se quiere recuperar todas las columnas se puede usar el comod * (astersco), aunque deberemos ser cuidadosos con ello.
Como recomendacin, debers intentar ser lo ms selectivo posible en las columnas a incluir en la clasula SELECT. Por qu razn? Recuerdas la estructura de los ndices? Si deseamos todas las columnas de una tabla, estaremos "forzando" a SQL Server a acceder al nivel de datos de las pginas (recuerda: abajo del todo), y estaremos limitando la efectividad de los ndices diseados en las tablas. El contrapunto de ste comentario es la parte de desarrollo, si generamos cdigo "genrico" que recupera todas las columnas porque las columnas sern necesarias unas veces si y otras no, estaremos penalizando el rendimiento del servidor SQL Server Express pero estaremos ganando tiempo de desarrollo...
Para ejecutar una consulta desde SQL Server 2005 Management Studio Express, conectaremos a la base de datos DemoMSDN, desde una de las opciones marcada en la siguiente imagen en recuadro rojo:
64
A continuacin debers escribir el siguiente texto para rellenar unas cuantas filas en la tabla clientes (veremos luego la sentencia INSERT):
INSERT Clientes SELECT 'Julia Herrera', 'Alicante'; INSERT Clientes SELECT 'Javier lvarez', 'Madrid';
Para ello, copia el texto en la ventana de texto, y pulsa F5, o el botn Execute para ejecutar la sentencia. Borra el texto de la sentencia, y escribe el siguiente texto:
SELECT Id AS Identificador, Nombre FROM Clientes;
Ejecuta la instruccin y vers como resultado todas las filas de la tabla Clientes. Fjate que la columna de base de datos Id, ahora parece que se llama Identificador. Esto es un alias de columna; habr ocasiones en las que necesites personalizar el nombre de columna que se muestra. Desde Management Studio, tambin se puede ver la informacin de la tabla de forma similar a como se presenta en Access; para ello, debers seleccionar la tabla que quieres editar, botn derecho del ratn, y elegir la opcin "Open Table" como aparece en la siguiente imagen:
65
66
Clasula WHERE La clasula WHERE se utiliza para aplicar filtros al conjunto de resultados; para ello existen operadores lgicos AND, OR, NOT, EXISTS con los condicionantes <, >, =, y BETWEEN. No hay lmite para el nmero de condiciones a establecer. El orden de prioridad de los operadores lgicos es NOT, seguido de AND y OR. Se pueden utilizar parntesis para suplantar esta prioridad en una condicin de bsqueda. El orden de evaluacin de los operadores lgicos puede variar dependiendo de las opciones elegidas por el optimizador de consultas
Para ms informacin sobre los operadores lgicos, debes consulta la ayuda on-line del producto: http://msdn2.microsoft.com/es-es/library/ms203721(sql.90).aspx
Clasula JOIN Cuando se necesita recuperar informacin de ms de una tabla, se suele especificar cuales son las filas coincidentes entre ambas tablas (columnas Clave Ajena / Clave Primaria que vimos en la leccin anterior). Para ello, hay una serie de operadores que condicionan dicho filtro. INNER JOIN Especifica que se devuelvan todos los pares de filas coincidentes. Las filas no coincidentes se descartan
67
Clasula GROUP BY El lenguaje T-SQL permite devolver la informacin agregada usando la clasula GROUP BY; los condicionantes de la agregacin se colocan despus de la clasula. Existen las siguientes funciones de agregado: AVG, MIN, CHECKSUM, SUM, CHECKSUM_AGG, STDEV, COUNT, STDEVP, COUNT_BIG, VAR, GROUPING, VARP, MAX. Por ejemplo, la siguiente sentencia T-SQL devolvera la cantidad de productos pedidos por cliente en la base de datos MSDN:
SELECT Id, COUNT(*) AS Cantidad FROM Pedidos GROUP BY Id
68
Clasula TOP (n) [PERCENT] Cuando se necesita recuperar los n primeros elementos que cumplen una condicin, se puede utilizar la funcin TOP. La funcin TOP tiene un argumento que puede representar un nmero o un porcentaje.
La nica forma de garantizar que la sentencia TOP devuelva los n primeros elementos que cumplen una condicin es usando la clausula ORDER BY. Adems, SQL Server 2005, incorpora nuevas funciones de RANKING que devuelven posiciones relativas de las filas; las funciones son RANK, DENSERANK, TILE , y NTILE.
Expresiones de tablas comunes (CTE) Las expresiones de tablas comunes son una de las novedades en el lenguage T-SQL en la versin 2005; representan un conjunto temporal de datos, al que se puede hacer referencia varias veces en la sentencia en la que est incluida. Su mbito es la sentencia en la que se ejecuta, y puede utilizarse en sentencias SELECT, INSERT, UPDATE, y DELETE. Adems, tambin puede ser incluida en procedimientos almacenados, y en la definicin de vistas. Su sintaxis es:
[ WITH <common_table_expression> [ ,...n ] ] <common_table_expression> ::= expression_name [ ( column_name [ ,...n ] ) ] AS ( CTE_query_definition )
Consultas de modificacin
Sentencia INSERT La sentencia INSERT, inserta filas en una tabla; tiene dos formatos: INSERT INTO <tabla> VALUES ( <lista de columnas> ) En la que se insertan la lista de valores en una tabla; corresponde a una insercin de una fila en la tabla.
69
Sentencia UPDATE, y DELETE La sentencia UPDATE/DELETE, actualizan/borran filas de una tabla. Normalmente se le aplican filtros a la sentencia para que filtre las filas que se van a modificar. Se puede hacer la operacin UPDATE/DELETE de dos formas, que explicaremos con un ejemplo: DELETE Sales.SalesOrderDetail WHERE SalesOrderID = 3443 En el que se borran las filas de la tabla Sales.SalesOrderDetail cuyo identificador es el 3443. La otra posibilidad es hacer la operacin con un JOIN (no todos los gestores de bases de datos lo permiten); el ejemplo sera el siguiente:
UPDATE t SET AcumuladoImporte = t2.SumaImporte FROM TablaAcumulados t INNER JOIN ( SELECT Pedidos.Id, SUM (LineasPedido.Importe) AS SumaImporte FROM Pedidos JOIN LineasPedido ON Pedidos.Id = LineasPedido.Id Pedidos.Fecha BETWEEN '20050101' AND '20060101' GROUP BY Pedidos.Id ) t2 ON t.Id = t2.Id WHERE Fecha BETWEEN '20050101' AND '20060101'
Para leer esta consulta es mejor que empiezes por el final; mira la consulta que representa el alias t2: obtiene los en importe total de cada pedido del ao 2005. A continuacin, ese resultado se va a cruzar (JOIN) con la tabla TablaAcumulados para actualizar la columna AcumuladoPedidos, reemplazandolo por el valor de SumaImporte de la consulta anterior. Antes de aplicarlo, deber acotar la actualizacin a los pedidos realizados en el ao 2005.
70
Contenido
En el siguiente mdulo vamos a ver cmo utilizar y programar objetos dentro de la base de datos; veremos cmo utilizar procedimientos almacenados, y algunas justificaciones para su uso, veremos como utilizar triggers, y veremos una funcionalidad que fu introducida en la versin 2000 de SQL Server que son las funciones definidas de usuario. o o o o o o o o o o o o
Leccin 2: Triggers
Introduccin Triggers DML: INSTEAD OF Triggers DML: AFTER Triggers DDL: a nivel de base de datos Triggers DDL: a nivel de servidor
71
1 (Procedimientos almacenados) 2-1 (Triggers: Triggers DML) 2-2 (Triggers: Triggers DDL) 3-1 (Funciones definidas de usuario)
Introduccin Crear procedimientos almacenados Ejecutar procedimientos almacenados Argumentos en procedimientos almacenados
Introduccin
Los procedimientos almacenados (stored procedures) no son mas que una sucesion ordenada de instrucciones T-SQL que pueden recibir y devolver parametros provistos por el usuario y se pueden guardar en el servidor con un nombre, para luego poder invocarlos y ejecutarlos. En esta nueva versin (2005), tambien es posible utiliza procedimientos almacenados usando CLR. Un procedimiento almacenado CLR es una referencia a un mtodo de un ensamle de .NET Framework que puede aceptar y devolver parmetros suministrados por el usuario. Algunas de las ventajas de usar procedimientos almacenados Compilacin: La primera vez que se invoca un procedimiento almacenado, el motor lo compila y a partir de ah, se sigue usando la version compilada del mismo, hasta que se modifique o se reinicie el servicio de SQL. Esto hace que que tengan un mejor rendimiento que las consultas directas que usan cadenas con instrucciones T-SQL, que el motor compila cada vez que se invoca.
72
Si el procedimiento almacenado ya existe se debe usar la instruccin ALTER PROCEDURE, de la misma manera que si se estuviera creando. En el ejemplo, el stored procedure devuelve todos los registros de la tabla Clientes.
La creacin de procedimientos almacenados basados en .NET Framework lo veremos en la leccin 4 del mdulo 4 (Conceptos avanzados -- Integracin del CLR).
73
Y cmo se hara la llamada desde una aplicacin .NET?; para ello deberemos definir un objeto conexin que conecta a la base de datos, y un objeto command que ejecute el comando:
'Creamos una nueva conexion. Dim myConn As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=(localhost)\SQLEXPRESS;Initial Catalog=DemoMSDN;Integrated Security=True") 'Creamos un nuevo comando Dim myComm As SqlClient.SqlCommand = New SqlClient.SqlCommand() 'Le asignamos la conexion. myComm.Connection = myConn 'especificamos que el comando es un stored procedure myComm.CommandType = CommandType.StoredProcedure 'y escribimos el nombre del stored procedure a invocar myComm.CommandText = "Clientes_GetAll" 'Creamos un nuevo DataAdapter con nuestro comando. Dim myDA As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(myComm) 'Creamos un dataset para soportar los datos devueltos por el stored procedure Dim ClientesDs As DataSet = New DataSet 'Pedimos al Data Adapter que llene el dataset (Esto llama a nuestro comando) myDA.Fill(ClientesDs) 'Y lo mostramos por pantalla For Each row As Data.DataRow In ClientesDs.Tables(0).Rows Console.WriteLine(row!Id.ToString() + " " + row!Nombre) Next
74
Desde ADO.NET
'Creamos una nueva conexion. Dim myConn As SqlClient.SqlConnection = New SqlClient.SqlConnection("Data Source=(localhost)\SQLEXPRESS;Initial Catalog=DemoMSDN;Integrated Security=True") 'Creamos un nuevo comando Dim myComm As SqlClient.SqlCommand = New SqlClient.SqlCommand() 'Le asignamos la conexion. myComm.Connection = myConn 'especificamos que el comando es un stored procedure myComm.CommandType = CommandType.StoredProcedure 'y escribimos el nombre del stored procedure a invocar myComm.CommandText = "Clientes_GetOne" 'Creamos un nuevo parametro Dim myParam As SqlClient.SqlParameter = New SqlClient.SqlParameter() myParam.ParameterName = "@Id" myParam.SqlDbType = SqlDbType.Int myParam.Value = 4 'Y se lo agregamos a la coleccion de parametros del comando myComm.Parameters.Add(myParam) 'Creamos un nuevo DataAdapter con nuestro comando. Dim myDA As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(myComm) 'Creamos un dataset para soportar los datos devueltos por el stored procedure Dim ClientesDs As DataSet = New DataSet 'Pedimos al Data Adapter que llene el dataset (Esto llama a nuestro comando) myDA.Fill(ClientesDs) 'Y lo mostramos por pantalla For Each row As Data.DataRow In ClientesDs.Tables(0).Rows Console.WriteLine(row!Id.ToString() + " " + row!Nombre) Next
75
Introduccin Triggers DML: INSTEAD OF Triggers DML: AFTER Triggers DDL: a nivel de base de datos Triggers DDL: a nivel de servidor
Introduccin
Los TRIGGERS o disparadores son muy similares en su concepto a los procedimientos almacenados, es decir son piezas de cdigo Transact-SQL, sin embargo son radicalmente distintas en la ejecucin, mientras un procedimiento almacenado se ejecuta por la peticin de un cliente, un TRIGGER responde a un evento, ya sea de manipulacin de datos como los TRIGGERS DML o por la manipulacin de esquemas como los TRIGGERS DDL. Los TRIGGERS son un tipo de objetos muy especiales en SQL Server 2005, ya que realmente son muy parecidos a lo que las rutinas de atencin a eventos en cdigo en cualquier lenguaje de programacin como por ejemplo .NET. Como objetos especiales que son tambin reciben parmetros de una forma muy especial, en forma de unas tablas virtuales, llamadas inserted y deleted. Estas tablas especiales (inserted y deleted) contienen la informacin de los registros que se han eliminado o insertado, con exactamente las mismas columnas que la tabla base que est sufriendo esa modificacin. Las tablas inserted y deleted estarn o no rellenas de datos en funcin de cual sea el tipo de operacin que ha dado lugar a su ejecucin. Por ejemplo, un TRIGGER que se dispare por la insercin en una tabla tendr tantos registros en la tabla virtual inserted como registros estn siendo insertados y cero registros en la tabla deleted; un TRIGGER que se dispare por la eliminacin de registros en una tabla tendr cero registros en la tabla inserted y tantos registros en la tabla deleted como registros estn siendo eliminados, y un TRIGGER que responda a una operacin de update, tendr el mismo nmero de registros en la tabla inserted y en la tabla deleted que adems coincidir con el nmero de registros actualizados
76
77
Veamos algunas particularidades sobre el cdigo del TRIGGER, la clusula UPDATE, permite comprobar si se est actualizando una columna en particular, de esta forma nuestro TRIGGER resultar inocuo para el resto de operaciones de actualizacin. En la segunda parte se comprueba que el cliente tenga recibos pendientes con una clusula EXISTS y con una clusula in. La clusula IN permite comprobar que el cdigo de cliente est en la lista de cdigos de cliente borrados (todos ellos), la clusula EXISTS permite comprobar si existen recibos pendientes en esos clientes.
78
Aunque hay muchos ms, relacionados con estadsticas, sinnimos, usuarios (no confundir con logins que son a nivel de servidor), procedimientos, etc. Puede consultar los libros en pantalla de SQL Server 2005 para obtener una relacin completa de todos los eventos a los que puede responder. Los TRIGGERS DDL tiene una particularidad adicional sobre los de tipo DML y es que no tiene mucho sentido las tablas inserted y deleted ya que el tipo de operaciones que disparan los triggers son radicalmente diferentes. Sin embargo, como ellos necesitan recibir informacin acerca del evento que ha ocasionado que el trigger se dispare, para ello existe la funcin EVENTDATA(), esta funcin devuelve un valor XML que responde al siguiente esquema:
<EVENT_INSTANCE> <EventType>type</EventType> <PostTime>date-time</PostTime> <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>
79
Si lo miramos en detalle tan solo estamos obteniendo el nombre del objeto que se ha insertado (en nuestro caso la tabla que se acaba de crear) y estamos comprobando que existe un registro con ese nombre en la tabla TablasDocumentadas, sin embargo este procedimiento podra tener mucha ms complejidad y garantizar no solamente que existe sino que los datos que contiene esa tabla son de cierta calidad.
80
La clusula ON en la instruccin CREATE TRIGGER indica el alcance al que el trigger afectar, ALL SERVER o bien DATABASE, el comando que se sita detrs de FOR, en el ejemplo DDL_LOGIN_EVENTS puede indicar un evento o un grupo de eventos a los que se responder, en nuestro caso es un grupo de eventos, en concreto todos los relacionados con LOGIN.
Introduccin
Una herramienta adicional dentro de la programacin de base de datos son las funciones definidas por el usuario. Estas funciones, que pueden ser de tres tipos, reciben parmetros como los procedimientos almacenados, y adems pueden ser usadas como valores escalares o como tablas dentro de clusulas from, lo que las hace tremendamente tiles en determinadas circunstancias.
81
De esta forma podemos parametrizar consultas que vamos a usar en clusulas FROM, de esta forma escribir cdigo T-SQL resulta ms sencillo y el resultado es ms comprensible. Si adems combinamos esta funcionalidad con las nuevas funciones APPLY podemos obtener funcionalidades an ms
82
Esta consulta devolver todos los registros de la tabla Clientes Seleccionados y los regritros de la vista ClientesPortipo para cada Tipo de la tabla primaria.
83
Contenido
En este mdulo se vern las novedades relativas a seguridad en SQL Server 2005 Express; adems daremos un repaso por los niveles de aislamiento, y conoceremos en qu consiste el nuevo nivel de aislamiento de instantanea introducido en esta nueva versin. Para finalizar el curso, veremos dos novedades importantes: el soporte nativo de XML, y la integracin del CLR en SQL Server. En qu consiste la integracin del CLR? Pues bsicamente que desde la versin 2005, se pueden crear objetos tales como procedimientos almacenados, funciones, etc. con un lenguage orientado a objetos como VB.NET, o C#. br/> o o
Leccin 1: Seguridad
Seleccionar un Modo de Autenticacin Proporcionar acceso a una Base de Datos Inicios de Sesin Usuarios Esquemas de Base de Datos
84
o o
Introduccin
La Arquitectura de seguridad es uno de los aspectos que ms cambios ha sufrido y en el que ms mejoras se han introducido en SQL Server 2005. En el presente apartado veremos los aspectos bsicos de seguridad que ser necesario tener en cuenta a la hora de acceder a una base de datos SQL Server Express.
85
Nota: Para que este cambio surta efecto debers de reiniciar el servicio de SQL Server.
86
En este ejemplo EXPRESS hace referencia al nombre de Dominio o Equipo en el que est instalado SQL Server Express y Usuario hace referencia a un usuario de Sistema Operativo.
Nota: Para que el anterior ejemplo funcione correctamente es necesario que el usuario Usuario exista a nivel de Sistema Operativo. Para crear un Inicio de Sesin SQL Server: CREATE LOGIN SQLUser WITH PASSWORD='Pa$$w0rd'
Tambin podemos utilizar SQL Server Management Studio Express. En Object Explorer, despliega la Instancia, despliega la carpeta de Security y haz clic en Logins. Si haces clic con botn de la derecha, New Login En la figura puedes ver el cuadro de dilogo.
87
Desde SQL Management Studio podemos realizar esta operacin de de formas. Desde las Propiedades del Inicio de Sesin o en la base de datos, creando un usuario. LA forma ms sencilla es realizarlo desde las propiedades del Inicio de Sesin. Para ello en las propiedades de un Inicio de Sesin vete a la opcin de User Mapping y selecciona las bases de datos a las que quieres proporcionar acceso. La siguiente figura muestra dicha opcin:
88
89
Nota: Para ejecutar este ejemplo, la instancia de SQL Server Express debe de estar ejecutndose en modo Autenticacin Mixta.
Introduccin
o o o o
90
Introduccin
Cuando trabajamos con bases de datos tenemos que tener en cuenta que no estamos solos, es decir hay ms usuarios accediendo a los mismos datos, y manipulando los mismos datos. Esta concurrencia ha de ser administrada por los sistemas gestores de base de datos, dotando a las bases de datos de las cuatro caractersticas ACID, es decir Atomicidad, dentro de una transaccin las operaciones que se realizan deben poder considerarse como una sola; C. Consistencia, cualquier operacin que sea validada o cancelada no puede dejar datos inconsistentes (por ejemplo violando reglas de integridad referencial). I (Isolation en ingls) Aislamiento, El gestor de la base de datos debe aislar los datos 'sucios' para evitar que otros usuarios usen informacin no confirmada o validada. D. Durabilidad, los datos confirmados no pueden perderse.
Niveles de aislamiento
Si nos detenemos en la definicin de aislamiento podemos observar que no es muy concreta, es decir que da lugar a distintas interpretaciones o implementaciones de ese aislamiento. Esos niveles y exactamente lo que significa el aislamiento es lo que vamos a tratar en los siguientes apartados.
READ UNCOMMITED Lecturas no confirmadas, realmente lo que sucede en este nivel de aislamiento es que los usuarios pueden leer datos que an no estn confirmados, y que por tanto pueden llegar a no existir nunca. Los problemas que presenta este nivel de aislamiento son los siguientes:
Lecturas sucias: Lee datos que no han llegado a validarse. Lecturas no repetibles: Dos sentencias SELECT iguales y consecutivas podran devolver datos diferentes. Datos fantasma: En dos sentencias SELECT iguales y consecutivas podran aparecer y desaparecer filas.
Hay que ser muy cuidadoso si se utiliza este nivel de aislamiento ya que podra hacer que los usuarios se basen en datos que realmente no han existido nunca y que por tanto son errneos. En muchas ocasiones se usa para evitar bloqueos, si as lo hacemos hemos de estar seguros que las consecuencias son admisibles. READ COMMITED Lecturas confirmadas, este es el nivel de aislamiento por defecto en SQL Server, no lee datos que no estn confirmados, sino que esperara (se quedara bloqueado) a que esos datos estn confirmados. Los bloqueos que establece mientras se lee informacin, tan solo permanecen activos durante el tiempo de la ejecucin no durante toda la transaccin y no se ve bloqueado por lecturas. Los problemas que tiene este nivel de aislamiento son:
Lecturas no repetibles: Dos sentencias SELECT iguales y consecutivas podran devolver datos diferentes. Datos fantasma: En dos sentencias SELECT iguales y consecutivas podran aparecer y desaparecer filas.
91
En este nivel de aislamiento las lecturas solo se ven bloqueadas por las escrituras, pero las escrituras se ven bloqueadas por lecturas durante el tiempo que dura la transaccin que lee de tal forma que es ms frecuente encontrar problemas de bloqueos. SERIALIZABLE Serializable. Este nivel de aislamiento no tiene ni siquiera el problema de datos fantasma, por que cuando realiza un select crea bloqueos compartidos no solamente sobre los registros que existen sino sobre los nuevos que pudiesen llegar (inserts) de tal forma que dos instrucciones select consecutivas dentro de la misma transaccin devolvern exactamente los mismos datos. En muchas ocasiones los desarrolladores eligen este nivel por que es lo ms parecido a estar solo en el sistema, sin embargo este nivel de aislamiento necesita crear un nmero considerable de bloqueos para poder garantizar estas lecturas repetibles evitando datos fantasma. En este nivel de aislamiento las lecturas solo se ven bloqueadas por las escrituras, pero las escrituras se ven bloqueadas por lecturas incluso escrituras de tipo INSERT que en el nivel de aislamiento REPEATABLE READ no se veran afectas. Este es el nivel mximo de aislamiento y tambin genera el nivel mximo de bloqueos, analice si realmente necesita estas caractersticas antes de usarlo.
92
Introduccin
SQL 2005 aporta el nuevo tipo de datos XML nativo; ste nuevo tipo de datos puede formar parte de columnas de una tabla, ser una variable, o ser argumento de un procedimiento almacenado; antes de seguir adelante, debers quitarte la idea de que por el hecho de que el XML se represente como una cadena de caracteres, internamente vaya ser guardado como texto: SQL Server 2005 lo guardar internamente en formato binario, siendo su acceso ms efectivo y teniendo la posibilidad de definir la estructura de los datos de manera ms eficiente. Por qu esto? Parece que no est de acuerdo con W3C? Pues no es as W3C se encarga de definir la estructura del lenguaje XML, no la estructura de su almacenamiento. o o o o
ndices XML
ndice Primario ndice Secundario
93
XQuery
Estas dos inserciones se han realizado correctamente porque el valor de lacolumna XML est bien formado; sin embargo, si intentas insertar la siguiente fila:
-- error en columna XML insert EjemploXML values ( 3, '<pedido cliente="1"> 2</pedidos>' )
Mostrando el error que se muestra a continuacin que indica que el XML no est bien formado; fjate que el elemento pedido no est cerrado (se intenta cerrar con un elemento pedidos:
Msg 9436, Level 16, State 1, Line 2 XML parsing: line 1, character 31, end tag does not match start tag
94
Parte del beneficio de usar columna XML nativa, es que la aplicacin cliente no necesitar parsear el dato XML con los correspondientes objetos de .NET Framework, porque forma parte del proceso de insercin del dato. Fjate en el error anterior: el servidor devuelve una excepcin a la aplicacin cliente que tendr que ser gestionado de la manera adecuada.
En cuanto al almacenamiento del dato, en comparacin a guardarlo como texto "plano", la columna XML nativa sin asociacin a esquema XML, el espacio utilizado es menor porque slo se guardar una ocurrencia del valor de la etiqueta (o atributo) por cada fila; por ejemplo, si un atributo se llama Pedidos_Realizados_Por_Cliente, el coste de almacenamiento de guardar esa clave ser mayor cuanto mayor sea la clave. SQL Server guardar la clave una vez en la fila, y para el resto de ocurrencias en la misma fila, en lugar del valor de la clave se usar un puntero a la posicin donde est almacenada la clave.
En el siguiente punto veremos la diferencia entre asociar la columna a un esquema XML o no.
XML Nativo con Esquemas Asociar un esquema XML a la columna de tipo XML aporta la posibilidad de hacer ms "restrictiva" la validacin de la columna XML. Un buen ejemplo para aplicar con este modelo de esquema-columnaXML es la comunicacin que realizan clientes y proveedores a travs de un modelo de documentos XML estandarizados: ambas partes conocen el modelo, y basandose en dicho modelo realizan la gesin de la del proceso definido.
Aqu aparece un punto discrepante entre el modelo relacional y el modelo XML; si se es capaz de modelar un proceso, es muy posible que se pueda definir un modelo relacional que lo cumpla: SQL Server es un servidor de bases de datos relacionales, y te encontrars con casos que a pesar de poder implementar el esquema relacional, debido a la complejidad del modelo, haya partes que deban implementarse siguiendo un esquema XML; por ejemplo, XML es muy eficiente gestionano jerarquas, mientras que SQL Server, acaba de introducirlas con las Expresiones de Tablas Comunes.
95
Fjate que el esquema define la estructura de cmo ser el documento XML; llega hasta tal nivel de detalle que especifica, el nmero de ocurrencias que deber tener cada atributo, los nombres de los atributos, y elementos, e incluso los tipos de datos de cada uno de ellos. Y a continuacin se crea una tabla que use el esquema recin creado:
CREATE TABLE dbo.EjemploEsquema ( Pedido xml (schema1) )
Fjate que en el tipo de datos que se define para la columna Pedido, se especifica el esquema XML creado anteriormente. A partir de este momento, se podrn insertar filas en la tabla, haciendo referencia al esquema XML asociado al documento:
INSERT INTO dbo.EjemploEsquema ( Pedido ) VALUES ( '<?xml version="1.0" ?> <Pedido xmlns="http://schemas.mi_base.com/schema1"> <Numero>2231-AX</Numero> <Cliente>Microsoft</Cliente> <Importe>250</Importe> </Pedido>'); INSERT INTO dbo.EjemploEsquema ( Pedido ) VALUES ( '<?xml version="1.0" ?> <Pedido xmlns="http://schemas.mi_base.com/schema1"> <Numero>3533-SQ</Numero> <Cliente>Solid Quality Learning</Cliente> <Importe>750</Importe> </Pedido>');
De forma similar a como hemos visto anteriormente, si intentamos insertar un importe que no es nmero entero (por ejemplo un caracter, o un valor numrico):
INSERT INTO dbo.EjemploEsquema ( Pedido ) VALUES ( '<?xml version="1.0" ?> <Pedido xmlns="http://schemas.mi_base.com/schema1"> <Numero>3533-SQ</Numero> <Cliente>Solid Quality Learning Iberoamericana</Cliente> <Importe>750AA</Importe> </Pedido>');
La insercin no se realizar, y adems obtendremos el siguiente mensaje de error, que nos indica que el valor 750aa no es un tipo de datos vlido para el elemento Importe:
96
Lo mismo suceder si se intenta insertar un XML cuyo esquema no se ajusta al definido. Por ejemplo, qu pasara si el documento XML tuviera un elemento llamado fecha?:
INSERT INTO dbo.EjemploEsquema ( Pedido ) VALUES ( '<?xml version="1.0" ?> <Pedido xmlns="http://schemas.mi_base.com/schema1"> <Numero>3538-SQ</Numero> <Cliente>Solid Quality Learning Iberoamericana</Cliente> <Importe>750</Importe> <FechaPedido>2006-07-25</FechaPedido> </Pedido>');
Aunque el XML est bien formado (fijate que el elemento FechaPedido est correctamente definido), obtendremos la siguiente excepcin indicando que el elemento FechaPedido no se esperaba en el XML:
Msg 6923, Level 16, State 1, Line 2 XML Validation: Unexpected element(s): http://schemas.mi_base.com/schema1:FechaPedido. Location: /*:Pedido[1]/*:FechaPedido[1] Desde el punto de vista de almacenamiento, el uso de esquemas XML, ayuda a SQL Server a no tener que almacenar en las columnas donde se almacenan los datos informacin relativa a los atributos, y elementos del dato XML porque dicha informacin se encuentra en el esquema XML.
ndices XML
Las columnas XML pueden indexarse para optimizar el acceso a las columnas XML, y mejorar el rendimiento de las consultas XQuery que veremos a continuacin.
Para resolver consultas XQuery, si no existe ndice XML, SQL Server, tiene que crear la estructura jerrquica la columna XML en memoria de cada columna, mientras que si est indexado, dicha estructura jerrquica se encuentra ya serializada en el ndice, por lo que no ser necesaria dicha "jerarquizacin" en memoria, con el consiguiente ahorro de uso de CPU.
Para poder indexar columnas XML, por diseo, es necesario que la tabla tenga definida un ndice agrupado por la clave primaria de la tabla; ste requerimiento se debe a que en caso de que la tabla se encuentra particionada (consultar particionado de datos en la documentacin del producto), el ndice primario XML se pueda particionar usando el mismo esquema y funcin de particionado. Para definir el ndice XML primario, en la tabla EjemploEsquema aadiremos una columna entera con la propiedad identity, que haremos clave primaria, sobre la que definiremos el ndice agrupado:
ALTER TABLE dbo.EjemploEsquema ADD identificador int IDENTITY GO
97
ndice Primario El ndice primario XML indexa la columna XML manteniendo referencias al dato XML, y al ndice agrupado (el que indica la posicin de la fila de datos). Para ello, usaremos la sentencia CREATE INDEX como en el siguiente ejemplo:
CREATE PRIMARY XML INDEX xml_index_EjemploEsquema on dbo.EjemploEsquema (Pedido) GO
Una vez creado el ndice primario XML, el ndice agrupado (el que hemos creado para la clave primaria), no podr modificarse; en caso de necesitar cambiar el ndice agrupado, ser necesario borrar antes los ndices XML.
Una columna XML no puede formar parte de un ndice "normal" (los tradicionales ndices agrupado, no agrupado). Adems, si la columna XML forma parte de una vista, no se podr indexar la columna XML, es decir, las vistas indexadas no soportan ndices XML
ndice Secundario Los ndices secundarios XML requieren que se haya creado un ndice primario XML. ste tpo de ndices se definen para optimizar tipos de consultas XQuery; el ndice XML secundario se definir para optimizar tipos de consultas concretos:
VALUE: cuando la consulta XQuery hace referencia a cualquier elemento del nodo; por ejemplo, //Cliente=Microsoft: este caso devolvera todos los elementos cuyo autor sea Jos Antonio, independientemente de que sea hijo de artculo u otro elemento. PATH: beneficiar consultas XQuery que usan consultas tipo que buscan por el path del XML, por ejemplo, /Pedido[Cliente=Solid Quality Learning] PROPERTY: cuando se accede a propiedades del primer elemento de un nodo XML; por ejemplo /Pedido/@Fecha
Por ejemplo, si queremos definir un ndice secundario para optimizar las consultas XQuery que busquen valor de los ele
CREATE XML INDEX Path_EjemploEsquema_xml_index ON dbo.EjemploEsquema(Pedido) USING XML INDEX xml_index_EjemploEsquema FOR PATH GO
98
99
o o o o
Introduccin Beneficios Cuando usar cada modelo Modelo de seguridad Qu se puede crear Creacin y uso de objetos CLR en la base de datos
Creacin del cdigo .NET Insercin del assembly en la base de datos Creacin del objeto Llamada al objeto
100
Otras implementaciones
Introduccin
Una de las novedades ms sonadas de SQL Server 2005 (tambin incluida en la versin Express) es la integracin de .NET Framework en el gestor de bases de datos, en otras palabras, la posibilidad de implementar cdigo manejado con cualquier lenguaje .NET (VB.NET, C#, J#, ...) dentro del servidor. Con esta nueva caracterstica habr dos tipos de reacciones "inconscientes" dependiendo del perfil del profesional: Desarrollador: Qu bien!! por fin podr crear esas rutinas de acceso a base de datos, y procesos complejos dentro del servidor :-) Administrador de bases de datos: Madre mia, la que se me viene encima!! Me van a meter procesos increiblemente complejos dentro del servidor, y no va haber manera de dar soporte a cientos de conexiones concurrentes de usuario :-( La integracin del .NET Framework, ha creado una polmica que se resuelve con una frase: "Cada cosa para lo que es"; es decir, .NET Framework tiene cualidades enviadiables por el motor de base de datos, mientras que el motor de base de datos tiene caractersticas en las que no es eficiente .NET Framework. Usemos ambas tecnologas para obtener lo mejor de ambas caracterisiticas integradas !! Nota: Otros fabricantes de bases de datos tambin ofrecen integracin de .NET (u otros lenguajes como Java) en sus motores relacionales; desde nuestro punto de vista, la ms importante diferencia entre la la integracin de .NET Framework en SQL Server frente al resto de fabricantes, es que el propio motor relacional (SQL Server) se encarga de gestionar el acceso y uso de recursos de los componentes .NET integrados; es decir, SQL Server conoce las necesidades de cada recurso, y dinmicamente gestiona su asignacin de recursos.
Beneficios
Modelo de programacin mejorado: Los lenguajes .NET son lenguajes orientados a objeto, y a diferencia de T-SQL son ms fciles de aprender, y su curva de aprendizaje es relativamente menor. Por otra parte son lenguajes de programacin en los que su capacidad para realizar bucles, iterariones, y calculos es ms potente que T-SQL. Seguridad: Se ofrece un nivel de seguridad completo desde el momento en que se integra la librera .NET (assembly) en el servidor. Se especificar el modelo de seguridad en el momento de insertar el assembly en la base de datos. En el punto de Creacion y uso de objetos CLR en la base de datos veremos ms en detalle cada uno de los modelos Nuevos tipos de datos y agregados: La integracin del CLR ofrece la posibilidad de crear tipos de datos con .NET Framework; como veremos ms adelante al desarrollar el assembly tendrs que ajustarte a unas reglas para poder implementar el tipo de datos, o agregado. Util para mejorar rendimiento de procesos: .NET es un lenguaje muy eficiente realizando calculos complejos que requiere de mucho uso de recursos como CPU; .NET viene a cubrir un hueco en el que T-SQL no es tan eficiente.
101
Modelo de seguridad
Cuando se aade la referencia de un assembly en la base de datos, se debe definir el modelo de seguridad que seguir el asembly; bsicamente es decirle a SQL Server cuales sern los recursos/operaciones para las que tiene permiso el assembly.
SAFE
Es el permiso por defecto. El assembly no puede acceder a recursos externos de SQL Server como ficheros, red, variables de entorno, etc. El assembly slo podr realizar operaciones de acceso a datos en la base de datos en la que se instale.
EXTERNAL_ACCESS
Se permite el acceso a ciertos recursos externos del sistema como ficheros, red, servicios web, variables de entorno, y entradas del registro. Adems se podr acceder a las libreras de .NET Framework que estn marcadas como seguras. Bajo este modelo de seguridad, el acceso a los recursos se hace a travs de la cuenta que inici el servicio SQL Server, a menos que explicitamente se haga impersonacin).
UNSAFE
Bajo este nivel de seguridad, el acceso a los recursos del sistema es ilimitado y se puede hacer llamadas a cdigo no manejado. Este modelo de seguridad es el modelo de seguridad que en la versin 2000 de SQL Server utilizan los procedimientos almacenados extendidos (XPs). Slo los miembros del grupo de usuarios sysadmin tienen permiso para insertar assemblies de este tipo en la base de datos.
Qu se puede crear
Funciones definidas de usuario (UDFs) Funciones escalares (scalar UDF) Funciones de tabla (TVF) Procedimientos almacenados (UDP) Tipos de datos definidos de usuario (UDDTs)
102
<Serializable()> _ <Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native)> _ Public Structure Punto Implements INullable Public X As Integer Public Y As Integer Private m_Null As Boolean Public Overrides Function ToString() As String ' Put your code here Return X.ToString() + ", " + Y.ToString() End Function Public ReadOnly Property IsNull() As Boolean Implements INullable.IsNull Get ' Put your code here Return m_Null End Get
103
Si te fijas en el cdigo de la clase Punto, podrs ver que tiene definido un mtodo llamado Parse que lo que hace es dado un string de tipo SqlString lo convierte a un objeto de tipo Punto; el mtodo que implementa es recibir por valor una variable string que contiene dos valores enteros separados por un espacio en blanco; si recibe un valor '1 3', en "modo" objeto ser Punto.X = 1, y Punto.Y = 3. Tambin debes notar el mtodo ToString que hace precisamente el proceso inverso, que es convertir un objeto Punto a un string Adicionalmente hay que implementar el interfaz IsNull porque debemos definir cmo va a interpretar SQL Server la nulabilidad del objeto. Se han definido como pblicas las variables X e Y para que como veremos despus se pueda "interrogar" mtodos/o variables del objeto. A continuacin debers generar la dll: Men Proyect, Generar Punto (que es el nombre de la clase)
Localiza la ruta donde se ha generado la dll porque deber hacersele referencia en el siguiente punto.
104
En lugar de crear la referencia con la sentencia T-SQL, lo vamos a hacer desde las Management Studio. Para ello, expande la base de datos MSDNDemo, expande el nodo programabilidad, y selecciona la opcin New Assembly como se muestra en la imagen siguiente:
A continuacin, debers, rellenar los valores que aparecen en el recuadro de la siguiente imagen; debers localizar la ruta a la dll (en el ejemplo de la imagen est ubicado en C:\ejemplos\Punto\Punto\bin\Release\Punto.dll:
105
Si deseas consultar los assemblies que hay en una base de datos puedes consultas la vista de sistema sys.assemblies.
El siguiente paso ser crear un objeto en la base de datos que haga referencia a la dll recin insertada: recuerda que todava no hemos definido el tipo de objeto que existir en la base de datos... es decir tenemos que crear el procedimiento almacenado, en tipo de datos, el trigger, ... Creacin del objeto
Lo que hemos hecho hasta ahora ha sido generar una dll, y "poner" esa dll dentro de la base de datos. Ahora es el momento en que se crear el objeto de base de datos que haga referencia al assembly creado. En SQL Server 2005 (todas las versiones), el uso de la integracin del CLR est deshabilitada por defecto. Para habilitarla hay que ejecutar un procedimiento almacenado de sistema:
106
Una vez habilitada la integracin del CLR, procederemos en nuestro caso a crear el tipo de datos punto: CREATE TYPE Punto EXTERNAL NAME Punto.[Punto.Punto]; GO Con esta operacin hemos aadido un nuevo tipo de datos a la lista de tipos de datos de sistema que se llama Punto, e implementar la funcionalidad que hemos definido en el assembly que hemos generado en VB.NET.
Llamada al objeto
Dependiendo del tipo de objeto creado, la llamada al objeto se har de formas diferentes; en nuestro caso, como hemos creado un tipo de datos crearemos una tabla que utilice el tipo punto que acabamos de crear. Lo haremos de la siguiente forma: CREATE TABLE dbo.Posiciones ( id int IDENTITY, pos Punto NOT NULL); GO
107
Devolver:
id Punto 1 0x800000018000000200 2 0x800000018000000300
Que devolver:
PosicionX PosicionY 12 13
Que devolver:
v1 v2 1, 2 1, 2 1, 3 1, 3 Conclusiones: Hemos implementado un tipo de datos, que SQL Server no incorpora de forma nativa; tambin se podra implementar un tipo de datos para definir la fecha el formato UTC. Nunca deberan usarse tipos de datos CLR para implementar funcionaliades de negocio; por ejemplo, un objeto Cliente que tenga mtodos Nombre, NIF, Direccin, etc. Este es un caso que no ser eficiente debido a la sobrecarga que supone el almacenamiento del tipo, y el coste y complejidad de la estrategia de indexacin.
Otras implementaciones
Veamos como sera el caso de un procedimiento almacenado desarrollado con .NET: Este ejemplo es vlido a nivel didactico para conocer la funcionalidad pero debido a que hace uso "exclusivo" de acceso a datos, ser ms eficiente realizarlo desde TSQL
108
Using connection As New SqlConnection("context connection=true") Dim Command As New SqlCommand("SELECT * FROM dbo.Clientes") SqlContext.Pipe.ExecuteAndSend(Command) End Using End Sub End Class
Dos novedades:
En lugar de especificar una cadena de conexin, se ha definido un string como "context connection=true". Lo que hace ste mtodo es usar la conexin del proceso llamador en lugar de crear una conexin nueva de acceso a base de datos. El mtodo ExecuteAndSend envia el resultado del comando a travs del Pipe abierto por la conexin. La clase StoredProcedures est decorada con el atributo Microsoft.SqlServer.Server.SqlProcedure()
109