Base de Datos Avanzado I
Base de Datos Avanzado I
Base de Datos Avanzado I
CARRERAS PROFESIONALES
CIBERTEC
CARRERAS PROFESIONALES
CIBERTEC
NDICE
Pgina
Presentacin Red de contenidos Unidad de aprendizaje 1 Lenguaje de manipulacin de datos (DML) 1.1 Tema 1 1.2 Tema 2 : : Introduccin Lenguaje para la manipulacin de datos DML Operadores Funciones para el manejo de datos Comandos de LMD Declaracin MERGE : Recuperacin avanzada de datos Combinacin de tablas Datos agrupados GROUP BY, HAVING Agregar conjunto de resultados: UNION Resumen de datos: operador CUBE y ROLLUP
5 7
11
17 22 25 39
40 44 50 52
Unidad de aprendizaje 2: Programacin TRANSACT SQL 2.1 Tema 4 : Fundamentos de Programacin TRANSACT SQL Construccin de programacin TRANSACT SQL Variables Herramientas para el control de Flujos Estructura de control IF Estructura condicional CASE Estructura de control WHILE Control de Errores en TRANSACT SQL Funciones especiales de Error Variable de sistema @@ERROR Generar un error RAISERROR Cursores en TRANSACT SQL Declare Cursor Abrir un Cursor Cerrar el cursor 76 78 79 72 73 74 65 66 49 61 61
CIBERTEC
CARRERAS PROFESIONALES
Unidad de aprendizaje 3: Programacin Avanzada TRANSACT SQL 3.1 Tema 8 : Programacin avanzada TRANSACT SQL Funciones definida por el usuario Procedimientos almacenados Modificar datos con procedimientos almacenados Transacciones en TRANSACT SQL Triggers o disparadores 91 97 107 109 114
Unidad de aprendizaje 4: Manejo de datos XML en SQL SERVER 4.1 Tema 9 : Introduccin Por que utilizar bases de datos relacionales para datos XML 4.1.2. : 4.1.3. : 4.2 Tema 10 : Tipos de datos XML FOR XML y mejoras OPENXML Procesamiento XML en SQL SERVER Tipos de datos XML Almacenamiento de datos XML Recuperando datos de tipo XML Recuperar datos con OPENXML 128 130 131 131 132 135 147 127 127
4.1.1. :
Unidad de aprendizaje 5: Manejo de Usuarios en SQL SERVER 5.1. Tema 11 : Introduccin Entidades de seguridad Autenticacin Inicios de sesin y usuarios Permisos en el motor de base de datos 155 155 157 159 169
Unidad de aprendizaje 6: Seguridad y Restauracin en SQL SERVER 6.1. Tema 12 : 6.1.1. : 6.1.2. : 6.1.3. : 6.1.4. : Introduccin a las estrategias de seguridad y restauracin Impacto del modelo de recuperacin de copia de seguridad y restauracin Diseo de la estrategia de copia de seguridad Copia de Seguridad en SQL Server Restaurando una copia de seguridad 181 181 182 183 195
CARRERAS PROFESIONALES
CIBERTEC
PRESENTACIN
Base de Datos Avanzado I es un curso que pertenece a la Escuela de Tecnologas de Informacin y se dicta en las carreras de Administracin y Sistemas, y Computacin e Informtica. El presente manual ha sido desarrollado para que los alumnos del curso de Base de Datos Avanzado I puedan aplicar los conocimientos adquiridos en el curso de Base de Datos teora y laboratorio. Todo ello, en conjunto, le permitir manejar los datos de una base de datos relacional utilizando comandos TRANSACT-SQL.
El manual para el curso ha sido diseado bajo la modalidad de unidades de aprendizaje, las que se desarrollan durante semanas determinadas. En cada una de ellas, hallar los logros, que debe alcanzar al final de la unidad; el tema tratado, el cual ser ampliamente desarrollado; y los contenidos, que debe desarrollar, es decir, los subtemas. Por ltimo, encontrar las actividades que deber desarrollar en cada sesin, que le permitirn reforzar lo aprendido en la clase.
El curso es eminentemente prctico. Se inicia con la creacin de la base de datos de trabajo usando el lenguaje Transact/SQL en el manejador de base de datos relacional SQL Server 2008. Posteriormente, se efecta un repaso de las operaciones bsicas de manipulacin de datos (Data Manipulation Lenguaje DML) para hacer uso de comandos que se emplean en la insercin, modificacin y eliminacin de los mismos. A continuacin vamos a realizar operaciones de consulta avanzada de base de datos utilizando clausulas de unin, de agrupamiento, de combinacin, entre otras. A continuacin aprenderemos a manejar la programacin TRANSACT-SQL aplicando los conceptos en cursores, procedimientos almacenados, funciones y desencadenantes o trigger. Para integrar los temas de actualidad, aprenderemos a manejar datos XML en la base de datos relacional y finalmente, en la ltima parte del manual, aprenderemos a manejar usuarios y generar copias de respaldo de una base de datos y restaurar una base de datos de SQL SERVER.
CIBERTEC
CARRERAS PROFESIONALES
CARRERAS PROFESIONALES
CIBERTEC
RED DE CONTENIDOS
LMD
LDD
Estructuras
Cursores
FOR XML
OPEN XML
CIBERTEC
CARRERAS PROFESIONALES
CARRERAS PROFESIONALES
CIBERTEC
UNIDAD DE APRENDIZAJE
LENGUAJE DE MANIPULACIN DE DATOS (DML) LOGRO DE LA UNIDAD DE APRENDIZAJE Al trmino de la unidad, el alumno recupera, inserta, actualiza y elimina informacin de una base de datos aplicando mltiples condiciones de comparacin o funciones para el manejo de campos tipo fecha. Obtiene registros originados por la seleccin de uno o varios grupos haciendo uso de las funciones agrupamiento y columna procedentes de dos o ms tablas.
TEMARIO 1.1. Introduccin 1.1.1. Tablas a usar en el curso 1.1.2. Manejo de Esquemas 1.2. Lenguaje para la manipulacin de datos DML (3 horas) 1.2.1. Operadores 1.2.2. Funciones usados en las consultas condicionales 1.2.2.1. Funciones para el manejo de fecha 1.2.2.2. Funciones pare el manejo de cadena 1.2.2.3. Funciones de conversin de datos 1.2.3. Insercin de datos: INSERT 1.2.4. Actualizacin de datos: UPDATE 1.2.5. Eliminacin de datos: DELETE 1.2.6. Seleccin de datos: SELECT 1.2.7. Instruccin MERGE 1.3. Recuperacin avanzada de datos (6 horas) 1.3.1. Combinacin de tablas: JOIN 1.3.2. Consultas agregadas: empleo de GROUP BY, HAVING. Empleo de funciones agregadas: SUM, MIN, MAX, AVG, COUNT. 1.3.3. Agregar conjunto de resultados: UNION 1.3.4. Resumen de datos: CUBE 1.3.5. Resumen de datos: ROLLUP
ACTIVIDADES PROPUESTAS
Los alumnos implementan sentencias SQL para recuperar y actualizar datos en una base de datos relacional. Los alumnos implementan sentencias SQL para agrupar y resumir los datos.
CIBERTEC
CARRERAS PROFESIONALES
10
CARRERAS PROFESIONALES
CIBERTEC
11
1.1 INTRODUCCION
1.1.1 Estructura de la Base de Datos Negocios2011
En el curso, usaremos las tablas de la base de datos NEGOCIOS2011. A continuacin, se muestra la estructura de algunas tablas de la base de datos NEGOCIOS2011 a utilizar en el presente curso:
Tabla Paises Contiene informacin o relacin de pases en donde viven los clientes o empleados. La tabla Paises se encuentra en el esquema Venta
Tabla Categorias Contiene informacin o relacin de categoras en donde se encuentran registrados los productos. La tabla Categorias se encuentra en el esquema Compra.
Columna IdCategoria
Nulos No NULL
NombreCategoria Descripcin
Varchar(40) Text
No NULL Null
Tabla Clientes Contiene informacin o relacin de clientes que se encuentran registrados en la base de datos. La tabla Clientes se encuentra en el esquema Venta
CIBERTEC
CARRERAS PROFESIONALES
12
Columna IdCliente
Nulos No NULL
Nombre del cliente. Direccin del cliente Identificador de pas. Clave externa de pases.
fonoCliente
Varchar(15)
NULL
Tabla Proveedores Contiene informacin o relacin de los proveedores que se encuentran registrados en la base de datos. La tabla Proveedores se encuentra en el esquema Compra
Columna IdProveedor
Nulos No NULL
Varchar(80)
No NULL
Nombre del proveedor. Direccin del proveedor. Nombre del contacto del proveedor.
No NULL No NULL
Cargo del contacto del proveedor Identificador del pas. Clave externa de pases
No NULL No NULL
Tabla Productos Contiene informacin o relacin de los productos que ofrecen para la venta y que se encuentran registrados en la base de datos. La tabla Productos se encuentra en el esquema Compra.
CARRERAS PROFESIONALES
CIBERTEC
13
Columna IdProducto
Nulos No NULL
nomProducto idProveedor
varchar(80) Int
No NULL No NULL
idCategoria
Int
No NULL
cantxUnidad
varchar(50)
No NULL
precioUnidad
Precio por unidad del producto Unidades en existencia o stock del producto
UniEnExistencia smallint
UniEnPedido
smallint
No NULL
Tabla Cargos Contiene informacin o relacin de los cargos que se le asigna a cada empleado que se encuentran registrados en la base de datos. La tabla Cargos se encuentra en el esquema RRHH.
Columna IdCargo
Nulos No NULL
desCargo
varchar(30)
No NULL
Tabla Distritos Contiene informacin o relacin de los distritos que se le asigna a cada empleado que se encuentran registrados en la base de datos. La tabla Distritos se encuentra en el esquema RRHH.
CIBERTEC
CARRERAS PROFESIONALES
14
Columna IdDistrito
Nulos No NULL
nomDistrito
varchar(50)
No NULL
Tabla Empleados Contiene informacin o relacin de los empleados que se encuentran registrados en la base de datos. La tabla Empleados se encuentra en el esquema RRHH.
Columna IdEmpleado
Nulos No NULL
Nombre del empleado Apellido del empleado Fecha de Nacimiento Direccin del empleado Identificador de distrito. Clave externa de distritos.
fonoEmpleado idcargo
varchar(15) Int
NULL No NULL
fecContrata fotoEmpleado
Datetime Image
No NULL NULL
Tabla PedidosCabe Contiene informacin o relacin de la cabecera de los pedidos que se registran en el proceso de la venta y que se encuentran registrados en la base de datos. La tabla PedidosCabe se encuentra en el esquema Venta.
CARRERAS PROFESIONALES
CIBERTEC
15
Columna IdPedido
Nulos No NULL
idcliente
varchar(5)
No NULL
idEmpleado
Int
No NULL
Fecha de solicitud del pedido Fecha de entrega del pedido Fecha de envo del pedido Indica si el pedido ha sido o no entregado
destinatario dirdestinatario
varchar(60)
No NULL
varchar(100) No NULL
Tabla PedidosDeta Contiene informacin o relacin del detalle de los productos solicitados en los pedidos de venta y que se encuentran registrados en la base de datos. La tabla PedidosDeta se encuentra en el esquema Compra.
Columna IdPedido
Nulos No NULL
idProducto
Int
No NULL
Precio del producto en el pedido Cantidad solicitada del producto Cantidad de productos por unidad almacenada
CIBERTEC
CARRERAS PROFESIONALES
16
database_name: Especifica el nombre de una base de datos de SQL Server si el objeto reside en una instancia local de SQL Server. Cuando el objeto est en un servidor vinculado, database_name especifica un catlogo de OLE DB.
schema_name: Especifica el nombre del esquema que contiene el objeto si dicho objeto se encuentra en una base de datos de SQL Server. Si el objeto se encuentra en un servidor vinculado, schema_name especifica un nombre de esquema OLE DB. object_name: Cuando se hace referencia a un objeto especfico, no siempre hay que especificar el servidor, la base de datos y el esquema del SQL Server Database Engine (Motor de base de datos de SQL Server) para identificar el objeto. No obstante, si no se encuentra el objeto, se muestra un error.
AUTHORIZATION y a continuacin definir cada dominio, tabla, vista y dems en el esquema. Para crear los esquemas que se implementarn en la base de datos Negocios2011 autorizado por el propietario dbo:
USE NEGOCIOS2011 GO
CARRERAS PROFESIONALES
CIBERTEC
17
-- CREAR LOS ESQUEMAS DE LA BASE DE DATOS CREATE SCHEMA VENTA AUTHORIZATION DBO GO
Para listar los esquemas creados por el propietario de la base de datos (el database owner - dbo) se invoca a la tabla sys.schemas, tal como se
muestra:
1.2.1.1.
Operadores aritmticos
Son aquellos que realizan operaciones matemticas entre dos expresiones numricas.
CIBERTEC
CARRERAS PROFESIONALES
18
Significado Suma Resta Multiplicacin Divisin Devuelve el resto entero de una divisin. Por ejemplo, 12 % 5 = 2 porque el resto de 12 dividido entre 5 es 2.
Los operadores de suma (+) y resta (-) son utilizados para realizar operaciones aritmticas sobre valores datetime y smalldatetime.
1.2.1.2.
Operadores de Asignacin
El operador (=) es slo el operador de asignacin del SQL Server. En el siguiente ejemplo, definimos la variable @num, asigne un valor a dicha variable.
DECLARE @NUM INT SET @NUM=15 PRINT 'EL NUMERO INGRESADO ES:' + STR(@NUM)
El operador de asignacin se utiliza para establecer encabezados de una columna. En el siguiente ejemplo, mostrar los encabezados de las columnas a la tabla Distritos.
1.2.1.3.
Operadores de comparacin
Los operadores de comparacin permiten comprobar dos expresiones retornando un valor verdadero o falso, es decir, un dato Boolean. Se pueden utilizar en todas las expresiones excepto en las de los tipos de datos text, ntext o image. En la siguiente tabla, se presentan los operadores de comparacin Transact-SQL. Operador de Comparacin = > < >= <= Significado Igual a Mayor que Menor que Mayor o igual que Menor o igual que
CARRERAS PROFESIONALES
CIBERTEC
19
No es igual a No es igual a (no es del estndar ISO) No es menor que (no es del estndar ISO) No es mayor que (no es del estndar ISO)
1.2.1.4.
Operadores lgicos
Los operadores lgicos comprueban la veracidad de alguna condicin. stos, como los operadores de comparacin, devuelven el tipo de datos Boolean con el valor TRUE, FALSE o UNKNOWN. Operador ALL AND ANY Significado TRUE si el conjunto completo de comparaciones es TRUE. TRUE si ambas expresiones booleanas son TRUE. TRUE si cualquier miembro del conjunto de comparaciones es TRUE.
BETWEEN TRUE si el operando est dentro de un intervalo. EXISTS IN LIKE NOT OR SOME TRUE si una subconsulta contiene cualquiera de las filas. TRUE si el operando es igual a uno de la lista de expresiones. TRUE si el operando coincide con un patrn. Invierte el valor de cualquier otro operador booleano. TRUE si cualquiera de las dos expresiones booleanas es TRUE. TRUE si alguna de las comparaciones de un conjunto es TRUE.
1.2.1.5.
Operador BETWEEN
Especifica un intervalo que se va a evaluar, retorna un valor boolean; retorna TRUE si el valor de la expresin a evaluar es mayor o igual que el valor de inicio expresin y menor o igual que el valor de fin expresin. NOT BETWEEN devuelve TRUE si el valor de expresin a evaluar es menor que el valor de inicio expresin y mayor que el valor de fin expresin. Sintaxis:
CIBERTEC
CARRERAS PROFESIONALES
20
Ejemplo: Mostrar todos los productos donde el valor del precioUnidad se encuentre entre 27 a 30
USE NEGOCIOS2011 GO
SELECT
FROM COMPRA.PRODUCTOS P JOIN COMPRA.CATEGORIAS C ON P.IDCATEGORIA = C.IDCATEGORIA WHERE P.PRECIOUNIDAD BETWEEN 27 AND 30 ORDER BY P.NOMPRODUCTO GO
1.2.1.6.
Operador LIKE
Determina si una cadena de caracteres especfica coincide con un patrn determinado. Un patrn puede contener caracteres normales y caracteres comodn. Durante la operacin de bsqueda de coincidencias de patrn, los caracteres normales deben coincidir exactamente con los caracteres especificados en la cadena de caracteres. Sin embargo, los caracteres comodn pueden coincidir con fragmentos arbitrarios de la cadena. La utilizacin de caracteres comodn hace que el operador LIKE sea ms flexible que los operadores de comparacin de cadenas = y !=.
Argumentos: match_expression: Es cualquier expresin vlida de tipo de datos de caracteres. Pattern: Es la cadena de caracteres especfica que se busca en match_expression; puede incluir los siguientes caracteres comodn vlidos. pattern puede tener 8.000 bytes como mximo.
CARRERAS PROFESIONALES
CIBERTEC
21
Carcter comodn %
Descripcin
Ejemplo
Cualquier
cadena
de WHERE title LIKE '%computer%' busca todos los ttulos de libros que contengan la palabra 'computer' en el ttulo. WHERE au_fname LIKE _ean busca todos los nombres de cuatro letras que terminen en ean (Dean, Sean, etc.)
intervalo ([a-f]) o conjunto autores que terminen en arsen y empiecen por cualquier ([abcdef]) que se ha carcter individual entre C y P, como Carsen, Larsen, Karsen, etc.
especificado. [^]
Cualquier carcter que WHERE au_lname LIKE de[^l]% busca todos los apellidos no se encuentre en el de autores que empiecen por de y en los que la siguiente intervalo ([^a-f]) o letra no sea l.
escape_character: Es un carcter que se coloca delante de un carcter comodn para indicar que el comodn no debe interpretarse como un comodn, sino como un carcter normal. escape_character es una expresin de caracteres que no tiene ningn valor predeterminado y se debe evaluar como un nico carcter.
-- RETORNA LOS REGISTROS DE EMPLEADOS DONDE SU APELLIDO TERMINE EN KING SELECT * FROM RRHH.EMPLEADOS WHERE APEEMPLEADO LIKE '%KING' GO
-- RETORNA LOS REGISTROS DE EMPLEADOS DONDE SU APELLIDO INICIE CON KING SELECT * FROM RRHH.EMPLEADOS WHERE APEEMPLEADO LIKE 'KING%' GO
CIBERTEC
CARRERAS PROFESIONALES
22
-- RETORNA LOS REGISTROS DE EMPLEADOS DONDE SU APELLIDO CONTENGA LA EXPRESION KING SELECT * FROM RRHH.EMPLEADOS
Funcin DATEADD
Descripcin Devuelve un valor date con el intervalo number especificado, agregado a un valor datepart especificado de ese valor date.
DATEDIFF
Devuelve el nmero de lmites datepart de fecha y hora entre dos fechas especificadas.
CARRERAS PROFESIONALES
CIBERTEC
23
DATENAME
Devuelve una cadena de caracteres que representa el datepart especificado de la fecha especificada.
DATEPART
DAY
GETDATE
MONTH
Devuelve un entero que representa el mes de date especificado. MONTH devuelve el mismo valor que DATEPART (month, date).
YEAR
Devuelve un entero que representa el ao de date especificado. YEAR devuelve el mismo valor que DATEPART (year, date).
1.2.2.2.
Funcin LEFT
Descripcin Devuelve la parte izquierda de una cadena de caracteres con el nmero de caracteres especificado.
CIBERTEC
CARRERAS PROFESIONALES
24
LEN
Devuelve el nmero de caracteres de la expresin de cadena especificad, excluidos los espacios en blanco finales.
LEN ( string_expression )
LOWER
Devuelve una expresin de caracteres despus de convertir en minsculas los datos de caracteres en maysculas.
LOWER ( character_expression )
LTRIM
Devuelve una expresin de caracteres tras quitar todos los espacios iniciales en blanco.
LTRIM ( character_expression )
RTRIM
Devuelve una cadena de caracteres despus de truncar todos los espacios en blanco finales.
RTRIM ( character_expression )
SUBSTRING
Devuelve parte de una expresin de caracteres, binaria, de texto o de imagen. Para obtener ms informacin acerca de los tipos de datos vlidos de SQL Server que se pueden usar con esta funcin.
SUBSTRING (value_expression, start_expression, length_expression)
UPPER
Devuelve una expresin de caracteres con datos de caracteres en minsculas convertidos a maysculas.
UPPER ( character_expression )
Ejercicio
-- MANEJO DE CADENAS: RETORNA LA EXPRESION BASE CONVERTIDA EN MAYSCULAS DECLARE @CADENA VARCHAR(30) SELECT @CADENA = ' BASE DE DATOS AVANZADO '; SELECT LEFT(UPPER(LTRIM(@CADENA)),4) AS 'CADENA RESULTANTE' GO
CARRERAS PROFESIONALES
CIBERTEC
25
1.2.2.3.
Funciones de conversin
Convierte una expresin de un tipo de datos en otro tipo de dato definido en SQL Server 2008.
Funcin CAST
CONVERT
Ejemplo
USE NEGOCIOS2011 GO
SELECT DISTINCT CAST(P.NOMPRODUCTO AS CHAR(15)) AS NOMBRE, CONVERT(DECIMAL(10,2),P.PRECIOUNIDAD) AS 'PRECIO UNITARIO' FROM COMPRA.PRODUCTOS WHERE P.NOMPRODUCTO LIKE 'PAN%'; GO
1.2.3.1.
Agrega una o varias filas nuevas a una tabla o una vista en SQL Server 2008.
CIBERTEC
CARRERAS PROFESIONALES
26
Sintaxis:
INSERT { {
{ <OBJETO> }
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ] | table_derivada | sentencia_ejecutar | <table_origen> | DEFAULT VALUES } } }
INSERT INTO tabla [(columna1, columna2, columnan)] VALUES (expr1, expr2, exprn)
Tabla es el nombre de la tabla donde se desea ingresar los nuevos datos. Columna es una lista opcional de nombres de campo en los que se insertarn valores en el mismo nmero y orden que se especificarn en la clusula VALUES. Si no se especifica la lista de campos, los valores de expr en la clusula VALUES deben ser tantos como campos tenga la tabla y en el mismo orden que se definieron al crear la tabla.
Expr es una lista de expresiones o valores constantes, separados por comas, para dar valor a los distintos campos del registro que se aadir a la tabla. Las cadenas de caracteres debern estar encerradas entre apstrofes.
1.2.3.1.1.
Cada sentencia INSERT aade un nico registro a la tabla. En el ejemplo, se han especificado todos los campos con sus respectivos valores. Si no se ingresara valores a un campo, este se cargar con el valor DEFAULT o NULL (siempre y cuando haya sido especificado en la estructura de la tabla). Un valor nulo NULL- no significa blancos o ceros, sino que el campo nunca ha tenido un valor.
CARRERAS PROFESIONALES
CIBERTEC
27
USE NEGOCIOS2011 GO
INSERT INTO VENTA.CLIENTES(IDCLIENTE,NOMCLIENTE, DIRCLIENTE, IDPAIS, FONOCLIENTE) VALUES ('DRATR', 'DARIO TRAGODARA', 'CALLE LUIS MIRO 123', '003', '3245566'); GO
Si no se especifica la lista de campos, los valores en la clusula VALUES deben ser tantos como campos tenga la tabla y en el mismo orden que se definieron al crear la tabla. Si se va a ingresar parcialmente los valores en una tabla, se debe especificar el nombre de los campos a ingresar, como en el ejemplo A.
USE NEGOCIOS2011 GO
INSERT INTO VENTA.CLIENTES VALUES ('DRAPR', 'DARIO PRADO', 'CALLE 32', '001', '3245566'); GO
1.2.3.1.2.
En el siguiente ejemplo, se usa el constructor de valores de tabla para insertar tres filas en la tabla Venta.Paises en una instruccin INSERT. Dado que los valores para todas las columnas se suministran e incluyen en el mismo orden que las columnas de la tabla, no es necesario especificar los nombres de columna en la lista de columnas.
CIBERTEC
CARRERAS PROFESIONALES
28
USE NEGOCIOS2011 GO
INSERT INTO VENTA.PAISES VALUES ('095', 'NORUEGA'), ('096', 'ISLANDIA'), ('097', 'GRECIA'); GO
USE NEGOCIOS2011 GO
CREATE TABLE RRHH.EMPLEADOS2011( IDEMPLEADO INT NOT NULL, NOMEMPLEADO VARCHAR(50) NOT NULL, APEEMPLEADO VARCHAR(50) NOT NULL, FONOEMPLEADO VARCHAR(15) NULL, DIREMPLEADO VARCHAR(100) NOT NULL, IDDISTRITO INT NOT NULL ) GO
INSERT INTO RRHH.EMPLEADOS2011 SELECT A.IDEMPLEADO, A.NOMEMPLEADO, A.APEEMPLEADO, A.FONOEMPLEADO, A.DIREMPLEADO, A.IDDISTRITO FROM RRHH.EMPLEADOS AS A WHERE YEAR(A.FECCONTRATA) = '2011 GO
CARRERAS PROFESIONALES
CIBERTEC
29
USE NEGOCIOS2011; GO
-- CREA UNA VARIABLE TIPO TABLA DECLARE @PRODUCTO TABLE( PRODUCTOID INT NOT NULL, PRODUCTONOMBRE VARCHAR(100) NOT NULL, PRODUCTOPRE AS DECIMAL, PRODUCTOCAN INT); GO
-- INSERTA VALORES DENTRO DE LA VARIABLE TIPO TABLA INSERT INTO @PRODUCTO (PRODUCTOID, PRODUCTONOMBRE, PRODUCTOPRE, PRODUCTOCAN) SELECT IDPRODUCTO, NOMPRODUCTO, PRECIOUNIDAD, UNIDADESENEXISTENCIA FROM COMPRA.PRODUCTOS WHERE PRECIOUNIDAD > 100;
CIBERTEC
CARRERAS PROFESIONALES
30
C. Insertar datos en una tabla con columnas que tienen valores predeterminados
USE NEGOCIOS2011; GO
CREATE TABLE DBO.PRUEBA ( COLUMNA_1 AS 'COLUMNA CALCULADA ' + COLUMNA_2, COLUMNA_2 VARCHAR(30) DEFAULT ('COLUMNA POR DEFECTO'), COLUMNA_3 ROWVERSION, COLUMNA_4 VARCHAR(40) NULL ) GO
INSERT INTO DBO.PRUEBA (COLUMN_4) VALUES ('VALOR'); INSERT INTO DBO.PRUEBA (COLUMN_2, COLUMN_4) VALUES ('VALOR', 'VAL'); INSERT INTO DBO.PRUEBA (COLUMN_2) VALUES ('VALOR'); INSERT INTO PRUEBA DEFAULT VALUES; GO
1.2.3.2.
La sentencia UPDATE se utiliza para cambiar el contenido de los registros de una o varias columnas de una tabla de la base de datos. Su formato es:
CARRERAS PROFESIONALES
CIBERTEC
31
Nombre_tabla nombre de la tabla donde se cambiar los datos. Nombre_columna columna cuyo valor se desea cambiar. En una misma sentencia UPDATE pueden actualizarse varios campos de cada registro. Expr es el nuevo valor que se desea asignar al campo. La expresin puede ser un valor constante o una subconsulta. Las cadenas de caracteres debern estar encerradas entre comillas. Las subconsultas entre parntesis.
La clusula WHERE sigue el mismo formato que la vista en la sentencia SELECT y determina qu registros se modificarn.
1.2.3.2.1.
En el siguiente ejemplo, se actualizan los valores de las columnas precioUnidad y UnidadesEnExistencia para todas las filas de la tabla Productos. USE NEGOCIOS2011; GO
1.2.3.2.2.
En el ejemplo siguiente, actualice el valor de la columna precioUnidad de la tabla Compra.Productos incrementando su valor en un 25% ms, para todas las filas cuyo nombre del producto inicie con A y su stock o unidadesenExistencia sea mayor a 100.
USE NEGOCIOS2011; GO
UPDATE COMPRA.PRODUCTOS SET PRECIOUNIDAD *= 1.25 WHERE NOMPRODUCTO LIKE 'A%' AND UNIDADESENEXISTENCIA > 100; GO
CIBERTEC
CARRERAS PROFESIONALES
32
1.2.3.2.3.
En este ejemplo, se modifica la columna ventaEmp de la tabla SalesEmpleado para reflejar las ventas registradas en la tabla Pedidos.
USE NEGOCIOS2011; GO
UPDATE VENTA.SALESEMPLEADO SET VENTAEMP = VENTAEMP + (SELECT SUM(PRECIOUNIDAD*CANTIDAD) FROM VENTA.PEDIDOSCABE PE JOIN VENTA.PEDIDOSDETA AS PD ON PE.IDPEDIDO= PD.IDPEDIDO) GO
1.2.3.3.
La sentencia DELETE se utiliza para eliminar uno o varios registros de una misma tabla. En una instruccin DELETE con mltiples tablas, debe incluir el nombre de tabla (Tabla.*). Si especifica ms de una tabla para eliminar registros, todas deben tener una relacin de muchos a uno. Si desea eliminar todos los registros de una tabla, eliminar la propia tabla es ms eficiente que ejecutar una consulta de borrado.
Las operaciones de eliminacin en cascada en una consulta nicamente eliminan desde varios lados de una relacin. Por ejemplo, en la base de datos NEGOCIOS2011, la relacin entre las tablas Clientes y PedidosCabe, la tabla PedidosCabe es la parte de muchos, por lo que las operaciones en cascada slo afectarn a la tabla PedidosCabe. Una consulta de borrado elimina los registros completos, no nicamente los datos en campos especficos. Si desea eliminar valores en un campo especificado, crea una consulta de actualizacin que cambie los valores a Null.
CARRERAS PROFESIONALES
CIBERTEC
33
Nombre_Tabla es el nombre de la tabla donde se desea borrar los datos. La clusula WHERE sigue el mismo formato que la vista en la sentencia SELECT y determina qu registros se borrarn.
1.2.3.3.1.
Eliminar registros
En el siguiente ejemplo, elimine los registros de la tabla PedidosCabe. Cada sentencia DELETE borra los registros que cumplen la condicin impuesta o todos si no se indica clusula WHERE USE NEGOCIOS2011; GO
1.2.3.3.2.
En el ejemplo siguiente, elimine los registros de la tabla PedidosDeta de todos aquellos pedidos cuya antigedad sea mayor a 10 aos.
USE NEGOCIOS2011; GO
CIBERTEC
CARRERAS PROFESIONALES
34
1.2.3.4.
Recupera las filas de la base de datos y habilita la seleccin de una o varias filas o columnas de una o varias tablas en SQL Server 2008. La sintaxis completa de la instruccin SELECT es compleja, aunque las clusulas principales se pueden resumir del modo siguiente:
Sintaxis: <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 ] ) ] <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> ] [ HAVING < search_condition > ] Para nuestro curso usaremos la siguiente sintaxis:
SELECT [ALL|DISTINCT] [TOP (expresin) [PERCENT] [WITH TIES] ] < lista de seleccin > [INTO nombre de la nueva tabla] FROM <nombre de tabla> WHERE <condicin> GROUP BY <nombre de campos> HAVING <condicin> [AND | OR <condicin>] ORDER BY
CARRERAS PROFESIONALES
CIBERTEC
35
1.2.3.4.1.
Los pasos siguientes muestran el orden de procesamiento lgico, u orden de enlace, para una instruccin SELECT. Este orden determina el momento en que los objetos definidos en un paso estn disponibles para las clusulas de los pasos subsiguientes. Por ejemplo, si el procesador de consultas se puede enlazar (obtener acceso) a las tablas o vistas definidas en la clusula FROM, estos objetos y sus columnas quedan disponibles para todos los pasos subsiguientes. A la inversa, dado que la clusula SELECT es el paso 8, las clusulas precedentes no pueden hacer referencia a los alias de columna o las columnas derivadas definidos en esa clusula. Sin embargo, las clusulas subsiguientes, como la clusula ORDER BY, s pueden hacer referencia a ellos. Observe que la ejecucin fsica real de la instruccin est determinada por el procesador de consultas y el orden de esta lista puede variar.
1. FROM 2. ON 3. JOIN 4. WHERE 5. GROUP BY 6. WITH CUBE o WITH ROLLUP 7. HAVING 8. SELECT 9. DISTINCT 10. ORDER BY 11. TOP
Ejemplo: Recupera las filas de la tabla Productos cuyo precioUnidad sea mayor a 50
USE NEGOCIOS2011; GO
BEGIN DECLARE @MYPRODUCTO INT SET @MYPRODUCTO = 750 -EVALUAR SI LA VARIABLE @MYPRODUCTO ES DIFERENTE DE 0
IF (@MYPRODUCTO <> 0)
CIBERTEC
CARRERAS PROFESIONALES
36
SELECT
1.2.3.4.2.
Utilice la siguiente sintaxis para la creacin de una tabla con datos a partir de una consulta:
Por ejemplo: Recuperar los registros de empleados cuyo cargo sea Supervisor de Ventas y almacenarlos en la tabla EmpleadosBAK
USE NEGOCIOS2011 GO
SELECT IDEMPLEADO, APEEMPLEADO, NOMEMPLEADO INTO DBO.EMPLEADOBAK FROM RRHH.EMPLEADOS WHERE IDCARGO = (SELECT C.IDCARGO FROM RRHH.CARGOS C WHERE DESCARGO = 'SUPERVISOR DE VENTAS') GO
CARRERAS PROFESIONALES
CIBERTEC
37
Sincronizar los datos de 2 tablas. Supongamos que tenemos 2 bases distintas (Produccin y Desarrollo por ejemplo) y queremos sincronizar los datos de una tabla para que queden exactamente iguales. Lo que antes hubiese implicado algunas sentencias mezcladas con INNER JOIN y NOT EXISTS, ahora es posible resumirlo en una operacin atmica mucho ms sencilla y eficiente.
La otra razn por la cual podramos usar MERGE, es cuando tenemos nuevos datos que queremos almacenar en una tabla y no sabemos si la primary key de la tabla ya existe o no, por lo tanto, no sabemos si hacer un UPDATE o un INSERT en la tabla.
Sintaxis: MERGE [INTO] <target table> USING <source table> ON <join/merge predicate> WHEN [TARGET] NOT MATCHED <statement to runt>
Donde: <target table>: Es la tabla de destino de las operaciones de insercin, actualizacin o eliminacin que las clusulas WHEN de la instruccin MERGE especifican.
<source table>: Especifica el origen de datos que se hace coincidir con las filas de datos en target_table. El resultado de esta coincidencia dicta las acciones que tomarn las clusulas WHEN de la instruccin MERGE.
CIBERTEC
CARRERAS PROFESIONALES
38
<join/merge predicate>: Especifica las condiciones en las que table_source se combina con target_table para determinar dnde coinciden.
<statement to run when match found in target>: Especifica que todas las filas de target_table que coinciden con las filas que devuelve <table_source> ON <merge_search_condition> y que satisfacen alguna condicin de bsqueda adicional se actualizan o eliminan segn la clusula <merge_matched>.
La instruccin MERGE puede tener a lo sumo dos clusulas WHEN MATCHED. Si se especifican dos clusulas, la primera debe ir acompaada de una clusula AND <search_condition>. Si hay dos clusulas WHEN MATCHED, una debe especificar una accin UPDATE y la otra una accin DELETE. Puede actualizar la misma fila ms de una vez, ni actualizar o eliminar la misma fila.
Ejemplo: Usar MERGE para realizar operaciones INSERT y UPDATE en una tabla en una sola instruccin. Implemente un escenario para actualizar o insertar un registro a la tabla pases: Si existe el cdigo del pas, actualice su nombre; sino inserte el registro a la tabla
USE NEGOCIOS2011 GO
MERGE VENTAS.PAISES AS TARGET USING (SELECT @ID, @PAIS) AS SOURCE (IDPAIS, NOMBREPAIS) ON (TARGET.IDPAIS = SOURCE.IDPAIS) WHEN MATCHED THEN UPDATE SET NOMBREPAIS = SOURCE.NOMBREPAIS WHEN NOT MATCHED THEN INSERT VALUES(SOURCE.IDPAIS, SOURCE.NOMBREPAIS); GO
CARRERAS PROFESIONALES
CIBERTEC
39
Ejemplo: Usar MERGE para realizar operaciones DELETE y UPDATE en una tabla en una sola instruccin. Implemente un escenario para actualizar o eliminar un registro a la tabla productos: Si existe el cdigo del producto y las
unidadesEnExistencia es menor o igual a cero, elimine el registro; sino actualice el nombre del producto
USE NEGOCIOS2011 GO
DECLARE @PRODUCTO VARCHAR(50), @ID INT SET @PRODUCTO = 'VINO' SET @ID = 22
MERGE COMPRAS.PRODUCTOS AS TARGET USING (SELECT @ID, @PRODUCTO) AS SOURCE (IDPRODUCTO, NOMPRODUCTO) ON (TARGET.IDPRODUCTO = SOURCE.IDPRODUCTO) WHEN MATCHED AND TARGET.UNIDADESENEXISTENCIA<=0 THEN DELETE WHEN MATCHED THEN UPDATE GO SET NOMPRODUCTO = SOURCE.NOMPRODUCTO;
Ejemplo: Usar MERGE para realizar operaciones INSERT, DELETE y UPDATE en una tabla en una sola instruccin. Implemente un escenario para insertar, actualizar o eliminar un registro a la tabla clientesBAK: Si existe el cdigo del cliente, si el nombre del cliente y su direccin no coincide, actualice sus datos; sino existe el cdigo Inserte el registro; y si no coincide en el origen elimine el Registro
USE NEGOCIOS2011 GO
MERGE VENTAS.CLIENTESBAK AS TARGET USING VENTAS.CLIENTES AS SOURCE ON (TARGET.IDCLIENTE = SOURCE.IDCLIENTE) WHEN MATCHED AND TARGET.NOMBRECLIENTE <> SOURCE .NOMBRECLIENTE THEN UPDATE SET TARGET.NOMBRECLIENTE = SOURCE .NOMBRECLIENTE,
CIBERTEC
CARRERAS PROFESIONALES
40
TARGET.DIRCLIENTE = SOURCE .DIRCLIENTE WHEN NOT MATCHED THEN INSERT VALUE(SOURCE.NOMBRECLIENTE, SOURCE .DIRCLIENTE)
1.3.1.1.
COMBINACION INTERNA.
Con esta operacin, se calcula el producto cruzado de los registros de dos tablas, pero solo permanecen aquellos registros en la tabla combinada que satisfacen las condiciones que se especifican. La clusula INNER JOIN permite la combinacin de los registros de las tablas, comparando los valores de la columna especfica en ambas tablas. Cuando no existe esta correspondencia, el registro no se muestra Esta consulta de Transact SQL es un ejemplo de una combinacin interna:
CARRERAS PROFESIONALES
CIBERTEC
41
USE NEGOCIOS2011 GO
SELECT C.IDCLIENTE, C.NOMCLIENTE, C.DIRCLIENTE, P.NOMBREPAIS FROM VENTAS.CLIENTES C INNER JOIN VENTAS.PAISES P ON C.IDPAIS = P.IDPAIS GO
Esta combinacin interna se conoce como una combinacin equivalente. Devuelve todas las columnas de ambas tablas y slo devuelve las filas en las que haya un valor igual en la columna de la combinacin. Es equivalente a la siguiente consulta:
USE NEGOCIOS2011 GO
SELECT C.IDCLIENTE, C.NOMCLIENTE, C.DIRCLIENTE, P.NOMBREPAIS FROM VENTAS.CLIENTES C, VENTAS.PAISES P WHERE GO C.IDPAIS = P.IDPAIS
1.3.1.2.
COMBINACIONES EXTERNAS
Mediante esta operacin no se requiere que cada registro en las tablas a tratar tenga un registro equivalente en la otra tabla. El registro es mantenido en la tabla combinada si no existe otro registro que le corresponda. Este tipo de operacin se subdivide dependiendo de la tabla a la cual se le admitirn los registros que no tienen correspondencia, ya sean de tabla izquierda, de tabla derecha o combinacin completa. SQL Server 2008 utiliza las siguientes palabras clave para las combinaciones externas especificadas en una clusula FROM:
LEFT OUTER JOIN o LEFT JOIN RIGHT OUTER JOIN o RIGHT JOIN FULL OUTER JOIN o FULL JOIN
CIBERTEC
CARRERAS PROFESIONALES
42
A.
La sentencia LEFT JOIN retorna la pareja de todos los valores de la izquierda con los valores de la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no correspondencia.
El operador de combinacin LEFT JOIN, indica que todas las filas de la primera tabla se deben incluir en los resultados, con independencia si hay datos coincidentes en la segunda tabla.
Ejemplo: Mostrar los registros de los clientes que han solicitado pedidos y aquellos clientes que aun no han registrado pedidos USE NEGOCIOS2011 GO
SELECT C.*, P.IDPEDIDO FROM VENTAS.CLIENTES C INNER JOIN VENTAS.PEDIDOSCABE P ON C.IDCLIENTE = P.IDCLIENTE GO
B.
Una combinacin externa derecha es el inverso de una combinacin externa izquierda. Se devuelven todas las filas de la tabla de la derecha. Cada vez que una fila de la tabla de la derecha no tenga correspondencia en la tabla de la izquierda, se devuelven valores NULL para la tabla de la izquierda.
El operador de combinacin RIGHT JOIN, indica que todas las filas de la segunda tabla se deben incluir en los resultados, con independencia si hay datos coincidentes en la primera tabla.
Ejemplo: Mostrar los pedidos registrados por los productos, incluya los productos que aun no se ha registrado en algn pedido.
USE NEGOCIOS2011 GO
CARRERAS PROFESIONALES
CIBERTEC
43
SELECT PD.*, PO.NOMPRODUCTO FROM COMPRAS.PRODUCTOS PO RIGHT JOIN VENTAS.PEDIDOSDETA PD ON PD.IDPRODUCTO = PO.IDPRODUCTO GO
C.
Una combinacin externa completa devuelve todas las filas de las tablas de la izquierda y la derecha. Cada vez que una fila no tenga coincidencia en la otra tabla, las columnas de la lista de seleccin de la otra tabla contendrn valores NULL. Cuando haya una coincidencia entre las tablas, la fila completa del conjunto de resultados contendr los valores de datos de las tablas base. Para retener la informacin que no coincida al incluir las filas no coincidentes en los resultados de una combinacin, utilice una combinacin externa completa. SQL Server 2008 proporciona el operador de combinacin externa completa, FULL JOIN, que incluye todas las filas de ambas tablas, con independencia de que la otra tabla tenga o no un valor coincidente. En forma prctica, podemos decir que FULL JOIN es una combinacin de LEFT JOIN y RIGHT JOIN.
Ejemplo: Mostrar los pedidos registrados por los productos, incluya los productos que aun no se ha registrado en algn pedido.
USE NEGOCIOS2011 GO
SELECT PD.*, PO.NOMPRODUCTO FROM VENTAS.PEDIDOSDETA PD FULL JOIN COMPRAS.PRODUCTOS PO ON PD.IDPRODUCTO = PO.IDPRODUCTO GO
D.
COMBINACION CRUZADA
Las combinaciones cruzadas presentan el producto cartesiano de todos los registros de las dos tablas. Se emplea el CROSS JOIN cuando se quiere combinar todos los registros de una tabla con cada registro de otra tabla.
CIBERTEC
CARRERAS PROFESIONALES
44
Por ejemplo, elaborar una lista de los productos donde asigne a cada producto todos los posibles proveedores registrados en la base de datos. Aplique combinacin cruzada:
USE NEGOCIOS2011 GO
1.3.2.1.
Funciones Agregadas
Las funciones agregadas calculan valores sumarios a partir de datos de una columna concreta. Las funciones agregadas se pueden aplicar a todas las filas de una tabla, a un subconjunto de la tabla especificada por una clusula WHERE o a uno o ms grupos de filas de la tabla. De cada conjunto de filas al que se aplica una funcin agregada se genera un solo valor.
Resultado Retorna la suma total de los valores (distintos) de la expresin o columna Retorna el promedio de los valores (distintos) de la expresin o columna Retorna el nmero de valores (distintos) no nulos de la expresin Numero de filas seleccionadas Retorna el mximo valor de la expresin o columna
CARRERAS PROFESIONALES
CIBERTEC
45
columna
Las funciones SUM y AVG slo pueden utilizarse con columnas numricas: int , smallint , tinyint, decimal, numeric, float y Money. Las funciones MIN y MAX no pueden usarse con tipos de datos bit . Las funciones agregadas distintas de COUNT(*) no pueden utilizarse con los tipos de datos text e image
La funcin COUNT(*) no requiere ninguna expresin como argumento, porque no emplea informacin sobre alguna columna. Esta funcin se utiliza para hallar el nmero total de filas de una tabla.
USE NEGOCIOS2011 GO
La palabra clave DISTINCT es opcional con SUM, AVG y COUNT, y no se permite con MIN, MAX ni COUNT (*). Si utiliza DISTINCT, el argumento no puede incluir una expresin aritmtica, slo debe componerse de un nombre de columna, esta palabra clave aparece entre parntesis y antes del nombre de la columna.
USE NEGOCIOS2011 GO
CIBERTEC
CARRERAS PROFESIONALES
46
La funcin AVG () calcula la media aritmtica de un conjunto de valores en un campo especfico de la consulta La media calcula por la funcin AVG es la media aritmtica (la suma de los valores dividido por el nmero de valores). La funcin AVG no incluye ningn campo NULL en el clculo.
USE NEGOCIOS2011 GO
La funcin MAX (expr) y la funcin MIN (expr) devuelven el mximo o mnimo valor de un conjunto de valores contenidos en un campo especfico de una consulta. La expresin (expr) es el campo sobre el que se desea realizar el clculo; expr pueden incluir el nombre de un campo de una tabla, una constante o una funcin (la cual puede ser intrnseca o definida por el usuario pero no otras de las funciones agregadas de SQL).
CARRERAS PROFESIONALES
CIBERTEC
47
USE NEGOCIOS2011 GO
La funcin SUM (expr) retorna la suma del conjunto de valores contenido en un campo especfico de una consulta. La expresin (expr) representa el nombre del campo que contiene los datos que desean sumarse o una expresin que realiza un clculo utilizando los datos de dichos campos.
USE NEGOCIOS2011 GO
SELECT SUM(PRECIOUNIDAD*CANTIDAD) AS 'SUMA' FROM VENTAS.PEDIDOSDETA PD JOIN VENTAS.PEDIDOSCABE PC ON PD.IDPEDIDO = PC.IDPEDIDO WHERE YEAR(FECHAPEDIDO)=2011 GO
1.3.2.2.
Clusula GROUP BY
Agrupa un conjunto de filas seleccionado en un conjunto de filas de resumen por los valores de una o ms columnas o expresiones de SQL Server 2008.
La clusula GROUP BY se utiliza en las instrucciones SELECT para dividir la salida de una tabla en grupos. Puede formar grupos segn uno o varios nombres de columna, o
CIBERTEC
CARRERAS PROFESIONALES
48
segn los resultados de las columnas calculadas utilizando tipos de datos numricos en una expresin. El nmero mximo de columnas o expresiones es 16.
La clusula GROUP BY aparece casi siempre en instrucciones que tambin incluyen funciones agregadas, en cuyo caso el agregado genera un valor para cada grupo. A estos valores se les llama agregados vectoriales. Un agregado escalar es un solo valor generado por una funcin agregada sin una clusula GROUP BY.
Los valores sumarios (agregados vectoriales) generados por las instrucciones SELECT con agregados y una clusula GROUP BY aparecen como columnas en cada fila de los resultados.
USE NEGOCIOS2011 GO
SELECT C.NOMCLIENTE AS 'CLIENTE', COUNT(*) AS 'CANTIDAD', 'SUMA' FROM VENTAS.PEDIDOSDETA PD JOIN VENTAS.PEDIDOSCABE PC ON PD.IDPEDIDO = PC.IDPEDIDO JOIN VENTAS.CLIENTES C ON C.IDCLIENTE = PC.IDCLIENTE GROUP BY C.NOMCLIENTE GO SUM(PRECIOUNIDAD*CANTIDAD) AS
Si incluye la clausula WHERE en una consulta agregada, sta se aplica antes de calcular el valor o la funcin agregada.
USE NEGOCIOS2011 GO
SELECT
CARRERAS PROFESIONALES
CIBERTEC
49
FROM VENTAS.PEDIDOSDETA PD JOIN VENTAS.PEDIDOSCABE PC ON PD.IDPEDIDO = PC.IDPEDIDO JOIN VENTAS.CLIENTES C ON C.IDCLIENTE = PC.IDCLIENTE WHERE YEAR(FECHAPEDIDO)=1996 GROUP BY C.NOMCLIENTE GO
1.3.2.3.
Clusula HAVING
Es posible que necesitemos calcular un agregado, pero que no necesitemos obtener todos los datos, solo los que cumplan una condicin del agregado. Por ejemplo, podemos calcular el valor de las ventas por producto, pero que solo queramos ver los datos de los productos que hayan vendido ms o menos de una determinada cantidad. En estos casos, debemos utilizar la clausula HAVING.
Una vez que GROUP BY ha combinado los registros, HAVING muestra cualquier registro agrupado por la clusula GROUP BY que satisfaga las condiciones de la clusula HAVING.
Ejemplo: Mostrar los clientes cuyo importe total de pedidos (suma de pedidos registrados por cada cliente) sea mayor a 1000.
USE NEGOCIOS2011 GO
SELECT
FROM VENTAS.PEDIDOSDETA PD JOIN VENTAS.PEDIDOSCABE PC ON PD.IDPEDIDO = PC.IDPEDIDO JOIN VENTAS.CLIENTES C ON C.IDCLIENTE = PC.IDCLIENTE GROUP BY C.NOMCLIENTE HAVING SUM(PRECIOUNIDAD*CANTIDAD)>1000 GO
Se utiliza la clusula WHERE para excluir aquellas filas que no desea agrupar y la clusula HAVING para filtrar los registros una vez agrupados.
CIBERTEC
CARRERAS PROFESIONALES
50
Ejemplo: Mostrar los clientes cuyo importe total de pedidos (suma de pedidos registrados por cliente) sea mayor a 1000 siendo registrados en el ao 2011.
USE NEGOCIOS2011 GO
SELECT
FROM VENTAS.PEDIDOSDETA PD JOIN VENTAS.PEDIDOSCABE PC ON PD.IDPEDIDO = PC.IDPEDIDO JOIN VENTAS.CLIENTES C ON C.IDCLIENTE = PC.IDCLIENTE WHERE YEAR(FECHAPEDIDO)=2011 GROUP BY C.NOMCLIENTE HAVING SUM(PRECIOUNIDAD*CANTIDAD)>1000 GO
El nmero y el orden de las columnas deben ser idnticos en todas las consultas.
Sintaxis: { <consulta> | ( <expresin> ) } UNION [ALL] <consulta | (<expresin>) [UNION [ALL] <consulta > | ( <expresin> ) [...n]]
CARRERAS PROFESIONALES
CIBERTEC
51
Argumentos: <consulta > | ( <expresin> ): Es una especificacin o expresin de consulta que devuelve datos que se van a combinar con los datos de otra especificacin o expresin de consulta. No es preciso que las definiciones de las columnas que forman parte de una operacin UNION sean iguales, pero deben ser compatibles a travs de una conversin implcita. Cuando los tipos son los mismos, pero varan en cuanto a precisin, escala o longitud, el resultado se determina segn las mismas reglas para combinar expresiones.
UNION: Especifica que se deben combinar varios conjuntos de resultados para ser devueltos como un solo conjunto de resultados.
ALL: Agrega todas las filas a los resultados. Incluye las filas duplicadas. Si no se especifica, las filas duplicadas se quitan.
Ejemplos: En el siguiente ejemplo, mostrar los productos que tengan el mayor y menor precio, visualice en ambos casos el nombre del producto.
USE NEGOCIOS2011 GO
SELECT NOMPRODUCTO, PRECIOUNIDAD FROM COMPRAS.PRODUCTOS WHERE PRECIOUNIDAD = (SELECT MAX(P.PRECIOUNIDAD) FROM COMPRAS.PRODUCTOS P) UNION SELECT NOMPRODUCTO, PRECIOUNIDAD FROM COMPRAS.PRODUCTOS WHERE PRECIOUNIDAD = (SELECT MIN(P.PRECIOUNIDAD) FROM COMPRAS.PRODUCTOS P) GO
Ejemplos: En el siguiente ejemplo, mostrar la cantidad de pedidos registrados por empleado en el ao 2011 y los empleados que no registraron pedidos en el 2011.
CIBERTEC
CARRERAS PROFESIONALES
52
USE NEGOCIOS2011 GO
SELECT
FROM RRHH.EMPLEADOS E JOIN VENTAS.PEDIDOSCABE P ON E.IDEMPLEADO = P.IDEMPLEADO WHERE YEAR(FECHAPEDIDO)=2011 GROUP BY E.NOMEMPLEADO, E.APEEMPLEADO UNION SELECT E.NOMEMPLEADO, E.APEEMPLEADO, 0 AS 'CANTIDAD' FROM RRHH.EMPLEADOS E WHERE E.IDEMPLEADO NOT IN(SELECT P.IDEMPLEADO FROM VENTAS.PEDIDOSCABE P WHERE YEAR(FECHAPEDIDO)=2011) GO
CUBE genera una agrupacin para todas las permutaciones de expresiones de la <lista de elementos compuestos>. El nmero de agrupaciones generado es igual a (2n), donde n es el nmero de expresiones de la <lista de elementos compuestos>.
USE NEGOCIOS2011 GO
SELECT
CARRERAS PROFESIONALES
CIBERTEC
53
FROM VENTAS.PEDIDOSDETA PD JOIN VENTAS.PEDIDOSCABE PC ON PD.IDPEDIDO = PC.IDPEDIDO JOIN VENTAS.CLIENTES C ON C.IDCLIENTE = PC.IDCLIENTE GROUP BY CUBE( C.NOMBRECLIENTE, YEAR(FECHAPEDIDO) ) GO
Se genera una fila para cada combinacin nica de valores de (cliente, ao), (cliente) y (ao), con un subtotal para cada fila y una fila de total general.
1.3.4.1.
El operador CUBE es una opcin adicional de la clusula GROUP BY en una sentencia SELECT. El operador CUBE se puede aplicar a todas las funciones agregadas, incluidas AVG, SUM, MAX, MIN y COUNT. Se utiliza para producir juegos de resultados que, normalmente, se utilizan para informes de tabulacin cruzada. Mientras ROLLUP produce slo una fraccin de las posibles combinaciones subtotales, CUBE produce subtotales para todas las posibles combinaciones de agrupamientos especificados en la clusula GROUP BY y una suma total.
SELECT [column,] group_function(column). . . FROM table [WHERE condition] [GROUP BY [WITH CUBE] [HAVING having_expression] [ORDER BY column]; group_by_expression]
El operador CUBE se utiliza con una funcin agregada para generar filas adicionales en un juego de resultados. Las columnas incluidas en la clusula GROUP BY tienen referencias cruzadas para producir un super juego de grupos.
Ejemplo: Listar la cantidad de pedidos registrados por cada empleado y ao, totalizando la cantidad de pedidos por cada ao.
CIBERTEC
CARRERAS PROFESIONALES
54
USE NEGOCIOS2011 GO
SELECT
FROM VENTAS.PEDIDOSCABE P JOIN VENTAS.EMPLEADOS E ON P.IDEMPLEADO = E.IDEMPLEADO GROUP BY CUBE( E. NOMEMPLEADO +','+E. APEEMPLEADO, YEAR(P.FECHAPEDIDO)) GO
Al
ejecutar
el
proceso
se
puede
observar que se lista por cada ao y por cada empleado la cantidad de pedidos, visualizando en la lnea 10. La suma de la cantidad de pedidos por dicho ao, luego se inicializa para el siguiente ao.
1.3.4.2.
El operador ROLLUP es til para generar reportes que contienen subtotales y totales. Genera un conjunto de resultados que es similar al conjunto de resultados del CUBE. Las diferencias entre los operadores CUBE y ROLLUP son las siguientes:
CUBE genera un conjunto de resultados mostrando agregaciones para todas las combinaciones de valores en las columnas seleccionadas.
ROLLUP genera un conjunto de resultados mostrando agregaciones para jerarquas en las columnas seleccionadas.
Ejemplo: Mostrar la cantidad de pedidos registrados por cada ao. Al finalizar visualice la cantidad total de pedidos.
CARRERAS PROFESIONALES
CIBERTEC
55
USE NEGOCIOS2011 GO
SELECT
Al usar el operador ROLLUP, se pueden crear agrupamientos en el conjunto de resultados. Para las filas agrupadas, se usa un valor NULL para representar todos los valores para la columna (excepto la columna Sum). Si se usa un comando SELECT sin el operador ROLLUP, el comando generar los siguientes datos cuando se listen las columnas Ed_nombre, Au_nombre, y Titulo (en ese orden) en la clusula GROUP_BY.
Ejemplo: Mostrar la cantidad de pedidos registrados por cada empleado y por ao, al finalizar visualice la cantidad total de pedidos por cada empleado y la cantidad total de todos los pedidos.
USE NEGOCIOS2011 GO
SELECT
FROM TB_PEDIDOSCABE P JOIN TB_EMPLEADOS E ON P.IDEMPLEADO = E.IDEMPLEADO GROUP BY E.APELLIDOS, YEAR(P.FECHAPEDIDO) WITH ROLLUP GO
CIBERTEC
CARRERAS PROFESIONALES
56
En este caso, visualizamos la cantidad de pedidos por empleado en cada ao, totalizando la cantidad de pedidos por empleados (lneas 43, 50 y 54) y el total de todos los pedidos (lnea 55).
CARRERAS PROFESIONALES
CIBERTEC
57
Resumen
Un operador es un smbolo que especifica una accin que se realiza en una o ms expresiones. Los operadores se clasifican en aritmticos, de asignacin, de comparacin, lgicos Las funciones son mtodos que permiten retornar un valor. Las funciones en SQL SERVER se clasifican en: funciones de fechas, de cadena, de conversin. La sentencia INSERT agrega una o varias filas a una tabla o vista en SQL SERVER. Utilizando el comando SELECT, podemos agregar mltiples registros. La sentencia UPDATE se utiliza para cambiar el contenido de los registros de una o varias columnas de una tabla de la base de datos. La sentencia DELETE se utiliza para eliminar uno o varios registros de una misma tabla. En una instruccin DELETE , con mltiples tablas, debe incluir el nombre de tabla (Tabla.*). Si especifica ms de una tabla para eliminar registros, todas deben tener una relacin de muchos a uno. La sentencia SELECT recupera las filas de la base de datos y habilita la seleccin de una o varias filas o columnas de una o varias tablas en SQL Server 2008. La instruccin MERGE nos permite realizar mltiples acciones sobre una tabla tomando uno o varios criterios de comparacin, es decir, realiza operaciones de insercin, actualizacin o eliminacin en una tabla de destino segn los resultados de una combinacin con una tabla de origen. La sentencia JOIN , en el lenguaje de consulta, permite combinar registros de dos o ms tablas en una base de datos relacional. La sentencia JOIN se pueden especificar en las clusulas FROM o WHERE, aunque se recomienda que se especifiquen en la clusula FROM. La clusula INNER JOIN permite la combinacin de los registros de las tablas, comparando los valores de la columna especfica en ambas tablas. La sentencia LEFT JOIN retorna la pareja de todos los valores de la izquierda con los valores de la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no correspondencia. El operador RIGHT JOIN indica que todas las filas de la segunda tabla se deben incluir en los resultados, con independencia si hay datos coincidentes en la primera tabla. Los resultados de consultas se pueden resumir, agrupar y ordenar utilizando funciones agregadas y las clusulas GROUP BY, HAVING y ORDER BY con la instruccin SELECT. Tambin, se puede usar la clusula compute (una extensin Transact-SQL) con funciones agregadas para generar un informe con filas detalladas y resumidas.
CIBERTEC
CARRERAS PROFESIONALES
58
La operacin UNION combina los resultados de dos o ms consultas en un solo conjunto de resultados que incluye todas las filas que pertenecen a las consultas de la unin. La operacin UNION es distinta de la utilizacin de combinaciones de columnas de dos tablas El operador CUBE genera un conjunto de resultados que es un cubo multidimensional. Este operador genera filas de agregado mediante la clusula GROUP BY simple, filas de supe agregado mediante la instruccin ROLLUP y filas de tabulacin cruzada. El operador ROLLUP es til para generar reportes que contienen subtotales y totales, genera un conjunto de resultados que es similar al conjunto de resultados del CUBE. Las diferencias entre los operadores CUBE y ROLLUP son las siguientes: CUBE genera un conjunto de resultados mostrando agregaciones para todas las combinaciones de valores en las columnas seleccionadas. ROLLUP genera un conjunto de resultados mostrando agregaciones para jerarquas en las columnas seleccionadas.
Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas.
http://www.sqlmax.com/centro/moduloIII_3.asp?MX= Aqu hallar los conceptos de tcnicas avanzadas de consulta de datos. http://msdn.microsoft.com/es-es/library/ms180026.aspx En esta pgina, hallar los conceptos de la sentencia UNION. Error! Referencia de hipervnculo no vlida.www.devjoker.com Aqu hallar los conceptos de programacin TRANSACT SQL. http://manuals.sybase.com/onlinebooks/groupasarc/svs11001/tsqlsp/@Generic__BookTocView/2367;hf=0;pt=2367;lang=es En esta pgina, hallar los conceptos de lenguaje de consulta.
CARRERAS PROFESIONALES
CIBERTEC
59
UNIDAD DE APRENDIZAJE
PROGRAMACIN TRANSACT-SQL
LOGRO DE LA UNIDAD DE APRENDIZAJE Al trmino de la unidad, el alumno escribe rutinas complejas utilizando sentencias TRANSACT-SQL para recupera, inserta, actualiza y elimina informacin de una base de datos.
TEMARIO 1. Fundamentos de Programacin TRANSACT-SQL 2. Construcciones de Programacin TRANSACT-SQL 2.1. Variables 2.1.1. Variables Locales 2.1.2. Variables Pblicas 2.2. Herramientas para el control de flujos 2.2.1. Estructuras de control IF 2.2.2. Estructura condicional CASE 2.2.2.1. Usar una instruccin SELECT con una expresin CASE de bsqueda 2.2.3. Estructura de control WHILE 2.3. Control de errores en TRANSACT-SQL 2.3.1. Funciones especiales de ERROR 2.3.2. Variable de sistema @@ERROR 2.3.3. Generar un error RAISERROR 2.4. Cursores en TRANSACT-SQL 2.4.1. DECLARE Cursor 2.4.2. Abrir un Cursor: OPEN 2.4.3. Leer un Registro: FETCH 2.4.4. Cerrar el Cursor: CLOSE 2.4.5. Liberar los recursos: DEALLOCATE
ACTIVIDADES PROPUESTAS Los alumnos implementan sentencias SQL utilizando estructuras de programacin para recuperar y actualizar datos Los alumnos implementan sentencias SQL definiendo sentencias de control de errores. Los alumnos implementan listados y consultas de datos con totales y subtotales utilizando cursores.
CIBERTEC
CARRERAS PROFESIONALES
60
CARRERAS PROFESIONALES
CIBERTEC
61
2.1
SQL es un lenguaje de consulta para los sistemas de bases de datos relacinales, pero que no posee la potencia de los lenguajes de programacin. No permite el uso de variables, estructuras de control de flujo, bucles y dems elementos caractersticos de la programacin. No es de extraar, SQL es un lenguaje de consulta, no un lenguaje de programacin.
Sin embargo, SQL es la herramienta ideal para trabajar con bases de datos. Cuando se desea realizar una aplicacin completa para el manejo de una base de datos relacional, resulta necesario utilizar alguna herramienta que soporte la capacidad de consulta del SQL y la versatilidad de los lenguajes de programacin tradicionales. TRANSACT SQL es el lenguaje de programacin que proporciona Microsoft SQL Server para extender el SQL estndar con otro tipo de instrucciones y elementos propios de los lenguajes de programacin.
TRANSACT-SQL ampla el SQL estndar con la implementacin de estructuras de programacin. Estas implementaciones le resultarn familiares a los desarrolladores con experiencia en C++, Java, Visual Basic .NET, C# y lenguajes similares. A continuacin, vamos a definir las estructuras de programacin implementadas en SQL Server.
2.1.2
VARIABLES
Una variable es una entidad a la que se asigna un valor. Este valor puede cambiar durante el proceso donde se utiliza la variable. SQL Server tiene dos tipos de variables: locales y globales. Las variables locales estn definidas por el usuario, mientras que las variables globales las suministra el sistema y estn predefinidas.
2.1.2.1 Variables Locales Las variables locales se declaran, nombran y escriben mediante la palabra clave declare, y reciben un valor inicial mediante una instruccin select o set.
CIBERTEC
CARRERAS PROFESIONALES
62
Los nombres de las variables locales deben empezar con el smbolo @. A cada variable local se le debe asignar un tipo de dato definido por el usuario o un tipo de dato suministrado por el sistema distinto de text, image o sysname. Sintaxis:
En el ejemplo siguiente, declaramos una variable y le asignamos un valor, la cual ser utilizada en una clausula WHERE.
DECLARE @PRECIO DECIMAL SET @PRECIO = 50 SELECT * FROM COMPRA.PRODUCTOS WHERE P.PRECIOUNIDAD > GO @PRECIO
Podemos utilizar la instruccin SELECT en lugar de la instruccin SET. Una instruccin SELECT utilizada para asignar valores a una o ms variables se denomina SELECT de asignacin. Si utilizamos el SELECT de asignacin, no puede devolver valores al cliente como un conjunto de resultados.
En el ejemplo siguiente, declaramos dos variables y le asignamos el mximo y mnimo precio desde la tabla Compras.productos.
USE NEGOCIOS2011 GO
DECLARE @MX DECIMAL, @MN DECIMAL SELECT @MX=MAX(PRECIOUNIDAD), @MN=MIN(PRECIOUNIDAD) FROM COMPRAS.PRODUCTOS
CARRERAS PROFESIONALES
CIBERTEC
63
Las variables globales son variables predefinidas suministradas por el sistema. Se distinguen de las variables locales por tener dos smbolos @. Estas son algunas variables globales del servidor:
Variable @@ERROR
Contenido Contiene 0 si la ltima transaccin se ejecut de forma correcta; en caso contrario, contiene el ltimo nmero de error generado por el sistema. La variable global @@error se utiliza generalmente para verificar el estado de error de un proceso ejecutado.
@@IDENTITY
Contiene el ltimo valor insertado en una columna IDENTITY mediante una instruccin insert
Devuelve la Versin del SQL Server Devuelve el Nombre del Servidor Devuelve el nombre del idioma en uso Retorna la cantidad mxima de conexiones permitidas
CIBERTEC
CARRERAS PROFESIONALES
64
2.2
El lenguaje de control de flujo se puede utilizar con instrucciones interactivas, en lotes y en procedimientos almacenados. El control de flujo y las palabras clave relacionadas y sus funciones son las siguientes:
Funcin Define una ejecucin condicional, cuando la condicin la condicin es verdadera y la alternativa (else) cuando la condicin es falsa
CASE
Es la forma ms sencilla de realizar operaciones de tipo IFELSE IF-ELSE IF-ELSE. La estructura CASE permite evaluar una expresin y devolver un valor alternativo
WHILE
BEGIN END
Define un bloque de instrucciones. El uso del BEGINEND permite ejecutar un bloque o conjunto de instrucciones.
Declara variables locales Sale del final del siguiente bucle while ms interno Reinicia del bucle while Sale de forma incondicional, almacenados suele o utilizarse en
procedimientos
desencadenantes.
Opcionalmente, se puede definir un numero entero como estado devuelto, que puede asignarse al ejecutar el procedimiento almacenado PRINT Imprime un mensaje definido por el usuario o una variable local en la pantalla del usuario /*COMENTARIO*/ Inserta un comentario en cualquier punto de una instruccin SQL --COMENTARIO Inserta una lnea de comentario en cualquier punto de una instruccin SQL
CARRERAS PROFESIONALES
CIBERTEC
65
IF (<expression>) BEGIN ... END ELSE IF (<expression>) BEGIN ... END ELSE BEGIN ... END
Ejemplo: Visualice un mensaje donde indique si un empleado (ingrese su codigo) ha realizado pedidos.
DECLARE @IDEMP INT, @CANTIDAD INT SET @IDEMP = 6 --RECUPERAR LA CANTIDAD DE PEDIDOS DEL EMPLEADO DE CODIGO 6 SELECT @CANTIDAD = COUNT(*) FROM VENTAS.PEDIDOSCABE WHERE IDEMPLEADO = @IDEMP --EVALUA EL VALOR DE CANTIDAD IF @CANTIDAD = 0 PRINT 'EL EMPLEADO NO HA REALIZADO ALGUN PEDIDO' ELSE IF @CANTIDAD = 1 PRINT 'HA REGISTRADO 1 PEDIDO, CONTINUE TRABAJANDO' ELSE PRINT 'HA REGISTRADO PEDIDOS' GO
CIBERTEC
CARRERAS PROFESIONALES
66
Ejemplo: utilizamos la estructura IF para evaluar la existencia de un registro; si existe actualizamos los datos de la tabla; si no existe (ELSE) insertamos el registro.
DECLARE @COPAIS VARCHAR(3), @NOMBRE VARCHAR(50) SET @COPAIS = '99' SET @NOMBRE = 'ESPAA' --EVALUA SI EXISTE EL REGISTRO DE LA TABLA, SI EXISTE ACTUALIZO, SINO INSERTO IF EXISTS(SELECT * FROM TB_PAISES WHERE IDPAIS = @COPAIS) BEGIN UPDATE TB_PAISES SET NOMBREPAIS = @NOMBRE WHERE IDPAIS = @COPAIS END ELSE BEGIN INSERT INTO TB_PAISES VALUES (@COPAIS, @NOMBRE) END GO
CARRERAS PROFESIONALES
CIBERTEC
67
Ejemplo: Declare una variable donde le asigne el numero del mes, evale el valor de la variable y retorne el mes en letras.
DECLARE @M INT, @MES VARCHAR(20) SET @M=4 SET @MES = (CASE @M WHEN 1 WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN WHEN 2 3 4 5 6 7 8 9 10 11 12 THEN 'ENERO' THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN THEN 'FEBRERO' 'MARZO' 'ABRIL' 'MAYO' 'JUNIO' 'JULIO' 'AGOSTO' 'SETIEMBRE' 'OCTUBRE' 'NOVIEMBRE' 'DICIEMBRE'
La estructura CASE se puede utilizar en cualquier instruccin o clusula que permite una expresin vlida. Por ejemplo, puede utilizar CASE en instrucciones como SELECT, UPDATE, DELETE y SET, y en clusulas como select_list, IN, WHERE, ORDER BY y HAVING. La funcin CASE es una expresin especial de Transact SQL que permite que se muestre un valor alternativo dependiendo de una columna. Este cambio es temporal, con lo que no hay cambios permanentes en los datos.
Ejemplo: Mostrar los datos de los empleados evaluando el valor del campo tratamiento asignando, para cada valor, una expresin.
CIBERTEC
CARRERAS PROFESIONALES
68
USE NEGOCIOS2011; GO
SELECT (CASE TRATAMIENTO WHEN 'SRTA.' THEN 'SEORITA' WHEN 'SR.' THEN 'SEOR' WHEN 'DR.' THEN 'DOCTOR' WHEN 'SRA.' THEN 'SEORA' ELSE 'NO TRATAMIENTO' END),APELLIDOS, NOMBRE FROM RRHH.EMPLEADOS ORDER BY 1; GO
2.2.2.1 Usar una instruccin SELECT con una expresin CASE de bsqueda En una instruccin SELECT, la expresin CASE de bsqueda permite sustituir valores en el conjunto de resultados basndose en los valores de comparacin. En el ejemplo siguiente, listamos los datos de los productos y definimos una columna llamada ESTADO, el cual evaluar stock de cada producto imprimiendo un valor: Stockeado, Limite, Haga una solicitud.
SELECT NOMBREPRODUCTO, PRECIOUNIDAD, UNIDADESENEXISTENCIA, 'ESTADO'= (CASE WHEN UNIDADESENEXISTENCIA>@STOCK THEN 'STOCKEADO' WHEN UNIDADESENEXISTENCIA=@STOCK THEN 'LIMITE' WHEN UNIDADESENEXISTENCIA<@STOCK THEN 'HAGA UNA SOLICITUD' END) FROM TB_PRODUCTOS GO
CARRERAS PROFESIONALES
CIBERTEC
69
Por ejemplo: Implemente un programa que permita listar los 100 primeros nmeros enteros, visualizando en cada caso si es par o impar.
DECLARE @contador int SET @contador = 0 WHILE (@contador < 100) BEGIN SET @contador = @contador + 1 IF @contador %2 =0 PRINT cast(@contador AS varchar) +' es un Nmero Par' ELSE PRINT cast(@contador AS varchar) + ' es un Nmero Impar' END
CIBERTEC
CARRERAS PROFESIONALES
70
DECLARE @COUNTER INT = 1; WHILE @COUNTER < 6 BEGIN SELECT TOP(1) P.IDPRODUCTO, P.NOMBREPRODUCTO, P.PRECIOUNIDAD FROM COMPRAS.PRODUCTOS P WHERE IDPRODUCTO = @COUNTER SET @COUNTER += 1; END;
BREAK y CONTINUE controlan el funcionamiento de las instrucciones dentro de un bucle WHILE. BREAK permite salir del bucle WHILE. CONTINUE hace que el bucle WHILE se inicie de nuevo. La sintaxis de BREAK y CONTINUE es:
[BREAK] [EXPRESION_SQL]
Por ejemplo: Actualizar las unidades de existencia de los productos asignndoles el valor de 1000 de aquellos productos cuyo stock sea cero.
USE NEGOCIOS2011 GO
DECLARE @ID INT, @NOMBRE VARCHAR(50) WHILE EXISTS (SELECT * FROM TB_PRODUCTOS WHERE UNIDADESENEXISTENCIA=0)
CARRERAS PROFESIONALES
CIBERTEC
71
BEGIN SELECT TOP 1 @ID= P.IDPRODUCTO, @NOMBRE=P.NOMBREPRODUCTO FROM TB_PRODUCTOS P WHERE UNIDADESENEXISTENCIA=0
2.3
SQL Server proporciona el control de errores a travs de las instrucciones TRY y CATCH. Estas nuevas instrucciones suponen un gran paso adelante en el control de errores en SQL Server. La sintaxis de TRY CATCH es la siguiente:
BEGIN TRY EXPRESION_SQL END TRY BEGIN CATCH EXPRESION_SQL END CATCH
Ejemplo: Implemente un programa que evala la divisin de dos nmeros enteros.Si la divisin ha sido exitosa, imprima un mensaje: NO HAY ERROR. Caso contrario imprimir un mensaje: SE HA PRODUCIDO UN ERROR
BEGIN TRY DECLARE @DIVISOR INT, @DIVIDENDO INT, @RESULTADO INT SET @DIVIDENDO = 100 SET @DIVISOR = 9
CIBERTEC
CARRERAS PROFESIONALES
72
-- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0 SET @RESULTADO = @DIVIDENDO/@DIVISOR PRINT 'NO HAY ERROR' END TRY BEGIN CATCH PRINT 'SE HA PRODUCIDO UN ERROR' END CATCH;
bloque CATCH para la obtencin de informacin detallada del error. A continuacin, presentamos las funciones que se utilizan en el control de errores
Descripcin Devuelve el numero de error Devuelve la severidad del error Devuelve el estado del error Devuelve el nombre del procedimiento almacenado que ha provocado el error
ERROR_LINE()
ERROR_MESSAGE()
Ejemplo: Implemente un programa que evala la divisin de dos nmeros enteros. Si la divisin ha sido exitosa, imprima un mensaje: NO HAY ERROR. Caso contrario imprimir el mensaje de error y el estado del error
BEGIN TRY DECLARE @DIVISOR INT, @DIVIDENDO INT, @RESULTADO INT SET @DIVIDENDO = 100 SET @DIVISOR = 9 -- ESTA LINEA PROVOCA UN ERROR DE DIVISION POR 0 SET @RESULTADO = @DIVIDENDO/@DIVISOR PRINT 'NO HAY ERROR' END TRY
CARRERAS PROFESIONALES
CIBERTEC
73
Ejemplo: Implemente un bloque de instrucciones que permita eliminar un registro de Cliente por su cdigo. Si hay un error en el proceso, visualice un mensaje de error
DELETE FROM VENTAS.CLIENTES WHERE IDCLIENTE = 'ALFKI' IF @@ERROR<>0 PRINT 'NO SE PUEDE ELIMINAR'
Otra forma de implementar este proceso, es controlndolo a travs del bloque TRY CATCH.
BEGIN TRY DELETE FROM TB_CLIENTES WHERE IDCLIENTE = 'ALFKI' END TRY BEGIN CATCH IF @@ERROR=547 PRINT 'NO SE PUEDE ELIMINAR ESTE CLIENTE' END CATCH
La variable @@ERROR devuelve un nmero de error que representa el error de la operacin. Si el error se encuentra en la vista de catlogo sys.sysmessages, entonces @@ERROR, contendr el valor de la columna sys.sysmessages.error para dicho error. Puede ver el texto asociado con el nmero de error @@ERROR en sys.sysmessages.description
CIBERTEC
CARRERAS PROFESIONALES
74
Ejemplo: Implemente un proceso que elimine los productos cuyo valor de sus unidades en existencia, sea menor a 20, en caso de no ejecutar exitosamente el error, implemente el CATCH para controlar el error.
BEGIN TRY DELETE FROM TB_PRODUCTOS WHERE UNIDADESENEXISTENCIA<20 END TRY BEGIN CATCH DECLARE @MENSAJE VARCHAR(255) --RECUPERAR LA DESCRIPCION DEL VALOR DE @@ERROR SELECT @MENSAJE= M.DESCRIPTION FROM SYS.SYSMESSAGES M WHERE M.ERROR=@@ERROR PRINT @MENSAJE END CATCH
La funcin RAISERROR recibe tres parmetros, el mensaje del error (o cdigo de error predefinido), la severidad y el estado.
La severidad indica el grado de criticidad del error. Admite valores de 0 al 25, pero solo podemos asignar valores del 0 al 18. Los errores el 20 al 25 son considerados fatales por el sistema, y cerraran la conexin que ejecuta el comando RAISERROR. Para asignar valores del 19 al 25, necesitaremos ser miembros de la funcin de SQL Server sysadmin.
En el presente ejercicio, evaluamos los valores de dos variables provocando un error utilizando RAISERROR.
CARRERAS PROFESIONALES
CIBERTEC
75
DECLARE @TIPO INT, @CLASIFICACION INT SET @TIPO = 1 SET @CLASIFICACION = 3 IF (@TIPO = 1 AND @CLASIFICACION = 3) BEGIN RAISERROR ('EL TIPO NO PUEDE VALER UNO Y LA CLASIFICACION 3', 16, -- SEVERIDAD 1 ) END -- ESTADO
2.4
CURSORES EN TRANSACT-SQL
Un cursor es una variable que nos permite recorres con un conjunto de resultados obtenidos a travs de una sentencia SELECT fila por fila.
El uso de los cursores es una tcnica que permite tratar fila por fila el resultado de una consulta, contrariamente al SELECT SQL que trata a un conjunto de fila. Los cursores pueden ser implementador por instrucciones TRANSACT-SQL (cursores ANSI-SQL) o por la API OLE-DB.
Se utilizarn los cursores ANSI cuando sea necesario tratar las filas de manera individual en un conjunto o cuando SQL no pueda actuar nicamente sobre las filas afectadas. Los cursores API sern utilizados por las aplicaciones cliente para tratar volmenes importantes o para gestionar varios conjuntos de resultados.
Declarar el cursor, utilizando DECLARE Abrir el cursor, utilizando OPEN Leer los datos del cursor, utilizando FETCH ... INTO Cerrar el cursor, utilizando CLOSE Liberar el cursor, utilizando DEALLOCATE
CIBERTEC
CARRERAS PROFESIONALES
76
WHILE (@@FETCH_STATUS = 0) BEGIN -- LECTURA DE LA SIGUIENTE FILA DE UN CURSOR FETCH <NOMBRE_CURSOR> INTO <LISTA_VARIABLES> ... END -- FIN DEL BUCLE WHILE
-- DECLARACIN DEL CURSOR DECLARE <NOMBRE_CURSOR> [INSENSITIVE][SCROLL] CURSOR FOR <SENTENCIA_SQL> FOR [READ ONLY | UPDATE[ OF LISTA DE COLUMNAS]]
CARRERAS PROFESIONALES
CIBERTEC
77
INSENSITIVE solo se permiten las operaciones sobre la fila siguiente SCROLL los desplazamientos en las filas del cursor podrn hacerse en todos los sentidos. UPDATE especifica que las actualizaciones se harn sobre la tabla de origen del cursor. Un cursor INSENSITIVE con una clusula ORDER BY no puede actualizarse. Un cursor con ORDER BY, UNION, DISTINCT o HAVING es INSENSITIVE y READ ONLY.
Adems de esta sintaxis conforme con la norma ISO, TRANSACT-SQL propone una sintaxis ampliada en la definicin de los cursores:
DECLARE <nombre_cursor> [LOCAL | GLOBAL ] FORWARD_ONLY | SCROLL ] [STATIC | KEYSET | DYNAMIC | FAST_FOWARD ] [READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [TYPE_WARNING] FOR <sentencia_sql> {FOR UPDATE [ OF lista de columnas ]}
LOCAL el alcance del cursor es local en el lote, el procedimiento o la funcin en curso de ejecucin en el que est definido el curso. GLOBAL el alcance del cursor el global a la conexin. La opcin de base de datos default to local cursor est definido en falso de manera
predeterminada. FOWARD_ONLY los datos se extraen del cursor por orden de aparicin (del primero al ltimo). STATIC se realiza una copia temporal de los datos en la base de datos tempdb para que el cursor no se vea afectado por las modificaciones que puedan realizarse sobre la base de datos. KEYSET las filas y su orden en el cursor se fijan en el momento de la apertura del cursor. Las referencias hacia cada una de estas filas de informacin se conservan en una tabla temporal en tempdb. DYNAMIC el cursor refleja exactamente los datos presentes en la base de datos. Esto significa que el nmero de filas, su orden y su valor pueden variar de forma dinmica.
CIBERTEC
CARRERAS PROFESIONALES
78
FAST_FORWARD permite definir un cursor hacia adelante y como slo lectura (FORWARD_ONLY y READ_ONLY). SCROLL_LOCKS permite garantizar el xito de las instrucciones UPDATE y DELETE que pueden ser ejecutadas en relacin al cursor. Con este tipo de cursor, se fija un bloqueo en la apertura para evitar que otra transaccin trate de modificar los datos.
OPTIMISTIC con esta opcin, puede que una operacin de UPDATE o DLETE realizada en el cursor no pueda ejecutarse correctamente, porque otra transaccin haya modificado los datos en paralelo.
TYPE_WARNING se enva un mensaje (warning) a la aplicacin cliente, si se efectan conversiones implcitas de tipo.
Teniendo en cuenta el espacio en disco y la memoria utilizada, y el bloqueo eventual de los datos en la apertura del cursor, esta operacin debe ser ejecutada lo ms cerca posible del tratamiento de los datos extrados del cursor.
Sintaxis:
Sintaxis:
CARRERAS PROFESIONALES
CIBERTEC
79
FETCH [NEXT | PRIOR | LAST | ABSOLUTE n | RELATIVE n ] [FROM] [GLOBAL ] <nombre del cursor> [INTO lista de variables ] NEXT
NEXT lee la fila siguiente (nica opcin posible para los INSENSITIVE CURSOR). PRIOR lee la fila anterior FIRST lee la primera fila LAST lee la ltima fila ABSOLUTE n lee la ensima fila del conjunto RELATIVE n lee la ensima fila a partir de la fila actual.
Cuando trabajamos con cursores, la funcin @@FETCH_STATUS nos indica el estado de la ltima instruccin FETCH emitida. Los valores posibles son los siguientes:
Valor devuelto 0 -1
Descripcin La instruccin FETCH se ejecut correctamente La instruccin FETCH no se ejecut correctamente o la fila estaba ms all del conjunto de resultados.
-2
CLOSE <nombre_cursor>
Despus de cerrado el cursor, ya no es posible capturarlo o actualizarlo/eliminarlo. Al cerrar el cursor se elimina su conjunto de claves dejando la definicin del cursor intacta, es decir, un cursor cerrado puede volver a abrirse sin tener que volver a declararlo.
CIBERTEC
CARRERAS PROFESIONALES
80
DEALLOCATE
<nombre_cursor>
Ejemplo 2: Trabajando con un cursor dinmico, defina un cursor dinmico que permita visualizar: el primer registro, el registro en la posicin 6 y el ltimo registro.
CARRERAS PROFESIONALES
CIBERTEC
81
-- IMPRIMIR LOS REGISTROS FETCH FIRST FROM MI_CURSOR FETCH ABSOLUTE 6 FROM MI_CURSOR
Ejemplo: Trabajando con un cursor, listar los clientes registrados en la base de datos, incluya el nombre del pas.
-- DECLARO VARIABLES DE TRABAJO DECLARE @ID VARCHAR(5), @NOMBRE VARCHAR(50), @PAIS VARCHAR(50)
-- MIENTRAS PUEDA LEER EL REGISTRO WHILE @@FETCH_STATUS=0 BEGIN --IMPRIMIR EL REGISTRO PRINT @ID + ','+@NOMBRE+','+@PAIS --LEER EL REGISTRO SIGUIENTE FETCH MI_CURSOR INTO @ID, @NOMBRE, @PAIS END
CIBERTEC
CARRERAS PROFESIONALES
82
Ejemplo: Trabajando con un cursor, listar la relacin de los clientes que han registrado pedidos. En dicho proceso, debemos imprimir el nombre del cliente, la cantidad de pedidos registrados y al finalizar totalizar el proceso (suma total de todos los pedidos).
SET @TOTAL=0
C.NOMBRECIA, COUNT(*)
-- MIENTRAS PUEDA LEER EL REGISTRO WHILE @@FETCH_STATUS=0 BEGIN -- IMPRIMIR EL REGISTRO PRINT @NOMBRE+','+CAST(@Q AS VARCHAR) -- ACUMULAR SET @TOTAL += @Q -- LEER EL REGISTRO SIGUIENTE FETCH MI_CURSOR INTO @NOMBRE, @Q END
CARRERAS PROFESIONALES
CIBERTEC
83
GO
Ejemplo: Trabajando con un cursor, imprimir un listado de los pedidos realizados por cada ao. En dicho proceso, listar por cada ao los pedidos registrados y totalizando dichos pedidos por dicho ao.
-- DECLARO VARIABLES DE TRABAJO DECLARE DECIMAL @Y INT, @Y1 INT, @PEDIDO INT, @MONTO DECIMAL, @TOTAL
SET @TOTAL=0
-- DECLARO EL CURSOR DECLARE MI_CURSOR CURSOR FOR SELECT YEAR(FECHAPEDIDO), PC.IDPEDIDO, SUM(PRECIOUNIDAD*CANTIDAD) FROM VENTAS.PEDIDOSCABE C JOIN VENTAS.PEDIDOSDETA D ON C.IDPEDIDO=D.IDPEDIDO GROUP BY YEAR(FECHAPEDIDO), PC.IDPEDIDO ORDER BY 1
CIBERTEC
CARRERAS PROFESIONALES
84
-- MIENTRAS PUEDA LEER EL REGISTRO WHILE @@FETCH_STATUS=0 BEGIN -- SI COINCIDEN LOS VALORES ACUMULAR EL TOTAL IF(@Y = @Y1) SET @TOTAL += @MONTO ELSE -- SI NO COINCIDEN IMPRIMIR EL TOTAL, INICIALIZAR VARIABLES BEGIN PRINT 'IMPORTE EN:' +CAST(@Y1 AS VARCHAR) + SPACE(2)+ 'ES ' +CAST(@TOTAL AS VARCHAR) PRINT 'AO:' + CAST(@Y AS VARCHAR) SET @Y1=@Y SET @TOTAL=@MONTO END -- IMPRIMIR EL REGISTRO PRINT CAST(@PEDIDO AS VARCHAR) + SPACE(5)+STR(@MONTO) -- LEER EL REGISTRO SIGUIENTE FETCH MI_CURSOR INTO @Y, @PEDIDO, @MONTO END
CARRERAS PROFESIONALES
CIBERTEC
85
Para actualizar los datos de un cursor, debemos especificar la clusula FOR UPDATE despus de la sentencia SELECT en la declaracin del cursor, y WHERE CURRENT OF <nombre_cursor> en la sentencia UPDATE.
En el ejemplo siguiente, actualizamos el precio de los productos: si su stock es mayor o igual a 1000, se descuenta el precio al 50%, sino se descuenta el precio al 20%.
-- DECLARACION DE VARIABLES PARA EL CURSOR DECLARE @ID INT, @NOMBRE VARCHAR(255), @PRECIO DECIMAL, @ST INT
-- DECLARACIN DEL CURSOR DE ACTUALIZACION DECLARE CPRODUCTO CURSOR FOR SELECT IDPRODUCTO, NOMBREPRODUCTO, PRECIOUNIDAD, UNIDADESENEXISTENCIA FROM TB_PRODUCTOS FOR UPDATE
-- LECTURA DE LA PRIMERA FILA DEL CURSOR FETCH CPRODUCTO INTO @ID, @NOMBRE, @PRECIO, @ST
UPDATE TB_PRODUCTOS
--IMPRIMIR PRINT 'EL PRECIO DE PRODUCTO '+ @NOMBRE+ ' ES ' + STR(@PRECIO)
CIBERTEC
CARRERAS PROFESIONALES
86
-- LECTURA DE LA SIGUIENTE FILA DEL CURSOR FETCH CPRODUCTO INTO @ID, @NOMBRE, @PRECIO, @ST END
CARRERAS PROFESIONALES
CIBERTEC
87
Resumen
SQL es un lenguaje de consulta para los sistemas de bases de datos relacinales, pero que no posee la potencia de los lenguajes de programacin. No permite el uso de variables, estructuras de control de flujo, bucles y dems elementos caractersticos de la programacin. TRANSACT-SQL ampla el SQL estndar con la implementacin de estructuras de programacin. Estas implementaciones le resultarn familiares a los
desarrolladores con experiencia en C++, Java, Visual Basic .NET, C# y lenguajes similares. Una variable es una entidad a la que se asigna un valor. Este valor puede cambiar durante el proceso donde se utiliza la variable. SQL Server tiene dos tipos de variables: locales y globales. Las variables locales estn definidas por el usuario, mientras que las variables globales las suministra el sistema y estn predefinidas. La estructura condicional IF se utiliza para definir una condicin que determina si se ejecutar la instruccin siguiente. La instruccin SQL se ejecuta si la condicin se cumple, es decir, si devuelve TRUE (verdadero). La palabra clave ELSE introduce una instruccin SQL alternativa que se ejecuta cuando la condicin IF devuelva FALSE. La estructura CASE evala una lista de condiciones y devuelve una de las varias expresiones de resultado posibles. La expresin CASE tiene dos formatos: La expresin CASE sencilla compara una expresin con un conjunto de expresiones sencillas para determinar el resultado. La expresin CASE buscada evala un conjunto de expresiones booleanas para determinar el resultado. La estructura WHILE ejecuta en forma repetitiva un conjunto o bloque de instrucciones SQL siempre que la condicin especificada sea verdadera. Se puede controlar la ejecucin de instrucciones en el bucle WHILE con las palabras clave BREAK y CONTINUE. BREAK y CONTINUE controlan el funcionamiento de las instrucciones dentro de un bucle WHILE. BREAK permite salir del bucle WHILE. CONTINUE hace que el bucle WHILE se inicie de nuevo.
CIBERTEC
CARRERAS PROFESIONALES
88
SQL Server proporciona el control de errores a travs de las instrucciones TRY y CATCH. Estas nuevas instrucciones suponen un gran paso adelante en el control de errores en SQL Server. La variable @@ERROR devuelve el nmero de error de la ltima instruccin TRANSACT-SQL ejecutada; si la variable devuelve 0, la TRANSACT-SQL anterior no encontr errores. Si el error se encuentra en la vista de catlogo sys.sysmessages, entonces @@ERROR contendr el valor de la columna sys.sysmessages.error para dicho error. Puede ver el texto asociado con el nmero de error @@ERROR en sys.sysmessages.description. Un cursor es una variable que nos permite recorres con un conjunto de resultados obtenidos a travs de una sentencia SELECT fila por fila. Se utilizarn los cursores ANSI cuando sea necesario tratar las filas de manera individual en un conjunto o cuando SQL no pueda actuar nicamente sobre las filas afectadas. Los cursores API sern utilizados por las aplicaciones cliente para tratar volmenes importantes o para gestionar varios conjuntos de resultados Cuando trabajemos con cursores, debemos seguir los siguientes pasos:
Declarar el cursor, utilizando DECLARE Abrir el cursor, utilizando OPEN Leer los datos del cursor, utilizando FETCH ... INTO Cerrar el cursor, utilizando CLOSE Liberar el cursor, utilizando DEALLOCATE
Para actualizar los datos de un cursor debemos especificar la clusula FOR UPDATE despus de la sentencia SELECT en la declaracin del cursor, y WHERE CURRENT OF <nombre_cursor> en la sentencia UPDATE.
Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas.
http://www.devjoker.com/contenidos/catss/240/Cursores-en-Transact-SQL.aspx Aqu hallar los conceptos de cursores TRANSACT SQL. http://www.a2sistemas.com/blog/2009/02/06/uso-de-cursores-en-transact-sql/ En esta pgina, hallar los conceptos y ejercicios de Cursores http://www.devjoker.com/gru/Tutorial-Transact-SQL/TSQL/Tutorial-TransactSQL.aspx Aqu hallar los conceptos de programacin TRANSACT SQL.
CARRERAS PROFESIONALES
CIBERTEC
89
UNIDAD DE APRENDIZAJE
TEMARIO
1. Funciones definidas por el usuario 1.1. Funciones escalares 1.2. Funciones de tabla en lnea 1.3. Funciones de tabla de multi sentencias 1.4. Limitaciones 2. Procedimientos almacenados 2.1. Especificar parmetros 2.2. Uso de cursores en procedimientos almacenados 2.3. Modificar datos con procedimientos almacenados 2.4. Transacciones en TRANSACT-SQL 2.4.1. Transacciones implcitas y explcitas 3. Triggers o disparadores 3.1. Definicin de trigger 3.2. Creacin de disparadores 3.2.1. Funcionamiento de los disparadores 3.3. Uso de INSTEAD OF
ACTIVIDADES PROPUESTAS
Los alumnos programan objetos de base de datos para recuperar datos. Los alumnos programan objetos de base de datos utilizando TRANSACT-SQL para recuperar y actualizar datos.
CIBERTEC
CARRERAS PROFESIONALES
90
CARRERAS PROFESIONALES
CIBERTEC
91
Las funciones definidas por el usuario, en tiempo de ejecucin de lenguaje TRANSACT-SQL o comn (CLR), acepta parmetros, realiza una accin, como un clculo complejo, y devuelve el resultado de esa accin como un valor. El valor de retorno puede ser un escalar (nico) valor o una tabla.
Las funciones de usuario son definidas para crear una rutina reutilizables que se pueden utilizar en las siguientes maneras:
En TRANSACT-SQL como SELECT En las aplicaciones de llamar a la funcin En la definicin de otra funcin definida por el usuario Para parametrizar una vista o mejorar la funcionalidad de una vista indizada Para definir una columna en una tabla Para definir una restriccin CHECK en una columna Para reemplazar a un procedimiento almacenado
Las funciones de usuario, segn el tipo de retorno se clasifican en las siguientes: 1. Funciones Escalares 2. Funciones con valores de tabla de varias instrucciones 3. Funciones con valores de tabla en lnea
3.1.1.1
Funciones escalares
Son aquellas funciones donde retornan un valor nico: tipo de datos como int, Money, varchar, real, etc. Pueden ser utilizadas en cualquier lugar, incluso, incorporada dentro de las sentencias SQL.
CIBERTEC
CARRERAS PROFESIONALES
92
Ejemplo: Crear una funcin que retorne el precio promedio de todos los productos
CREATE FUNCTION DBO.PRECIOPROMEDIO() RETURNS DECIMAL AS BEGIN DECLARE @PROM DECIMAL SELECT @PROM=AVG(PRECIOUNIDAD) FROM COMPRAS.PRODUCTOS RETURN @PROM END GO
Ejemplo: Defina una funcin donde ingrese el id del empleado y retorne la cantidad de pedidos registrados en el presente ao
CREATE FUNCTION DBO.PEDIDOSEMPLEADO(@ID INT) RETURNS DECIMAL AS BEGIN DECLARE @Q DECIMAL=0 SELECT @Q=COUNT(*) FROM VENTAS.PEDIDOSCABE WHERE YEAR(FECHAPEDIDO)=YEAR(GETDATE()) AND IDEMPLEADO=@ID IF @Q IS NULL SET @Q=0 RETURN @Q END GO
CARRERAS PROFESIONALES
CIBERTEC
93
3.1.1.2
Las funciones de tabla en lnea son las funciones que devuelven la salida de una simple declaracin SELECT. La salida se puede utilizar adentro de JOINS o querys como si fuera una tabla de estndar.
CREATE FUNCTION [propietario.] nombre_funcion ([{ @parameter RETURNS TABLE [AS] RETURN [(] Sentencia SQL [)] tipo de dato [ = default]} [,..n]])
Ejemplo: Defina una funcin que liste los registros de los clientes, e incluya el nombre del Pais.
CREATE FUNCTION DBO.CLIENTES() RETURNS TABLE AS RETURN (SELECT IDCLIENTE AS 'CODIGO', NOMBRECIA AS 'CLIENTE', DIRECCION, NOMBREPAIS AS 'PAIS' FROM VENTAS.CLIENTES C JOIN VENTAS.PAISES P ON C.IDPAIS = P.IDPAIS) GO
CIBERTEC
CARRERAS PROFESIONALES
94
Ejemplo: Defina una funcin que liste los registros de los pedidos por un determinado ao, incluya el nombre del producto, el precio que fue vendido y la cantidad vendida
CREATE FUNCTION DBO.PEDIDOSAO(@Y INT) RETURNS TABLE AS RETURN (SELECT PC.IDPEDIDO AS 'PEDIDO', FECHAPEDIDO, NOMBREPRODUCTO, PD.PRECIOUNIDAD AS 'PRECIO', CANTIDAD FROM VENTAS.PEDIDOSCABE PC JOIN VENTAS.PEDIDOSDETA PD ON PC.IDPEDIDO=PD.IDPEDIDO JOIN COMPRAS.PRODUCTOS P ON PD.IDPRODUCTO=P.IDPRODUCTO WHERE YEAR(FECHAPEDIDO) = @Y) GO
3.1.1.3
Son similares a los procedimientos almacenados excepto que vuelven una tabla. Este tipo de funcin se usa en situaciones donde se requiere ms lgica y proceso. Lo que sigue es la sintaxis para unas funciones de tabla de multisentencias:
CREATE FUNCTION [propietario.] nombre_funcion ([{@parameter RETURNS TABLE [AS] BEGIN Cuerpo de la funcin RETURN END tipo de dato [ = default]} [,..n]])
CARRERAS PROFESIONALES
CIBERTEC
95
Ejemplo: Defina una funcin que retorne el inventario de los productos registrados en la base de datos.
CREATE FUNCTION DBO.INVENTARIO() RETURNS @TABLA TABLE(IDPRODUCTO INT, NOMBRE VARCHAR(50), PRECIO DECIMAL, STOCK INT) AS BEGIN INSERT INTO @TABLA SELECT IDPRODUCTO, NOMBREPRODUCTO, PRECIOUNIDAD, UNIDADESENEXISTENCIA FROM COMPRAS.PRODUCTOS RETURN END GO
Ejemplo: Defina una funcin que permita generar un reporte de ventas por empleado, en un determinado ao. En este proceso, la funcin debe retornar: los datos del empleado, la cantidad de pedidos registrados y el monto total por empleado
CREATE FUNCTION DBO.REPORTEVENTAS(@Y INT) RETURNS @TABLA TABLE(ID INT, NOMBRE VARCHAR(50), CANTIDAD INT, MONTO DECIMAL) AS BEGIN INSERT INTO @TABLA SELECT E.IDEMPLEADO, APELLIDOS, COUNT(*),
CIBERTEC
CARRERAS PROFESIONALES
96
SUM(PRECIOUNIDAD*CANTIDAD) FROM VENTAS.PEDIDOSCABE PC JOIN VENTAS.PEDIDOSDETA PD ON PC.IDPEDIDO = PD.IDPEDIDO JOIN VENTAS.EMPLEADOS E ON E.IDEMPLEADO = PC.IDEMPLEADO WHERE YEAR(FECHAPEDIDO) = @Y GROUP BY E.IDEMPLEADO, APELLIDOS RETURN END GO
3.1.1.4
Limitaciones
Las funciones definidas por el usuario tienen algunas restricciones. No todas las sentencias SQL son vlidas dentro de una funcin. Las listas siguientes enumeran las operaciones vlidas e invlidas de las funciones:
Vlido: Las sentencias de asignacin Las sentencias de Control de Flujo Sentencias SELECT y modificacin de variables locales Operaciones de cursores sobre variables locales Sentencias INSERT, UPDATE, DELETE con variables locales
Invlidas: Armar funciones no determinadas como GetDate() Sentencias de modificacin o actualizacin de tablas o vistas Operaciones CURSOR FETCH que devuelven datos del cliente
CARRERAS PROFESIONALES
CIBERTEC
97
Incluir parmetros Llamar a otros procedimientos Devolver un valor de estado a un procedimiento de llamada o lote para indicar el xito o el fracaso del mismo y la razn de dicho fallo. Devolver valores de parmetros a un procedimiento de llamada o lote Ejecutarse en SQL Server remotos
La posibilidad de escribir procedimientos almacenados mejora notablemente la potencia, eficacia y flexibilidad de SQL. Los procedimientos compilados mejoran la ejecucin de las instrucciones y lotes de SQL de forma dramtica. Adems, los procedimientos almacenados pueden ejecutarse en otro SQL Server si el servidor del usuario y el remoto estn configurados para permitir logins remotos.
Los procedimientos almacenados se diferencian de las instrucciones SQL ordinarias y de lotes de instrucciones SQL en que estn precompilados. La primera vez que se ejecuta un procedimiento, el procesador de consultas SQL Server lo analiza y prepara un plan de ejecucin que se almacena en forma definitiva en una tabla de sistema. Posteriormente, el procedimiento se ejecuta segn el plan almacenado, puesto que ya se ha realizado la mayor parte del trabajo de procesamiento de consultas, los procedimientos almacenados se ejecutan casi de forma instantnea.
Los procedimientos almacenados se crean con CREATE PROCEDURE. Para ejecutar un procedimiento almacenado, ya sea un procedimiento del sistema o uno definido por el usuario, use el comando EXECUTE. Tambin, puede utilizar el nombre del procedimiento almacenado solo, siempre que sea la primera palabra de una instruccin o lote.
CIBERTEC
CARRERAS PROFESIONALES
98
CREATE PROCEDURE <Procedure_Name, sysname, ProcedureName> -- Aadir parmetros al procedimiento almacenado <@Param1> <Datatype_For_Param1> = <Default_Value_For_Param1>, <@Param2> <Datatype_For_Param2> = <Default_Value_For_Param2> AS BEGIN -- Insertar la sentencia para el procedimiento Sentencia SQL END
ALTER PROCEDURE NOMBRE_PROCEDIMIENTO <@Param1> <Datatype_For_Param1> = <Default_Value_For_Param1>, <@Param2> <Datatype_For_Param2> = <Default_Value_For_Param2> AS CONSULTA_SQL
Por ejemplo: Defina un procedimiento almacenado que liste todos los clientes
-- PROCEDIMIENTO ALMACENADO CREATE PROCEDURE USP_CLIENTES AS SELECT IDCLIENTE AS CODIGO, NOMBRECIA AS CLIENTE, DIRECCION, TELEFONO FROM VENTAS.CLIENTES GO
Como se aprecia, el procedimiento mostrado no tiene parmetros de entrada y para ejecutarlo deber usar una de las siguientes sentencias:
CARRERAS PROFESIONALES
CIBERTEC
99
O simplemente
Por ejemplo: Cree un procedimiento almacenado que permita buscar los datos de los pedidos registrados en una determinada fecha. El procedimiento deber definir un parmetro de entrada de tipo DateTime
CREATE PROCEDURE USP_PEDIDOSFECHAS @F1 DATETIME AS SELECT * FROM VENTAS.PEDIDOSCABE WHERE FECHAPEDIDO = @F1 GO
Como se aprecia, el procedimiento mostrado tiene 1 parmetro de entrada y para ejecutarlo deber usar la siguiente sentencia:
O simplemente, colocar la lista de los valores el cual ser asignada a cada parmetro, donde el primer valor le corresponde a @f1
CIBERTEC
CARRERAS PROFESIONALES
100
La sentencia ALTER PROCEDURE permite modificar el contenido del procedimiento almacenado. En este procedimiento, realizamos la consulta de pedidos entre un rango de dos fechas.
ALTER PROCEDURE USP_PEDIDOSBYFECHAS @F1 DATETIME, @F2 DATETIME AS SELECT * FROM VENTAS.PEDIDOSCABE WHERE FECHAPEDIDO BETWEEN @F1 AND @F2 GO
Para
eliminar
un
procedimiento
almacenado,
ejecute
la
instruccin
DROP
PROCEDURE
3.1.2.1
Especificar parmetros
Un procedimiento almacenado se comunica con el programa que lo llama mediante sus parmetros. Cuando un programa ejecuta un procedimiento almacenado, es posible pasarle valores mediante los parmetros del procedimiento.
Estos valores se pueden utilizar como variables estndar en el lenguaje de programacin TRANSACT-SQL. El procedimiento almacenado tambin puede devolver valores al programa que lo llama mediante parmetros OUTPUT. Un procedimiento almacenado puede tener hasta 2.100 parmetros, cada uno de ellos con un nombre, un tipo de datos, una direccin y un valor predeterminado
CARRERAS PROFESIONALES
CIBERTEC
101
3.1.2.2
Cada parmetro de un procedimiento almacenado, debe definirse con un nombre nico. Los nombres de los procedimientos almacenados deben empezar por un solo carcter @, como una variable estndar de TRANSACT-SQL, y deben seguir las reglas definidas para los identificadores de objetos. El nombre del parmetro se puede utilizar en el procedimiento almacenado para obtener y cambiar el valor del parmetro.
3.1.2.3
La direccin de un parmetro puede ser de entrada, que indica que un valor se pasa al parmetro de entrada de un procedimiento almacenado o de salida, que indica que el procedimiento almacenado devuelve un valor al programa que lo llama mediante un parmetro de salida. El valor predeterminado es un parmetro de entrada. Para especificar un parmetro de salida, debe indicar la palabra clave OUTPUT en la definicin del parmetro del procedimiento almacenado. El programa que realiza la llamada tambin debe utilizar la palabra clave OUTPUT al ejecutar el procedimiento almacenado, a fin de guardar el valor del parmetro en una variable que se pueda utilizar en el programa que llama.
3.1.2.4
Puede crear un procedimiento almacenado con parmetros opcionales especificando un valor predeterminado para los mismos. Al ejecutar el procedimiento almacenado, se utilizar el valor predeterminado si no se ha especificado ningn otro. Es necesario especificar valores predeterminados, ya que el sistema devuelve un error si en el procedimiento almacenado no se especifica un valor predeterminado para un parmetro y el programa que realiza la llamada no proporciona ningn otro valor al ejecutar el procedimiento.
Por ejemplo: Cree un procedimiento almacenado que muestre los datos de los pedidos, los productos que fueron registrados por cada pedido, el precio del producto y la cantidad registrada por un determinado cliente y ao. El procedimiento recibir como parmetro de entrada el cdigo del cliente y el ao. Considere que el parmetro ao tendr un valor por defecto: el ao del sistema.
CIBERTEC
CARRERAS PROFESIONALES
102
CREATE PROCEDURE USP_PEDIDOSCLIENTEAO @ID VARCHAR(5), @AO INT = 2011 AS SELECT PC.IDPEDIDO AS 'PEDIDO', FECHAPEDIDO, NOMBREPRODUCTO, PD.PRECIOUNIDAD AS 'PRECIO', CANTIDAD FROM VENTAS.PEDIDOSCABE PC JOIN VENTAS.PEDIDOSDETA PD ON PC.IDPEDIDO = PD.IDPEDIDO JOIN COMPRAS.PRODUCTOS P ON PD.IDPRODUCTO = P.IDPRODUCTO WHERE YEAR(FECHAPEDIDO) = @AO AND IDCLIENTE = @ID GO
Como el procedimiento almacenado ha definido un valor por defecto al parmetro @ao, podemos ejecutar el procedimiento enviando solamente el valor para el parmetro @id
Por ejemplo: Implemente un procedimiento almacenado que retorne la cantidad de pedidos y el monto total de pedidos, registrados por un determinado empleado (parmetro de entrada su id del empleado) y en determinado ao (parmetro de entrada). Dicho procedimiento retornar la cantidad de pedidos y el monto total
CARRERAS PROFESIONALES
CIBERTEC
103
CREATE PROCEDURE USP_REPORTEPEDIDOSEMPLEADO @ID INT, @Y INT, @Q INT OUTPUT, @MONTO DECIMAL OUTPUT AS SELECT @Q= COUNT(*), @MONTO = SUM(PRECIOUNIDAD*CANTIDAD) FROM VENTAS.PEDIDOSCABE PC JOIN VENTAS.PEDIDOSDETA PD ON PC.IDPEDIDO = PD.IDPEDIDO WHERE IDEMPLEADO =@ID AND YEAR(FECHAPEDIDO) = @Y GO
Al ejecutar el procedimiento almacenado, primero declaramos las variables de retorno y al ejecutar, las variables de retorno se le indicara con la expresin OUTPUT.
DECLARE @Q INT, @M DECIMAL EXEC USP_REPORTEPEDIDOSEMPLEADO @ID=2, @Y=1997, @Q=@Q OUTPUT, @MONTO=@M OUTPUT GO
3.1.2.5
Los cursores son especialmente tiles en procedimientos almacenados. Permiten llevar a cabo la misma tarea utilizando slo una consulta que, de otro modo, requerira varias. Sin embargo, todas las operaciones del cursor deben ejecutarse dentro de un solo procedimiento. Un procedimiento almacenado no puede abrir, recobrar o cerrar un cursor que no est declarado en el procedimiento. El cursor no est definido fuera del alcance del procedimiento almacenado.
CIBERTEC
CARRERAS PROFESIONALES
104
Por ejemplo: Implemente un procedimiento almacenado que imprimir cada uno de los registros de los productos, donde al finalizar, visualice el total del inventario (Suma de cantidad de productos)
CREATE PROCEDURE USP_INVENTARIO AS -- DECLARACION DE VARIABLES PARA EL CURSOR DECLARE @ID INT, @INV INT SET @INV=0 @NOMBRE VARCHAR(255), @PRECIO DECIMAL, @ST INT,
-- DECLARACIN DEL CURSOR DECLARE CPRODUCTO CURSOR FOR SELECT IDPRODUCTO, NOMBREPRODUCTO, PRECIOUNIDAD, UNIDADESENEXISTENCIA FROM COMPRAS.PRODUCTOS
-- LECTURA DE LA PRIMERA FILA DEL CURSOR FETCH CPRODUCTO INTO @ID, @NOMBRE, @PRECIO, @ST WHILE (@@FETCH_STATUS = 0 ) BEGIN -- IMPRIMIR PRINT STR(@ID) + SPACE(5) + @NOMBRE + SPACE(5) + STR(@PRECIO) + SPACE(5) + STR(@ST) -- ACUMULAR SET @INV += @ST -- LECTURA DE LA SIGUIENTE FILA DEL CURSOR FETCH CPRODUCTO INTO @ID, @NOMBRE, @PRECIO, @ST END
CARRERAS PROFESIONALES
CIBERTEC
105
En el siguiente ejemplo, definimos un procedimiemto que permita generar un reporte de los pedidos realizados por un empleado en cada ao, totalizando el monto de sus operaciones por cada ao.
CREATE PROCEDURE USP_REPORTEPEDIDOSXAOXEMPLEADO @EMP INT=1 AS -- DECLARACIN DE VARIABLES DE TRABAJO DECLARE @Y INT, @Y1 INT, @PEDIDO INT, @MONTO DECIMAL, @TOTAL DECIMAL
SET @TOTAL=0
-- DECLARACIN DEL CURSOR DECLARE MI_CURSOR CURSOR FOR SELECT YEAR(FECHAPEDIDO) AS 'AO', PC.IDPEDIDO, SUM(PRECIOUNIDAD*CANTIDAD) AS MONTO FROM VENTAS.PEDIDOSCABE PC JOIN VENTAS.PEDIDOSDETA PD ON PC.IDPEDIDO=PD.IDPEDIDO WHERE IDEMPLEADO = @EMP GROUP BY YEAR(FECHAPEDIDO), PC.IDPEDIDO ORDER BY 1
-- LECTURA DEL PRIMER REGISTRO FETCH MI_CURSOR INTO @Y, @PEDIDO, @MONTO
CIBERTEC
CARRERAS PROFESIONALES
106
-- RECORRER EL CURSOS MIENTRAS HAYAN REGISTROS WHILE @@FETCH_STATUS=0 BEGIN IF(@Y = @Y1) BEGIN -- ACUMULAR SET @TOTAL += @MONTO END ELSE BEGIN PRINT 'AO:' + CAST(@Y1 AS VARCHAR) + SPACE(2)+ 'IMPORTE: ' + CAST(@TOTAL AS VARCHAR) PRINT 'AO:' + CAST(@Y AS VARCHAR) SET @Y1=@Y SET @TOTAL=@MONTO END -- IMPRIMIR EL REGISTRO PRINT CAST(@PEDIDO AS VARCHAR) + SPACE(5)+ CAST(@MONTO AS VARCHAR) -- LECTURA DEL SIGUIENTE REGISTRO FETCH MI_CURSOR INTO @Y, @PEDIDO, @MONTO END
Al ejecutar el procedimiento almacenado, se le enva el parmetro que representa el id del empleado, imprimiendo su record de ventas de pedidos por ao
USP_REPORTEPEDIDOSXAOXEMPLEADO 2 GO
CARRERAS PROFESIONALES
CIBERTEC
107
Ejecutado el procedimiento almacenado lista cada pedido por ao, mostrando al finalizar el total por cada ao.
Por ejemplo, defina un procedimiento almacenado para insertar un registro de la tabla Clientes, en este procedimiento, definiremos parmetros de entrada que representan los campos de la tabla.
CREATE PROCEDURE USP_INSERTACLIENTE @ID VARCHAR(5), @NOMBRE VARCHAR(50), @DIRECCION VARCHAR(100), @IDPAIS CHAR(3), @FONO VARCHAR(15) AS INSERT INTO VENTAS.CLIENTES(IDCLIENTE, NOMCLIENTE, DIRECCION,IDPAIS, TELEFONO) VALUES(@ID, @NOMBRE, @DIRECCION, @IDPAIS, @FONO) GO
CARRERAS PROFESIONALES
CIBERTEC
108
En el siguiente ejemplo, definimos un procedimiento almacenado que permita evaluar la existencia de un registro de empleado para insertar o actualizar sus datos: Si existe el cdigo del empleado, actualice sus datos; sino agregue el registro de empleados
CREATE PROCEDURE USP_ACTUALIZAEMPLEADO @ID INT, @NOMBRE VARCHAR(50), @APELLIDO VARCHAR(50), @FN DATETIME, @DIRECCION VARCHAR(100), @IDDIS INT, @FONO VARCHAR(15), @IDCARGO INT, @FC DATETIME AS MERGE RRHH.EMPLEADOS AS TARGET USING (SELECT @ID, @NOMBRE, @APELLIDO, @FN, @DIRECCION, @IDDIS, @FONO, @IDCARGO, @FC) AS SOURCE (IDEMPLEADO, NOMEMPLEADO, APEEMPLEADO, FECNAC, DIRECCION, IDDISTRITO, FONOEMPLEADO, IDCARGO, FECCONTRATA) ON (TARGET.IDEMPLEADO = SOURCE.IDEMPLEADO) WHEN MATCHED THEN UPDATE RRHH.EMPLEADOS SET NOMEMPLEADO=@NOMBRE, APEEMPLEADO=@APELLIDO, FECNAC=@FN, DIRECCION=@DIRECCION, IDDISTRITO=@IDDIS, FONOEMPLEADO=@FONO, IDCARGO=IDCARGO, FECCONTRATA=@FC WHEN NOT MATCHED THEN INSERT INTO RRHH.EMPLEADOS VALUES(@ID, @NOMBRE, @APELLIDO,
CARRERAS PROFESIONALES
CIBERTEC
109
Para este caso, hemos utilizado la instruccin MERGE que evala la existencia de un registro. Si existe, actualizar los datos, sino agrega el registro.
En ocasiones, no sabemos si estamos realizando correctamente un proceso de insercin, actualizacin o eliminacin de datos a una tabla(s). El script de T-SQL consiste en realizar un procedimiento almacenado que reciba los datos necesarios para insertarlos en la tabla, para garantizar la ejecucin correcta de las actualizacin utilizo las transacciones TRANSACT SQL y para validar la reversin de la transaccin en caso de que ocurra un ERROR utilizo el control de Errores Try Catch con ROLLBACK.
El ejemplo clsico de transaccin es un registro de pedidos, donde agregamos un registro a la tabla pedidoscabe y agregamos un registro a la tabla pedidosdeta (producto solicitado por el cliente) y descontamos el stock del producto solicitado en el pedido.
CREATE PROCEDURE USP_AGREGAPEDIDO -- PARMETROS DE PEDIDOSCABE @IDPED INT, @IDCLI VARCHAR(5), @IDEMP INT, @FECPED DATETIME,
CIBERTEC
CARRERAS PROFESIONALES
110
-- AGREGANDO UN REGISTRO A PEDIDOSCABE INSERT INTO VENTAS.PEDIDOSCABE(IDPEDIDO,IDCLIENTE, IDEMPLEADO,FECHAPEDIDO) VALUES(@IDPED, @IDCLI, @IDEMP, @FECPED)
-- AGREGANDO UN REGISTRO A PEDIDOSDETA INSERT INTO VENTAS.PEDIDOSDETA(IDPEDIDO, IDPRODUCTO, PRECIOUNIDAD,CANTIDAD, DESCUENTO) VALUES(@IDPED, @IDPROD, @PRE, @CANT, 0)
-- DESCONTANDO EL STOCK DE PRODUCTOS UPDATE COMPRAS.PRODUCTOS SET UNIDADESENEXISTENCIA -=@CANT WHERE IDPRODUCTO = @IDPROD GO
Esta forma de procesar las operaciones de pedidos sera errnea, ya que cada instruccin se ejecutara y confirmara de forma independiente, por lo que un error en alguna de las operaciones dejara los datos errneos en la base de datos.
3.1.4.1
Para agrupar varias sentencias TRANSACT SQL en una nica transaccin, disponemos de los siguientes mtodos:
Transacciones explcitas: Cada transaccin se inicia explcitamente con la instruccin BEGIN TRANSACTION y se termina explcitamente con una instruccin COMMIT o ROLLBACK.
Transacciones implcitas: Se inicia automticamente una nueva transaccin cuando se ejecuta una instruccin que realiza modificaciones en los datos, pero cada transaccin se completa explcitamente con una instruccin COMMIT o ROLLBACK.
CARRERAS PROFESIONALES
CIBERTEC
111
BEGIN CATCH /*Bloque de instrucciones que se ejecutan si ocurre END CATCH un ERROR*/
-- Inicio de transaccin con nombre BEGIN TRAN NombreTransaccion /*Bloque de instrucciones a ejecutar en la Transaccin*/ COMMIT TRAN NombreTransaccion--Confirmacin de la transaccin. ROLLBACK TRAN NombreTransaccion--Reversin de la transaccin.
En este ejemplo, definimos un procedimiento almacenado que agregue un registro a la tabla de clientes. En este proceso, controlamos la operacin a travs de una transaccin llamada tcliente, evaluamos el proceso con la variable @@ERROR
USP_INSERTACLIENTE
@NOMBRE VARCHAR(50), @DIRECCION VARCHAR(100), @IDPAIS CHAR(3), @FONO VARCHAR(15) AS -- INICIO DE LA TRANSACCION BEGIN TRAN TCLIENTE INSERT INTO VENTAS.CLIENTES(IDCLIENTE, NOMCLIENTE, DIRECCION, IDPAIS, TELEFONO) VALUES(@ID, @NOMBRE, @DIRECCION, @IDPAIS, @FONO) GO
-- CONTROLAR EL PROCESO IF @@ERROR = 0 BEGIN -- CONFIRMACIN DE LA INSERCIN COMMIT TRAN TCLIENTE PRINT 'CLIENTE REGISTRADO' END
CIBERTEC
CARRERAS PROFESIONALES
112
ELSE BEGIN PRINT @@ERROR -- DESHACER LA INSERCIN ROLLBACK TRAN TCLIENTE END GO
Para un mejor control de los errores, ejecutamos los procesos dentro del bloque TRY CATCH, donde en caso que las operaciones hayan tenido xito, ejecutar COMMIT TRAN, pero en caso de error CATCH, ejecutar ROLLBACK TRAN, tal como se muestra en el siguiente ejercicio.
CREATE PROCEDURE USP_AGREGAPEDIDO -- PARMETROS DE PEDIDOSCABE @IDPED INT, @IDCLI VARCHAR(5), @IDEMP INT, @FECPED DATETIME, -- PARMETROS DE PEDIDOSDETA @IDPROD INT, @PRE DECIMAL, @CANT INT AS -- INICIO DE LA TRANSACCION BEGIN TRAN TPEDIDO
-- AGREGANDO UN REGISTRO A PEDIDOSCABE INSERT INTO VENTAS.PEDIDOSCABE(IDPEDIDO,IDCLIENTE,IDEMPLEADO,FECHAPEDIDO) VALUES(@IDPED, @IDCLI, @IDEMP, @FECPED)
-- AGREGANDO UN REGISTRO A PEDIDOSDETA INSERT INTO VENTAS.PEDIDOSDETA(IDPEDIDO, IDPRODUCTO, PRECIOUNIDAD,CANTIDAD, DESCUENTO) VALUES(@IDPED, @IDPROD, @PRE, @CANT, 0)
CARRERAS PROFESIONALES
CIBERTEC
113
-- DESCONTANDO EL STOCK DE PRODUCTOS UPDATE COMPRAS.PRODUCTOS SET UNIDADESENEXISTENCIA -=@CANT WHERE IDPRODUCTO = @IDPROD
-- CONFIRMANDO LA ACTUALIZACION COMMIT TRAN TPEDIDO PRINT 'PEDIDO REGISTRADO' END TRY BEGIN CATCH PRINT @@ERROR ROLLBACK TRAN TPEDIDO END CATCH GO
En el siguiente ejercicio, implementamos un procedimiento almacenado para realizar el BACKUP a la tabla ClienteBAK. En este proceso, los registros de la tabla Clientes se irn agregando (si no existen) o actualizando sus datos (si existe el registro) o eliminar el registro en ClienteBAK si ste no existe en Clientes.
-- CREAR LA TABLA CLIENTESBAK CREATE TABLE VENTAS.CLIENTESBAK ( IDCLIENTE VARCHAR(5) PRIMARY KEY, NOMBRECLIENTE VARCHAR(40) NOT NULL, DIRECCION VARCHAR(60) NOT NULL, IDPAIS CHAR(3), TELEFONO VARCHAR(24) NOT NULL ) GO
-- PROCEDIMIENTO QUE REALIZA BACK UP A LA TABLA CLIENTES CREATE PROCEDURE USP_CLIENTEBAK AS BEGIN TRAN BK BEGIN TRY MERGE VENTAS.CLIENTESBAK AS TARGET USING VENTAS.CLIENTES AS SOURCE ON (TARGET.IDCLIENTE = SOURCE.IDCLIENTE) WHEN MATCHED AND TARGET.NOMBRECLIENTE <> SOURCE.NOMCLIENTE THEN UPDATE SET TARGET.NOMBRECLIENTE = SOURCE.NOMCLIENTE, TARGET.DIRECCION = SOURCE .DIRCLIENTE, TARGET.IDPAIS =
CIBERTEC
CARRERAS PROFESIONALES
114
SOURCE.DIRCLIENTE, SOURCE.IDPAIS, SOURCE.FONOCLIENTE) WHEN NOT MATCHED BY SOURCE THEN DELETE ; PRINT 'TRANSACCION COMPLETADA' COMMIT TRAN BK END TRY BEGIN CATCH PRINT @@ERROR ROLLBACK TRAN END CATCH GO
Un disparador es un tipo especial de procedimiento almacenado que se ejecuta cuando se insertan, eliminan o actualizan datos de una tabla especificada. Los disparadores pueden ayuda a mantener la integridad de referencia de los datos conservando la consistencia entre los datos relacionados lgicamente de distintas tablas. Integridad de referencia significa que los valores de las llaves primarias y los valores correspondientes de las llaves forneas deben coincidir de forma exacta.
La principal ventaja de los disparadores es que son automticos: funcionan cualquiera sea el origen de la modificacin de los datos. Cada disparador es especfico de una o ms operaciones de modificacin de datos, UPDATE, INSERT o DELETE. El disparador se ejecuta una vez por cada instruccin.
CARRERAS PROFESIONALES
CIBERTEC
115
Un disparador es un objeto de la base de datos. Cuando se crea un disparador, se especifica la tabla y los comandos de modificacin de datos que deben disparar o activar el disparador. Luego, se indica la accin o acciones que debe llevar a cabo un disparador.
CREATE TRIGGER [ esquema. ]nombre_trigger ON { Tabla | Vista } { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS sentencia sql [ ; ]
A continuacin, se muestra un ejemplo sencillo. Este disparador imprime un mensaje cada vez que alguien trata de insertar, eliminar o actualizar datos de la tabla Productos
CREATE TRIGGER TX_Productos ON Compras.Productos FOR INSERT, UPDATE, DELETE AS PRINT 'Actualizacion de los registros de Productos'
CIBERTEC
CARRERAS PROFESIONALES
116
ALTER TRIGGER TX_PRODUCTOS ON COMPRAS.PRODUCTOS FOR INSERT, UPDATE, DELETE AS PRINT 'ACTUALIZACION DE LOS REGISTROS DE PRODUCTOS'
A. Disparador de Insercin Cuando se inserta una nueva fila en una tabla, SQL Server inserta los nuevos valores en la tabla INSERTED el cual es una tabla del sistema. Est tabla toma la misma estructura del cual se origin el TRIGGER, de tal manera que se pueda verificar los datos y ante un error podra revertirse los cambios.
Cree un TRIGGER que permita insertar los datos de un Producto siempre y cuando la descripcin o nombre del producto sea nico.
CREATE TRIGGER TX_PRODUCTO_INSERTA ON COMPRAS.PRODUCTOS FOR INSERT AS IF (SELECT COUNT (*) FROM INSERTED, COMPRAS.PRODUCTOS
WHERE INSERTED.NOMPRODUCTO = PRODUCTOS.NOMPRODUCTO) >1 BEGIN ROLLBACK TRANSACTION PRINT 'LA DESCRIPCION DEL PRODUCTO SE ENCUENTRA REGISTRADO' END ELSE PRINT 'EL PRODUCTO FUE INGRESADO EN LA BASE DE DATOS' GO
CARRERAS PROFESIONALES
CIBERTEC
117
En este ejemplo, verificamos el nmero de productos que tienen la misma descripcin y de encontrarse ms de un registro de productos no se deber permitir ingresar los datos del producto. Este disparador imprime un mensaje si la insercin se revierte y otro si se acepta.
B. Disparador de Eliminacin
Cuando se elimina una fila de una tabla, SQL Server inserta los valores que fueron eliminados en la tabla DELETED el cual es una tabla del sistema. Est tabla toma la misma estructura del cual se origino el TRIGGER, de tal manera que se pueda verificar los datos y ante un error podra revertirse los cambios. En este caso, la reversin de los cambios significar restaurar los datos eliminados.
Cree un TRIGGER el cual permita eliminar Clientes los cuales no han registrado algn pedido. De eliminarse algn Cliente que no cumpla con dicha condicin la operacin no deber ejecutarse.
CREATE TRIGGER TX_ELIMINA_ELIMINA ON VENTAS.CLIENTES FOR DELETE AS IF EXISTS (SELECT * FROM VENTAS.PEDIDOSCABE WHERE PEDIDOSCABE.IDCLIENTE = (SELECT IDCLIENTE FROM DELETED) ) BEGIN ROLLBACK TRANSACTION PRINT 'EL CLIENTE TIENE REGISTRADO POR LO MENOS 1 PEDIDOS' END
En este ejemplo, verificamos si el cliente tiene pedidos registrados, de ser as la operacin deber ser cancelada.
C. Disparador de Actualizacin
Cuando se actualiza una fila de una tabla, SQL Server inserta los valores que antiguos en la tabla DELETED y los nuevos valores los inserta en la tabla INSERTED. Usando
CIBERTEC
CARRERAS PROFESIONALES
118
estas dos tablas se podr verificar los datos y ante un error podran revertirse los cambios.
Cree un TRIGGER que valide el precio unitario y su Stock de un producto, donde dichos datos sean mayores a cero.
CREATE TRIGGER TX_PRODUCTO_ACTUALIZA ON COMPRAS.PRODUCTOS FOR UPDATE AS IF (SELECT PRECIOUNIDAD FROM INSERTED) <=0 OR
(SELECT UNIDADESENEXISTENCIA FROM INSERTED)<=0 BEGIN PRINT 'EL PRECIO O UNIDADESENEXISTENCIA DEBEN SER MAYOR A CERO' ROLLBACK TRANSACTION END
CREATE TRIGGER TX_PRODUCTO_ACTUALIZA_ID ON COMPRAS.PRODUCTOS FOR UPDATE AS IF UPDATE(IDPRODUCTO) BEGIN PRINT 'NO SE PUEDE ACTUALIZAR EL ID DEL PRODUCTO' ROLLBACK TRANSACTION END
Los desencadenadores INSTEAD OF pasan por alto las acciones estndar de la instruccin de desencadenamiento: INSERT, UPDATE o DELETE. Se puede definir un desencadenador INSTEAD OF para realizar comprobacin de errores o valores en una o ms columnas y, a continuacin, realizar acciones adicionales antes de insertar el registro.
CARRERAS PROFESIONALES
CIBERTEC
119
Por ejemplo, cuando el valor que se actualiza en un campo de tarifa de una hora de trabajo de una tabla de planilla excede un valor especfico, se puede definir un desencadenador para producir un error y revertir la transaccin o insertar un nuevo registro en un registro de auditora antes de insertar el registro en la tabla de planilla.
A. INSTEAD OF INSERT Se pueden definir desencadenadores INSTEAD OF INSERT en una vista o tabla para reemplazar la accin estndar de la instruccin INSERT. Normalmente, el desencadenador INSTEAD OF INSERT se define en una vista para insertar datos en una o ms tablas base.
Las columnas de la lista de seleccin de la vista pueden o no admitir valores NULL. Si una columna de la vista no admite valores NULL, una instruccin INSERT debe proporcionar los valores para la columna.
-- CREAR UNA VISTA QUE LISTE LAS COLUMNAS DE CLIENTES. CREATE VIEW INSTEADVIEW AS SELECT IDCLIENTE, NOMCLIENTE, DIRCLIENTE, IDPAIS, FONOCLIENTE FROM VENTAS.CLIENTES GO
-- CREAR UN TRIGGER INSTEAD OF INSERT PARA LA VISTA. CREATE TRIGGER INSTEADTRIGGER ON INSTEADVIEW INSTEAD OF INSERT AS BEGIN INSERT INTO VENTAS.CLIENTESBAK SELECT IDCLIENTE, NOMCLIENTE, DIRCLIENTE, IDPAIS, FONOCLIENTE FROM INSERTED END GO
CIBERTEC
CARRERAS PROFESIONALES
120
B. INSTEAD OF UPDATE Se pueden definir desencadenadores INSTEAD OF UPDATE en una vista o tabla para reemplazar la accin estndar de la instruccin UPDATE. Normalmente, el desencadenador INSTEAD OF UPDATE se define en una vista para modificar datos en una o ms tablas. Las instrucciones UPDATE que hacen referencia a vistas que contienen desencadenadores INSTEAD OF UPDATE deben suministrar valores para todas las columnas que no admiten valores NULL a las que hace referencia la clusula SET
C. INSTEAD OF DELETE Se pueden definir desencadenadores INSTEAD OF DELETE en una vista o una tabla para reemplazar la accin estndar de la instruccin DELETE. Normalmente, el desencadenador INSTEAD OF DELETE se define en una vista para modificar datos en una o ms tablas. Las instrucciones DELETE no especifican modificaciones de los valores de datos existentes. Las instrucciones DELETE slo especifican las filas que se van a eliminar. La tabla inserted pasada a un desencadenador DELETE siempre est vaca. La tabla deleted enviada a un desencadenador DELETE contiene una imagen de las filas en el estado que tenan antes de emitir la instruccin DELETE
A continuacin, se describen algunas limitaciones o restricciones impuestas a los disparadores por SQL Server: Una tabla puede tener un mximo de tres disparadores: uno de actualizacin, uno de insercin y uno de eliminacin. Cada disparador puede aplicarse a una sola tabla. Sin embargo, un mismo disparador se puede aplicar a las tres acciones del usuario: UPDATE, INSERT y DELETE. No se puede crear un disparador en una vista ni en una tabla temporal, aunque los disparadores pueden hacer referencia a las vistas o tablas temporales. Los disparadores no se permiten en las tablas del sistema. Aunque no aparece ningn mensaje de error su crea un disparador en una tabla del sistema, el disparador no se utilizar.
CARRERAS PROFESIONALES
CIBERTEC
121
Resumen
Las funciones definidas por el usuario, en tiempo de ejecucin de lenguaje TRANSACT-SQL o comn (CLR), acepta parmetros, realiza una accin, como un clculo complejo, y devuelve el resultado de esa accin como un valor. El valor de retorno puede ser un escalar (nico) valor o una tabla. Las funciones escalares son aquellas funciones donde retornan un valor nico: tipo de datos como int, Money, varchar, real, etc. Pueden ser utilizadas en cualquier lugar, incluso, incorporada dentro de las sentencias SQL. Las funciones de tabla en lnea son las funciones que devuelven la salida de una simple declaracin SELECT. La salida se puede utilizar adentro de JOINS o querys como si fuera una tabla de estndar. Las funciones de tabla multisentencias son similares a los procedimientos almacenados excepto que vuelven una tabla Los procedimientos almacenados son grupos formados por instrucciones SQL y el lenguaje de control de flujo. Cuando se ejecuta un procedimiento, se prepara un plan de ejecucin para que la subsiguiente ejecucin sea muy rpida. Los procedimientos almacenados pueden: 1. Incluir parmetros 2. Llamar a otros procedimientos 3. Devolver un valor de estado a un procedimiento de llamada o lote para indicar el xito o el fracaso del mismo y la razn de dicho fallo. 4. Devolver valores de parmetros a un procedimiento de llamada o lote 5. Ejecutarse en SQL Server remotos Un procedimiento almacenado se comunica con el programa que lo llama mediante sus parmetros. Cuando un programa ejecuta un procedimiento almacenado, es posible pasarle valores mediante los parmetros del
procedimiento. Estos valores se pueden utilizar como variables estndar en el lenguaje de programacin TRANSACT-SQL. El procedimiento almacenado tambin puede devolver valores al programa que lo llama mediante parmetros OUTPUT. Un procedimiento almacenado puede tener hasta 2.100 parmetros, cada uno de ellos con un nombre, un tipo de datos, una direccin y un valor predeterminado
CIBERTEC
CARRERAS PROFESIONALES
122
Los procedimientos almacenados pueden aceptar datos como parmetros de entrada y pueden devolver datos como parmetros de salida, conjuntos de resultados o valores de retorno. Adicionalmente, los procedimientos almacenados pueden ejecutar sentencias de actualizacin de datos: INSERT, UPDATE, DELETE Una transaccin es un conjunto de operaciones TRANSACT SQL que se ejecutan como un nico bloque, es decir, si falla una operacin TRANSACT SQL fallan todas. Si una transaccin tiene xito, todas las modificaciones de los datos realizadas durante la transaccin se confirman y se convierten en una parte permanente de la base de datos. Si una transaccin encuentra errores y debe cancelarse o revertirse, se borran todas las modificaciones de los datos. Los disparadores pueden usarse para imponer la integridad de referencia de los datos en toda la base de datos. Los disparadores tambin permiten realizar cambios en cascada en tablas relacionadas, imponer restricciones de columna ms complejas que las permitidas por las reglas, compara los resultados de las modificaciones de datos y llevar a cabo una accin resultante. Cuando se inserta una nueva fila en una tabla, SQL Server inserta los nuevos valores en la tabla INSERTED el cual es una tabla del sistema. Est tabla toma la misma estructura del cual se origin el TRIGGER, de tal manera que se pueda verificar los datos y ante un error podra revertirse los cambios Cuando se elimina una fila de una tabla, SQL Server inserta los valores que fueron eliminados en la tabla DELETED el cual es una tabla del sistema. Est tabla toma la misma estructura del cual se origino el TRIGGER, de tal manera que se pueda verificar los datos y ante un error podra revertirse los cambios. En este caso la reversin de los cambios significar restaurar los datos eliminados. Cuando se actualiza una fila de una tabla, SQL Server inserta los valores que antiguos en la tabla DELETED y los nuevos valores los inserta en la tabla INSERTED. Usando estas dos tablas se podr verificar los datos y ante un error podran revertirse los cambios
Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas:
http://www.devjoker.com/contenidos/catss/292/Transacciones-en-Transact-SQL.aspx
CARRERAS PROFESIONALES
CIBERTEC
123
http://msdn.microsoft.com/es-es/library/ms189260.aspx
CIBERTEC
CARRERAS PROFESIONALES
124
CARRERAS PROFESIONALES
CIBERTEC
125
UNIDAD DE APRENDIZAJE
TEMARIO 1.1. Introduccin 1.1.1. Porque utilizar bases de datos relacionales para datos XML 1.1.2. Tipos de datos XML 1.1.3. Integracin de relaciones y XML 1.1.4. FOR XML y mejoras OPENXML 1.2. Procesamiento XML en SQL SERVER 1.2.1. Tipos de datos XML 1.2.2. Almacenamiento de datos XML 1.2.3. Recuperacin de datos de tipo XML 1.2.3.1. Usar modo RAW 1.2.3.2. Usar modo AUTO 1.2.3.3. Usar modo EXPLICIT 1.2.3.4. Usar modo PATH 1.2.4. Recuperacin de datos con OPENXML ACTIVIDADES PROPUESTAS
Los alumnos actualizan datos con formato XML. Los alumnos recuperan los datos de una base de datos relacional en formato XML.
CIBERTEC
CARRERAS PROFESIONALES
126
CARRERAS PROFESIONALES
CIBERTEC
127
4.1 INTRODUCCION
Extensible Markup Language (XML) ha sido ampliamente adoptado como un formato independiente de la plataforma de representacin de datos. Es til para el intercambio de informacin entre los dbilmente acoplados, sistemas dispares, como en el negocio a negocio (B2B) y flujos de trabajo. El intercambio de datos ha sido un gran impulsor de las tecnologas XML.
XML es cada vez ms presente en las aplicaciones empresariales que se utilizan para el modelado de datos semi-estructurados y no estructurados. Una de estas aplicaciones es la gestin de documentos. Documentos (mensajes de correo
Si los documentos se almacenan en un servidor de base de datos como XML, potentes aplicaciones pueden ser desarrolladas, tales como:
Las aplicaciones que recuperar los documentos en base a su contenido. Las aplicaciones que consulta por el contenido parcial, como la bsqueda de la seccin cuyo ttulo contiene la palabra "fondo".
Estos escenarios se estn convirtiendo en posibles con el aumento en el desarrollo y la disponibilidad de las aplicaciones que generan y consumen XML. Por ejemplo, el Microsoft Office 2008 System permite a los usuarios generar Microsoft Word, Excel, Visio, InfoPath y documentos de formato XML.
4.1.1 Por qu utilizar bases de datos relacionales para los datos de XML?
El almacenamiento de datos XML en una base de datos relacional proporciona beneficios en las reas de gestin de datos y el procesamiento de consultas.
Microsoft SQL Server proporciona una consulta de gran alcance y las capacidades de modificacin de datos en datos relacionales. En SQL Server 2008, estas capacidades se extienden a consultar y modificar datos XML. Esto permite a su empresa para aprovechar las inversiones hechas en versiones anteriores, como las inversiones en
CIBERTEC
CARRERAS PROFESIONALES
128
las reas de costos basado en optimizacin y almacenamiento de datos. Por ejemplo, las tcnicas de indexacin en bases de datos relacionales son bien conocidas. Estos se han extendido a la indexacin de XML para que las consultas se puedan optimizar el uso de costos basado en las decisiones.
Los datos XML pueden interactuar con datos relacionales y aplicaciones SQL. Esto significa que XML puede ser introducido en el sistema segn las necesidades de modelado de datos se presentan sin interrumpir las aplicaciones existentes. El
servidor de base de datos tambin proporciona una funcionalidad administrativa para la gestin de datos XML (por ejemplo, BACKUP, recuperacin y replicacin).
La compatibilidad nativa con XML en SQL Server 2008 es necesario para hacer frente a aumentar el uso de XML. Beneficios de la empresa de desarrollo de aplicaciones de la compatibilidad con XML en SQL Server 2008.
En las secciones siguientes, se ofrece una visin general de la compatibilidad con XML en SQL Server 2005 y 2008, describe algunos de los escenarios de motivacin para el uso de XML, y analizar en detalle el lado del servidor y de cliente XML conjuntos de caractersticas.
El orden del documento es una propiedad inherente de instancias XML y debe ser preservada en los resultados de la consulta. Esto est en contraste con los datos relacionales, que no est ordenado, el orden debe ser ejecutada con columnas adicionales pedidos. Volver a montar el resultado en la consulta es costoso para los realistas esquemas XML que se descomponen los datos XML en un gran nmero de tablas.
SQL Server 2008 introduce un tipo de datos nativo llamado XML. Un usuario puede crear una tabla que tiene una o ms columnas de tipo XML, adems de columnas
CARRERAS PROFESIONALES
CIBERTEC
129
relacionales. Las variables y los parmetros de XML tambin son permitidos. Los valores XML se almacenan en un formato interno como objetos binarios grandes (BLOB) para apoyar a las caractersticas del modelo XML, tales como el orden del documento y las estructuras recursivas, con mayor fidelidad.
SQL Server 2008 ofrece colecciones de esquemas XML como una manera de manejar esquemas XML del W3C como metadatos. Un tipo de datos XML se puede asociar con una coleccin de esquemas XML para hacer cumplir las restricciones de esquema en las instancias XML. Cuando los datos XML se asocian con una coleccin de
esquemas XML, se llama XML con tipo, de lo contrario se llama XML sin tipo. Con tipo y XML sin tipo se alojan en un marco nico, el modelo de datos XML se conserva, y el procesamiento de consultas aplica la semntica XML. La infraestructura relacional subyacente se utiliza ampliamente para este propsito. Es compatible con la
interoperabilidad entre datos relacionales y XML, con objeto de alcanzar la adopcin ms generalizada de las caractersticas XML.
aplicaciones de SQL, siguen comportndose correctamente en la actualizacin a SQL Server 2008. De datos XML que residen en los archivos y las columnas de texto o la imagen se puede mover en las columnas de tipo de datos XML en el servidor. La columna XML se puede indexar, consultar y modificar con los mtodos de tipo de datos XML.
La base de datos relacional mejora la infraestructura existente y los componentes del motor como el motor de almacenamiento y el procesador de consultas para procesamiento de XML. Por ejemplo, crear ndices XML B rboles y los planes de consulta se pueden ver en la salida del plan de presentacin. Puesto que la
+
funcionalidad de gestin de datos, tales como copia de seguridad / restauracin y replicacin, se integra en el marco relacional, esta funcionalidad est disponible en los datos XML. Adems, las nuevas caractersticas de datos de gestin, como reflejo de base y el aislamiento de instantneas, el trabajo con el tipo de datos XML para proporcionar una experiencia de usuario sin fisuras.
CIBERTEC
CARRERAS PROFESIONALES
130
Los datos estructurados se almacenan en tablas y columnas relacionales. El tipo de datos XML es una eleccin adecuada de los datos semi-estructurados y marcado con XML cuando la aplicacin necesita para llevar a cabo de grano fino de la consulta y modificacin de los datos.
La nueva directiva TYPE genera una instancia de tipo de datos XML que se pueden asignar a una columna de XML, una variable o parmetro, o consultar utilizando los mtodos de tipo de datos XML. instrucciones de tipo XML. Esto permite el anidamiento de SELECT... FOR
El modo PATH permite a los usuarios especificar la ruta en el rbol XML donde el valor de una columna debe aparecer y junto con el mencionado anidacin. Es ms cmodo para escribir que para EXPLCITA XML.
El XSINIL Directiva, que se utiliza en conjuncin con elementos, mapas NULL a un elemento con el atributo xsi: nil = "true". Adems, la Directiva permite a la nueva raz un nodo raz que se especificarn en todos los modos de FOR XML. La directiva XMLSCHEMA nueva genera un esquema XSD en lnea. FOR XML en SQL Server 2008 tambin permite a los usuarios especificar los nombres de elementos para sustituir a la <row> por defecto en modo FOR XML RAW.
Mejoras funcionales OpenXML consisten en la posibilidad de aceptar el tipo de datos XML en sp_preparedocument, y para generar XML y nuevas columnas de tipo SQL del conjunto de filas.
CARRERAS PROFESIONALES
CIBERTEC
131
documentos, sino tambin fragmentos de XML llamado contento con los nodos de texto y un nmero arbitrario de elementos de nivel superior.
Comprueba la buena formacin de los datos se lleva a cabo, que no requiere el tipo de datos XML en obligarse a los esquemas XML. Datos que no estn bien formados son rechazados. XML sin tipo es til cuando el esquema no se sabe a priori para que una solucin basada en la cartografa no sea posible. Tambin, es til cuando el esquema se conoce, pero la asignacin a un modelo de datos relacional es muy complejo y difcil de mantener, o existen varios esquemas y estn obligados a fines de los datos basados en los requerimientos externos.
La siguiente sentencia crea una tabla llamada SOLICITUD con una clave entera y una columna XML sin tipo llamada detalle
USE NEGOCIOS2011 GO
CREATE TABLE CREDITO( ID INT PRIMARY KEY, DETALLE XML NOT NULL)
4.2.1.2 XML con tipo Si se han definido esquemas XML que describe los datos XML, se puede asociar la coleccin de esquemas XML con la columna de XML para obtener XML con tipo. Los esquemas XML se utilizan para validar los datos, realizar comprobaciones de tipo ms preciso que el XML sin tipo durante la compilacin de las declaraciones de
CIBERTEC
CARRERAS PROFESIONALES
132
Las columnas XML, los parmetros y las variables pueden almacenar documentos XML o contenido, que se puede especificar como una opcin (documento o contenido, respectivamente, con un contenido por defecto) en el momento de la declaracin. Adems, debe proporcionar la coleccin de esquemas XML.
Especificar el documento si cada instancia XML tiene exactamente un elemento de nivel superior, de lo contrario, usar el contenido. El compilador de consultas utiliza el indicador DOCUMENTO en los controles de tipo SINGLETON para inferir elementos de nivel superior.
La siguiente sentencia crea una tabla llamada XmlCredito con un documento XML con tipo columna con myCollection. La columna XML se especifica tambin que aceptar fragmentos de XML, no slo los documentos XML.
USE NEGOCIOS2011 GO
Como tipo binario o de SQL que se convierte implcitamente en el tipo de datos XML.
A travs del contenido de un archivo. Como la salida del mecanismo de publicacin XML FOR XML con la directiva TYPE, que genera una instancia de datos de tipo XML.
El valor proporcionado se comprueba la buena formacin. Una columna XML por defecto permite a ambos documentos y fragmentos XML para ser almacenados. Si los
CARRERAS PROFESIONALES
CIBERTEC
133
datos no pasan la comprobacin de buena formacin, se rechaza con un mensaje de error apropiado.
Para un dato XML con tipo, el valor proporcionado se comprueba la conformidad con los esquemas XML que se registran en la coleccin de esquemas XML que est escribiendo la columna XML. La instancia XML se rechaza si no est validacin. restringe los valores aceptados para
documentos XML slo mientras que el contenido permite a ambos documentos XML y contenido para su entrega.
La siguiente declaracin se inserta una nueva fila en la tabla denominada CREDITOS con el valor 1 para la columna de clave primaria y una instancia de <credito> para la columna XML. Los datos <credito>, suministrado como una cadena, se convierte implcitamente en el tipo de datos XML y comprobar la buena formacin durante la insercin.
USE NEGOCIOS2011 GO
INSERT INTO CREDITO VALUES (1, '<CREDITO FECHA="10-08-2011"> <CLIENTE> <NOMBRE>MICHAEL</NOMBRE> <APELLIDO>HOWARD</APELLIDO> <MONTO>1200</MONTO> </CLIENTE> <CLIENTE> <NOMBRE>DAVID</NOMBRE> <APELLIDO>LEBLANC</APELLIDO> <MONTO>1290</MONTO> </CLIENTE> <CLIENTE> <NOMBRE>DAVID</NOMBRE> <APELLIDO>LEBLANC</APELLIDO> <MONTO>1290</MONTO> </CLIENTE>
CIBERTEC
CARRERAS PROFESIONALES
134
</CREDITO>'), (2, '<CREDITO FECHA="12-08-2011"> <CLIENTE> <NOMBRE>MANUEL</NOMBRE> <APELLIDO>LUNA</APELLIDO> <MONTO>3400</MONTO> </CLIENTE> <CLIENTE> <NOMBRE>JORGE</NOMBRE> <APELLIDO>LAURA</APELLIDO> <MONTO>1290</MONTO> </CLIENTE> <CLIENTE> <NOMBRE>INES</NOMBRE> <APELLIDO>RIOS</APELLIDO> <MONTO>4500</MONTO> </CLIENTE> </CREDITO>')
Para listar los registros de la tabla, ejecutamos la sintaxis siguiente, donde el proceso listar los registros y la estructura XML insertado. Para abrir un archivo, hacer un click al link, tal como se muestra.
CARRERAS PROFESIONALES
CIBERTEC
135
La instruccin INSERT en el segmento de cdigo siguiente lee el contenido del archivo C:\temp\credito.xml como un BLOB mediante el uso de OPENROWSET. Una nueva fila se insertar en la tabla denominada CREDITOS con un valor de 3 para la clave principal y el contenido del archivo en la columna XML llamada detalle.
USE NEGOCIOS2011 GO
INSERT INTO CREDITO SELECT 3, DETALLE FROM (SELECT * FROM OPENROWSET (BULK 'C:\TEMP\CREDITOS.XML', SINGLE_BLOB) AS DETALLE) AS R(DETALLE) GO
4.2.3
Una consulta SELECT devuelve los resultados como un conjunto de filas. Opcionalmente, se pueden recuperar resultados formales de una consulta SQL como XML especificando la clusula FOR XML en la consulta. La clusula FOR XML puede usarse en consultas de nivel superior y en subconsultas.
[ FOR { BROWSE | <XML> } ] <XML> ::= XML { { RAW [ ('ElementName') ] | AUTO } [ <CommonDirectives> [ , { XMLDATA | XMLSCHEMA [ ('TargetNameSpaceURI') ]} ] [ , ELEMENTS [ XSINIL | ABSENT ] ] | EXPLICIT [ <CommonDirectives> [ , XMLDATA ] ] | PATH [ ('ElementName') ]
CIBERTEC
CARRERAS PROFESIONALES
136
[ <CommonDirectives> [ , ELEMENTS [ XSINIL | ABSENT ] ] ] } <CommonDirectives> ::= [ , BINARY BASE64 ] [ , TYPE ] [ , ROOT [ ('RootName') ] ]
Argumentos RAW[('ElementName')]
Descripcin Obtiene el resultado de la consulta y transforma cada fila del conjunto de resultados en un elemento XML con un identificador genrico <row /> como etiqueta del elemento. Opcionalmente, puede especificar un nombre para el elemento de fila cuando se utiliza esta directiva. El XML resultante utilizar el ElementName especificado como el elemento de fila generado para cada fila.
AUTO
Devuelve los resultados de la consulta en un rbol anidado XML sencillo. Cada tabla en la clusula FROM de la que al menos se presenta una columna en la clusula SELECT se representa como un elemento XML. A las columnas presentadas en la clusula SELECT se les asignan los atributos de elemento apropiados.
EXPLICIT
Especifica que la forma del rbol XML resultante est definida explcitamente. Con este modo, es necesario escribir las consultas de una cierta manera, de modo que se pueda especificar explcitamente informacin adicional acerca de la anidacin deseada.
PATH
Facilita la mezcla de elementos y atributos, as como la especificacin de anidacin adicional para representar propiedades complejas. Puede utilizar consultas FOR XML de modo EXPLICIT para construir XML a partir de un conjunto de filas, pero el modo PATH supone una alternativa ms simple a las consultas de modo EXPLICIT potencialmente complicadas. De forma predeterminada, el modo PATH genera un contenedor
CARRERAS PROFESIONALES
CIBERTEC
137
de elementos <row> para cada fila del conjunto de resultados. Tambin se puede especificar un nombre de elemento. En este caso, el nombre especificado se utilizar como nombre del elemento contenedor. Si se proporciona una cadena vaca (FOR XML PATH ('')), no se generar ningn elemento contenedor. XMLDATA Especifica que se debe devolver un esquema XDR (XML-Data Reduced) insertado. El esquema se antepone al documento como un esquema insertado. XMLSCHEMA Devuelve un esquema XML W3C (XSD) insertado. Opcionalmente, puede especificar un URI de espacio de nombres de destino al especificar esta directiva. De este modo, se devuelve el espacio de nombres especificado en el esquema. ELEMENTS Si se especifica la opcin ELEMENTS, las columnas se devuelven como subelementos. Sin embargo, se les asignan atributos XML. Esta opcin solo se admite en los modos RAW, AUTO y PATH. Tambin puede especificar XSINIL o ABSENT cuando utilice esta directiva. XSINIL especifica que se puede crear un elemento con un atributo XSI:NIL establecido en True para los valores de columna NULL. De forma predeterminada, o cuando se especifica ABSENT junto con ELEMENTS, no se crea ningn elemento para los valores NULL. BINARY BASE64 Si se especifica la opcin BINARY Base64, todos los datos binarios que devuelve la consulta se representan en formato codificado base64. Para recuperar datos binarios mediante el modo RAW y EXPLICIT, se debe especificar esta opcin. En modo AUTO, de forma predeterminada, se devuelven datos binarios como una referencia.
TYPE
ROOT [('RootName')]
CIBERTEC
CARRERAS PROFESIONALES
138
nivel superior al XML resultante. Tambin se puede especificar el nombre del elemento raz que se generar. El valor predeterminado es "root".
La clusula FOR XML de nivel superior slo puede usarse en la instruccin SELECT. En el caso de las subconsultas, FOR XML puede usarse en las instrucciones INSERT, UPDATE y DELETE. Tambin puede usarse en instrucciones de asignacin.
El modo RAW transforma cada fila del conjunto de resultados de la consulta en un elemento XML que tiene el identificador genrico <row> o el nombre del elemento, que se proporciona de manera opcional. De manera predeterminada, cada valor de columna del conjunto de filas que no es NULL se asigna a un atributo del elemento <row>. Si se agrega la directiva ELEMENTS a la clusula FOR XML, cada valor de columna se asigna a un subelemento del elemento <row>. Opcionalmente, junto con la directiva ELEMENTS se puede especificar la opcin XSINIL para asignar los valores de columna NULL del conjunto de resultados a un elemento que tenga el atributo, xsi:nil="true".
El siguiente ejemplo nos permite recuperar un fragmento XML que contienen los datos utilizando la clusula FOR XML en modo RAW
USE NEGOCIOS2011 GO
CARRERAS PROFESIONALES
CIBERTEC
139
FROM VENTAS.CLIENTES C JOIN VENTAS.PEDIDOSCABE P ON C.IDCLIENTE = P.IDCLIENTE ORDER BY IDPEDIDO FOR XML RAW GO
La consulta produce un fragmento XML que contiene elementos <row>. Al abrir el fragmento se lista todas las filas de la consulta en formato XML, tal como se muestra en la figura siguiente
El siguiente ejemplo muestra cmo recuperar la data como elementos en lugar de atributos especificando la opcin ELEMENTS
USE NEGOCIOS2011 GO
CIBERTEC
CARRERAS PROFESIONALES
140
SELECT IDPEDIDO, FECHAPEDIDO, C.NOMCLIENTE AS CLIENTE, C.DIRCLIENTE AS DIRECCION FROM VENTAS.CLIENTES C JOIN VENTAS.PEDIDOSCABE P ON C.IDCLIENTE = P.IDCLIENTE ORDER BY IDPEDIDO FOR XML RAW, ELEMENTS GO
El modo AUTO devuelve los resultados de la consulta como elementos XML anidados. Esto no ofrece un gran control sobre la forma del XML generado a partir del resultado de una consulta. Las consultas en modo AUTO son tiles si desea generar jerarquas sencillas. Sin embargo, Usar el modo EXPLICIT y Usar el modo PATH ofrecen mayor
CARRERAS PROFESIONALES
CIBERTEC
141
control y flexibilidad a la hora de decidir la forma del XML procedente del resultado de una consulta.
Cada tabla de la clusula FROM, de la que al menos se presenta una columna en la clusula SELECT, se representa como un elemento XML. Las columnas que se incluyen en la clusula SELECT se asignan a atributos o subelementos, si se especifica la opcin ELEMENTS en la clusula FOR XML.
La jerarqua XML, anidamiento de los elementos, del XML resultante est basada en el orden de las tablas identificadas por las columnas especificadas en la clusula SELECT. Por tanto, el orden en que se especifican los nombres de columna en la clusula SELECT es importante. La primera, la tabla situada ms a la izquierda que se identifica, constituye el elemento superior del documento XML resultante. La segunda tabla situada ms a la izquierda, identificada por las columnas de la instruccin SELECT, constituye un subelemento del elemento superior, etc.
En el siguiente ejemplo, muestra cmo utilizar la consulta de modo AUTO que retorne un fragmento XML que contiene la lista de pedidos por cliente
SELECT C.NOMCLIENTE AS CLIENTE, C.DIRCLIENTE AS DIRECCION, IDPEDIDO, FECHAPEDIDO FROM VENTAS.CLIENTES C JOIN VENTAS.PEDIDOSCABE P ON C.IDCLIENTE = P.IDCLIENTE ORDER BY NOMCLIENTE FOR XML AUTO GO
CIBERTEC
CARRERAS PROFESIONALES
142
En el fragmento XML, agrupa los pedidos por cada cliente, donde los atributos representan el nombre del cliente y su direccin; sus elementos son los datos de cada pedido.
En el siguiente ejemplo, vamos a recuperar los datos como elementos en lugar de atributos especificando con la opcin ELEMENTS.
SELECT C.NOMCLIENTE AS CLIENTE, C.DIRCLIENTE AS DIRECCION, IDPEDIDO, FECHAPEDIDO FROM VENTAS.CLIENTES C JOIN VENTAS.PEDIDOSCABE P ON C.IDCLIENTE = P.IDCLIENTE ORDER BY NOMCLIENTE FOR XML AUTO, ELEMENTS GO
CARRERAS PROFESIONALES
CIBERTEC
143
El modo EXPLICIT concede un mayor control de la forma del XML. Es posible mezclar atributos y elementos con total libertad para decidir la forma del XML. Requiere un formato especfico para el conjunto de filas resultante generado debido a la ejecucin de la consulta. Despus, el formato del conjunto de filas se asigna a una forma de XML.
El modo EXPLICIT transforma en un documento XML el conjunto de filas resultante de la ejecucin de la consulta. Para que el modo EXPLICIT, pueda generar el documento XML, el conjunto de filas debe ajustarse a un determinado formato. Por ello, es necesario escribir la consulta SELECT para generar el conjunto de filas, la tabla universal, con un formato especfico que permita a la lgica del procesamiento generar el XML deseado.
En primer lugar, la consulta debe crear las dos columnas de metadatos siguientes:
La primera columna debe proporcionar el nmero de etiqueta, el tipo de entero, del elemento actual, y el nombre de la columna debe ser Tag. La consulta debe proporcionar un nmero de etiqueta nico para cada elemento que se vaya a construir a partir del conjunto de filas.
La segunda columna debe proporcionar un nmero de etiqueta del elemento primario, y el nombre de la columna debe ser Parent. De este modo, las columnas Tag y Parent ofrecen informacin sobre la jerarqua.
Los valores de estas columnas de metadatos, junto con la informacin de los nombres de columna, se usan para generar el XML deseado. Tenga en cuenta que la consulta debe proporcionar los nombres de columna de una manera determinada. Observe tambin que un valor 0 NULL en la columna Parent indica que el elemento correspondiente no tiene uno primario. El elemento se agrega al XML como elemento de nivel superior.
En el siguiente ejemplo, vamos a listar los datos de los clientes, donde el campo id y nombre sern atributos, y el campo direccin y telfono sern elementos.
CIBERTEC
CARRERAS PROFESIONALES
144
SELECT 1 AS TAG, NULL AS PARENT, IDCLIENTE AS [CLIENTE!1!CODIGO], NOMCLIENTE AS [CLIENTE!1!NOMBRE], DIRCLIENTE AS [CLIENTE!1!DIRECCION!ELEMENT], TELEFONO AS [CLIENTE!1!TELEFONO!ELEMENT] FROM VENTAS.CLIENTES FOR XML EXPLICIT GO
El fragmento XML lista las filas de la tabla de clientes, donde el cdigo y el nombre son atributos; y los campos direccin y telfono son elementos.
El modo PATH facilita la combinacin de elementos y atributos. Tambin, facilita la especificacin de anidacin adicional para representar propiedades complejas. Puede utilizar consultas de modo FOR XML EXPLICIT para generar XML a partir de un conjunto de filas, pero el modo PATH supone una alternativa ms sencilla a las consultas de modo EXPLICIT potencialmente complicadas. El modo PATH, junto con la posibilidad de escribir consultas FOR XML anidadas y la directiva TYPE para devolver instancias de tipo XML, permite escribir consultas de forma ms fcil.
En el modo PATH, los nombres o alias de columna se tratan como expresiones XPath. Estas expresiones indican el modo en el que se asignan los valores a XML. Cada expresin XPath es una expresin relativa que proporciona el tipo de elemento, como el atributo, el elemento y el valor escalar, as como el nombre y la jerarqua del nodo que se generar en relacin con el elemento de fila.
En el siguiente ejemplo, vamos a ejecutar una consulta de pedidos cuyo ao de pedido sea en el 2011 en modo FOR XML PATH.
CARRERAS PROFESIONALES
CIBERTEC
145
SELECT IDPEDIDO, FECHAPEDIDO, DESTINATARIO FROM VENTAS.PEDIDOSCABE WHERE DATEPART(YY,FECHAPEDIDO)=2011 FOR XML PATH GO
El resultado siguiente es XML centrado en elementos en el que cada valor de columna del conjunto de filas resultante se agrupa en un elemento. Puesto que la clusula SELECT no especifica ningn alias para los nombres de columna, los nombres de elemento secundario generados son los mismos que los nombres de de la columna clusula
correspondientes
SELECT. Para cada fila del conjunto de filas, se agrega una etiqueta <row>.
El siguiente ejemplo muestra cmo utilizar la consulta de modo PATH y retorna un fragmento XML que contiene la lista de los empleados
SELECT IDEMPLEADO "@ID", APELLIDOS "EMPLEADO/APELLIDO", NOMBRE "EMPLEADO/NOMBRE", DIRECCION "EMPLEADO/DIRECCION" FROM RRHH.EMPLEADOS FOR XML PATH GO
CIBERTEC
CARRERAS PROFESIONALES
146
El id del empleado es mapeado como atributo con el signo (@), las columnas apellidos, nombre y direccin estn mapeados como sub elementos de Empleado con la marca slash /.
El siguiente ejemplo muestra cmo utilizar el argumento opcional ElementName a la consulta de modo PATH para modificar el nombre del elemento row.
SELECT IDEMPLEADO "@ID", APELLIDOS "EMPLEADO/APELLIDO", NOMBRE "EMPLEADO/NOMBRE", DIRECCION "EMPLEADO/DIRECCION" FROM TB_EMPLEADOS FOR XML PATH('EMPLOYEE') GO
CARRERAS PROFESIONALES
CIBERTEC
147
4.2.4
OPENXML, palabra clave de Transact-SQL, proporciona un conjunto de filas en documentos XML en memoria que es similar a una tabla o una vista. OPENXML permite el acceso a los datos XML a pesar de ser un conjunto de filas relacional. Para ello, proporciona una vista de conjunto de filas de la representacin interna de un documento XML. Los registros del conjunto de filas pueden almacenarse en tablas de base de datos.
OPENXML puede utilizarse en instrucciones SELECT y SELECT INTO donde puedan aparecer como origen proveedores de conjuntos de filas, una vista u OPENROWSET.
Para escribir consultas en un documento XML mediante OPENXML, primero es necesario llamar a sp_xml_preparedocument, que analiza el documento XML y devuelve un identificador para el documento analizado que est listo para su uso. El documento analizado es una representacin en rbol del modelo de objetos de documento (DOM) de los distintos nodos del documento XML. Este identificador de documento se pasa a OPENXML. A continuacin, OPENXML proporciona una vista de conjunto de filas del documento, basndose en los parmetros que ha recibido.
4.2.4.1 Ejecutar una instruccin SELECT simple con OPENXML El documento XML de este ejemplo se compone de los elementos <Clientes>, <Pedido> y <PedidoDetalle>. La instruccin OPENXML recupera la informacin del cliente desde el documento XML en un conjunto de filas de dos columnas (IDCliente y Nombre). Primero, para obtener un identificador de documento se llama al procedimiento almacenado sp_xml_preparedocument. Este identificador de documento se pasa a OPENXML. La instruccin OPENXML muestra lo siguiente:
El valor del parmetro flags se establece en 1 e indica una asignacin centrada en atributos. Como resultado, los atributos XML se asignan a las columnas del conjunto de filas definido en SchemaDeclaration.
CIBERTEC
CARRERAS PROFESIONALES
148
En
SchemaDeclaration,
en
la
clusula
WITH,
los
valores
ColName
especificados coinciden con los nombres de atributo XML correspondientes. Por lo tanto, el parmetro ColPattern no se especifica en SchemaDeclaration.
A continuacin, la instruccin SELECT recupera todas las columnas del conjunto de filas que proporciona OPENXML.
DECLARE @DocHandle int DECLARE @XmlDocument nvarchar(1000) SET @XmlDocument = N'<ROOT> <Cliente IDCliente="VINET" Nombre="Paul Henriot"> <Pedido IDpedido="10248" IDCliente="VINET" IDEmpleado="5" Fecha="1996-07-04T00:00:00"> <PedidoDetalle IDProducto="11" Cantidad="12"/> <PedidoDetalle IDProducto="42" Cantidad="10"/> </Pedido> </Cliente> <Cliente IDCliente="LILAS" Nombre="Carlos Gonzlez"> <Pedido IDpedido="10283" IDCliente="LILAS" IDEmpleado="3" Fecha="1996-08-16T00:00:00"> <PedidoDetalle IDProducto="72" Cantidad="3"/> </Pedido> </Cliente> </ROOT>' -- Crear la representacion interna del documento XML. EXEC sp_xml_preparedocument @DocHandle OUTPUT, @XmlDocument -- Ejecutar una sentencia SELECT utilizando OPENXML . SELECT * FROM OPENXML (@DocHandle, '/ROOT/Cliente',1) WITH (IDCliente varchar(10),
4.2.4.2 Especificar ColPattern para la asignacin entre columnas del conjunto de filas y los atributos y elementos XML Este ejemplo muestra cmo se especifica el patrn XPath en el parmetro opcional ColPattern para proporcionar una asignacin entre columnas del conjunto de filas y los atributos y elementos XML. El documento XML de este ejemplo se compone de los
CARRERAS PROFESIONALES
CIBERTEC
149
elementos <Cliente>, <Pedido> y <PedidoDetalle>. La instruccin OPENXML recupera la informacin del cliente y del pedido del documento XML en forma de conjunto de filas (IDCliente, Fecha, IDProducto y Cantidad).
Primero, para obtener un identificador de documento se llama al procedimiento almacenado sp_xml_preparedocument. Este identificador de documento se pasa a OPENXML. La instruccin OPENXML muestra lo siguiente:
rowpattern
(/ROOT/Cliente/Pedido/PedidoDetalle)
identifica
los
nodos
A modo de ilustracin, el valor del parmetro flags se establece en 2 e indica una asignacin centrada en elementos. Sin embargo, la asignacin especificada en ColPattern sobrescribe esta asignacin,es decir, el patrn XPath especificado en ColPattern asigna a atributos las columnas del conjunto de filas. El resultado es una asignacin centrada en atributos.
En SchemaDeclaration, en la clusula WITH, tambin se especifica ColPattern con los parmetros ColName y ColType. El parmetro opcional ColPattern es el patrn XPath especificado e indica lo siguiente:
Las columnas IDPedido, IDCliente y Fechae del conjunto de filas se asignan a los atributos del elemento primario de los nodos identificados por rowpattern, y rowpattern identifica los nodos <OrderDetail>. Por lo tanto, las columnas IDCliente y Fecha se asignan a los atributos IDCliente y Fecha del elemento <Order>.
Las columnas IDProducto y Cantidad del conjunto de filas se asignan a los atributos IDProducto y Cantidad de los nodos identificados en rowpattern.
A continuacin, la instruccin SELECT recupera todas las columnas del conjunto de filas que proporciona OPENXML.
CIBERTEC
CARRERAS PROFESIONALES
150
DECLARE @XmlDocumentHandle int DECLARE @XmlDocument nvarchar(1000) SET @XmlDocument = N'<ROOT> <Cliente IDCliente="VINET" Nombre="Paul Henriot"> <Pedido IDpedido="10248" IDCliente="VINET" IDEmpleado="5" Fecha="1996-07-04T00:00:00"> <PedidoDetalle IDProducto="11" Cantidad="12"/> <PedidoDetalle IDProducto="42" Cantidad="10"/> </Pedido> </Cliente> <Cliente IDCliente="LILAS" Nombre="Carlos Gonzlez"> <Pedido IDpedido="10283" IDCliente="LILAS" IDEmpleado="3" Fecha="1996-08-16T00:00:00"> <PedidoDetalle IDProducto="72" Cantidad="3"/> </Pedido> </Cliente> </ROOT>'
-- Crea una representacion interna del documento XML. EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument
-- Ejecuta la sentencia SELECT utilziando OPENXML SELECT * FROM OPENXML (@XmlDocumentHandle, '/ROOT/Cliente/Pedido/PedidoDetalle',2) WITH (IDpedido IDCliente Fecha IDProducto Cantidad int '../@IDpedido',
CARRERAS PROFESIONALES
CIBERTEC
151
Resumen
Los datos XML pueden interactuar con datos relacionales y aplicaciones SQL. Esto significa que XML puede ser introducido en el sistema segn las necesidades de modelado de datos se presentan sin interrumpir las aplicaciones existentes. El servidor de base de datos tambin proporciona una funcionalidad administrativa para la gestin de datos XML (por ejemplo, BACKUP, recuperacin y replicacin). SQL Server 2008 introduce un tipo de datos nativo llamado XML. Un usuario puede crear una tabla que tiene una o ms columnas de tipo XML, adems de columnas relacionales. permitidos. Puede crear una tabla con una columna XML mediante la instruccin CREATE TABLE de costumbre. La columna XML puede ser indexado de una manera Las variables y los parmetros de XML tambin son
especial. Puede trabaja con formato o sin formato Para almacenar datos XML, puede proporcionar un valor para una columna XML a travs de un parmetro o una variable de varias maneras:
Como tipo binario o de SQL que se convierte implcitamente en el tipo de datos XML.
A travs del contenido de un archivo. Como la salida del mecanismo de publicacin XML FOR XML con la directiva TYPE, que genera una instancia de datos de tipo XML.
El valor proporcionado se comprueba la buena formacin. Una columna XML por defecto permite a ambos documentos y fragmentos XML para ser almacenados. Si los datos no pasan la comprobacin de buena formacin, se rechaza con un mensaje de error apropiado. Una consulta SELECT devuelve los resultados como un conjunto de filas. Opcionalmente, se pueden recuperar resultados formales de una consulta SQL como XML especificando la clusula FOR XML en la consulta. La clusula FOR XML puede usarse en consultas de nivel superior y en subconsultas. El modo RAW transforma cada fila del conjunto de resultados de la consulta en un elemento XML que tiene el identificador genrico <row> o el nombre del elemento, que se proporciona de manera opcional. El modo AUTO devuelve los resultados de la consulta como elementos XML anidados. El modo EXPLICIT concede un mayor
CIBERTEC
CARRERAS PROFESIONALES
152
control de la forma del XML. Es posible mezclar atributos y elementos con total libertad para decidir la forma del XML. OPENXML, palabra clave de Transact-SQL, proporciona un conjunto de filas en documentos XML en memoria que es similar a una tabla o una vista. OPENXML permite el acceso a los datos XML a pesar de ser un conjunto de filas relacional.
Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas:
http://technet.microsoft.com/es-es/library/ms187897(SQL.90).aspx Aqu hallar los conceptos de OPENXML http://msdn.microsoft.com/es-es/library/ms178107.aspx En esta pgina, hallar los conceptos de consulta FOR XML http://msdn.microsoft.com/en-us/library/ms345117(v=sql.90).aspx Aqu hallar los conceptos de manejo de datos en formato XML
CARRERAS PROFESIONALES
CIBERTEC
153
UNIDAD DE APRENDIZAJE
TEMARIO 1.1. Introduccin 1.1.1. Entidades de seguridad 1.1.2. Autenticacin 1.1.3. Inicio de sesin y usuarios 1.1.3.1. Creacin de login 1.1.3.2. Creacin de usuarios en SQL Server 1.1.3.3. Manejo de roles a nivel servidor 1.1.3.4. Manejo de roles a nivel base de datos 1.1.4. Permisos en el motor de base de datos 1.1.4.1. Comando GRANT 1.1.4.2. Comando DENY 1.1.4.3. Comando REVOKE ACTIVIDADES PROPUESTAS
Los alumnos crea usuarios para manejar los objetos de la base de datos. Los alumnos asigna permisos a los usuarios de una base de datos para realizar operaciones de manipulacin de datos y definicin de datos.
CIBERTEC
CARRERAS PROFESIONALES
154
CARRERAS PROFESIONALES
CIBERTEC
155
5.1 INTRODUCCION
SQL Server 2008 es compatible con los modos de autenticacin de Windows y se mezcla y se integra estrechamente con l. En este modo de acceso, se concede sobre la base de un TOKEN de seguridad asignada durante el inicio de sesin de dominio con xito por una cuenta de Windows y SQL Server se solicita el acceso posteriormente. La condicin previa es que ambos deben pertenecer al mismo
entorno de ventanas.
El entorno de dominio de ACTIVE DIRECTORY proporciona un nivel adicional de proteccin del protocolo KERBEROS. Este protocolo regula el comportamiento del mecanismo de autenticacin de Windows. En el servidor de autenticacin de modo mixto SQL, tambin se puede utilizar. Las credenciales se verifican desde el
El aumento de la seguridad se ha despedido de la necesidad de mantener el conjunto separado de cuentas. Sin embargo, los inicios de sesin de SQL Server se han
mejorado con el cifrado de los Certificados de SQL generado para las comunicaciones que involucran el software de cliente basado en MADC. NET.
SQL Server incluye varios mtodos y herramientas que permiten configurar la seguridad para que los usuarios, los servicios y las otras cuentas puedan tener acceso al sistema.
El mbito de influencia de una entidad de seguridad depende del mbito de su definicin: Windows, servidor o base de datos; y de si la entidad de seguridad es indivisible o es una coleccin. Un Inicio de sesin de Windows es un ejemplo de entidad de seguridad indivisible y un Grupo de Windows es un ejemplo de una del tipo coleccin. Toda entidad de seguridad tiene un identificador de seguridad (SID).
CIBERTEC
CARRERAS PROFESIONALES
156
El inicio de sesin sa de SQL Server es una entidad de seguridad del servidor. Se crea de forma predeterminada cuando se instala una instancia. En SQL Server 2005 y SQL Server 2008, la base de datos predeterminada de sa es master. Es un cambio de comportamiento con respecto a versiones anteriores de SQL Server.
Todos los usuarios de una base de datos pertenecen a la funcin public de la base de datos. Cuando a un usuario no se le han concedido ni denegado permisos de un elemento que puede protegerse, el usuario hereda los permisos de ese elemento concedidos a public.
Por definicin, un cliente y un servidor de base de datos son entidades de seguridad y se pueden proteger. Estas entidades se pueden autenticar mutuamente antes de establecer una conexin de red segura. SQL Server admite el protocolo de autenticacin Kerberos, que define cmo interactan los clientes con un servicio de autenticacin de red.
En este ejemplo, listamos todos los usuarios de la base de datos Negocios2011, donde le resultado se muestra en la figura siguiente
CARRERAS PROFESIONALES
CIBERTEC
157
USE NEGOCIOS2011 GO
5.1.2 Autenticacin
Para acceder a SQL SERVER, se dispone de dos modos de autenticacin:
SQL Server usa despus esa identificacin del sistema operativo para determinar los permisos del usuario que hay que aplicar. Con la autenticacin en modo mixto, los dos Windows y SQL Server son responsables de identificar al usuario.
En la ventana del explorador de objetos, hacer click derecho sobre el administrador del SQL Server, seleccione la opcin Propiedades, tal como se muestra en la figura.
CIBERTEC
CARRERAS PROFESIONALES
158
En la ventana de propiedades, selecciona la opcin SEGURIDAD, para visualizar las opciones de seguridad. Seleccione el modo de autenticacin de servidor, seleccione Modo Windows y SQL Server, modo mixto, para que el usuario ingrese por cualquier de las dos formas, cuando realice los cambios presione el botn ACEPTAR
CARRERAS PROFESIONALES
CIBERTEC
159
Segn lo visto anteriormente, una cuenta de usuario de Windows puede ser necesaria para conectarse a una base de datos. Tambin, podra ser necesaria la autenticacin de SQL Server. Tanto si se va a usar autenticacin de Windows o autenticacin de modo mixto, la cuenta que se usa para la conexin a SQL SERVER se le conoce como inicio de sesin de SQL Server.
En forma predeterminada, una cuenta de inicio de sesin de SQL Server no tiene un ID de usuario de base de datos asociado con ella, por ello carece de permisos.
Podemos manejar un inicio de sesin utilizando el explorador de objetos en el manejador del SQL Server o ejecutando las sentencias CREATE LOGIN, ALTER LOGIN y DROP LOGIN
Para crear un inicio de sesin o login, usamos la sentencia CREATE LOGIN, la sintaxis es la siguiente:
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 <sources> ::= WINDOWS [ WITH <windows_options>[ ,... ] ]
CIBERTEC
CARRERAS PROFESIONALES
160
| CERTIFICATE certname | ASYMMETRIC KEY asym_key_name<windows_options> ::= DEFAULT_DATABASE =database | DEFAULT_LANGUAGE =language
Argumentos loginName
Descripcin Especifica el nombre del inicio de sesin que se va a crear. Hay cuatro tipos de inicio de sesin: de SQL Server, de Windows, asignado a un certificado y asignado a una clave asimtrica. Cuando crea inicios de sesin que se asignan desde una cuenta de dominio de Windows, debe usar el nombre de inicio de sesin de usuario anterior a Windows 2000 con el formato [<Dominio>\<InicioDeSesin>].
PASSWORD ='password'
Slo se aplica a inicios de sesin de SQL Server. Especifica la contrasea del inicio de sesin que se est creando. Debe usar siempre una contrasea segura.
DEFAULT_DATABASE =database
Especifica la base de datos predeterminada que debe asignarse al inicio de sesin. Si no se incluye esta opcin, la base de datos predeterminada es master.
DEFAULT_LANGUAGE =language
Especifica el idioma predeterminado que debe asignarse al inicio de sesin. Si no se incluye esta opcin, el idioma predeterminado es el del servidor. Si el idioma predeterminado del servidor se cambia ms tarde, el del inicio de sesin se mantiene igual.
CHECK_EXPIRATION = { ON | OFF }
Slo se aplica a inicios de sesin de SQL Server. Especifica si debe aplicarse la directiva de expiracin de contraseas en este inicio de sesin. El valor
predeterminado es OFF. CHECK_POLICY = { ON | OFF } Slo se aplica a inicios de sesin de SQL Server. Especifica que se deben aplicar las directivas de contraseas de Windows en el equipo que ejecuta SQL Server para este inicio de sesin. El valor
predeterminado es ON.
CARRERAS PROFESIONALES
CIBERTEC
161
En el ejemplo siguiente, crea un inicio de sesin para un usuario determinado y le asigna un password. La opcin MUST_CHANGE exige a los usuarios que cambien el password la primera vez que se conecten al servidor.
En el ejemplo siguiente, crea un inicio de sesin para un usuario determinado y le asigna un password, la opcin DEFAULT_DATABASE predeterminada.
Se puede modificar un inicio de sesin o login ejecutando la sentencia ALTER LOGIN. En el ejemplo siguiente, modificamos el password o clave del inicio de sesin cibertec, tal como se muestra.
Podemos remover un login ejecutando la sentencia DROP LOGIN, tal como se muestra en la sentencia.
CIBERTEC
CARRERAS PROFESIONALES
162
Desde
el
explorador
de
objetos,
despliegue la opcin SEGURIDAD, en la opcin Inicios de sesin, hacer click derecho y seleccione la opcin Nuevo inicio de sesin
En la ventana inicio de sesin: Asigne un nombre al inicio de sesin Defina la autenticacin, se recomienda que sea de tipo SQL Server Escriba y confirme el password Desmarcar la opcin Exigir la expiracin de la contrasea Seleccione la base de datos predeterminada (Negocios2011), si no lo selecciona, por defecto es la base de datos master. Seleccione el idioma.
CARRERAS PROFESIONALES
CIBERTEC
163
En la opcin Asignacin de usuarios, asigne al inicio de sesin la base de datos as como el esquema donde
En la opcin Estada, habilitar la sesin para trabajar con el inicio de sesin al momento de realizar la conexin. A continuacin,
Para crear un usuario utilizando comandos TRANSACT-SQL, utilice el comando CREATE USER, cuya sintaxis es la siguiente:
CIBERTEC
CARRERAS PROFESIONALES
164
CREATE USER user_name [ { { FOR | FROM } { LOGIN login_name } | WITHOUT LOGIN ] [ WITH DEFAULT_SCHEMA = schema_name ]
Argumentos
user_name
Descripcin Especifica el nombre por el que se identifica al usuario en esta base de datos. user_name es de tipo sysname. Puede tener una longitud mxima de 128 caracteres.
LOGIN login_name
Especifica el inicio de sesin de SQL Server del usuario de base de datos que se va a crear. login_name debe ser un inicio de sesin vlido en el servidor. Cuando este inicio de sesin de SQL Server se introduzca en la base de datos adquirir el nombre y el identificador del usuario de la base de datos que se va a crear.
WITHOUT LOGIN
En el siguiente ejemplo, vamos a crear primero un inicio de sesin de servidor denominado BDCibertec con su password, y a continuacin, se crea el usuario de base de datos BDCibertec correspondiente a la base de datos Negocios2011
USE NEGOCIOS2011; GO
CARRERAS PROFESIONALES
CIBERTEC
165
Utilizando
el
explorador
de
objetos,
podemos crear un usuario Seleccione la base de datos para crear el usuario: Negocios2011 Desplegar la base de datos,
seleccione la carpeta Seguridad. Despliegue Seguridad, hacer click derecho en la opcin Usuarios, seleccione la opcin Nuevo
En la ventana Nuevo usuario, asigne el nombre del usuario, asigne el inicio de sesin del usuario. Presione el botn usuario ACEPTAR, de la para base crear de el
datos
Negocios2011.
Para verificar si un usuario se encuentra en la lista de usuarios de la base de datos, ejecutar una consulta a la tabla sys.sysusers, tal como se muestra.
USE NEGOCIOS2011; GO
CARRERAS PROFESIONALES
CIBERTEC
166
Para administrar con facilidad los permisos en el servidor, SQL Server proporciona varios roles, que son las entidades de seguridad que agrupan a otras entidades de seguridad. Los roles son como los grupos del sistema operativo Microsoft Windows.
Los roles de nivel de servidor tambin se denominan roles fijos de servidor porque no se pueden crear nuevos roles de nivel de servidor. Puede agregar inicios de sesin de SQL Server, cuentas de Windows y grupos de Windows a los roles de nivel de servidor. Cada miembro de un rol fijo de servidor puede agregar otros inicios de sesin a ese mismo rol.
Descripcin Los miembros del rol fijo de servidor sysadmin pueden realizar cualquier actividad en el servidor.
serveradmin
Los miembros del rol fijo de servidor serveradmin pueden cambiar las opciones de configuracin en el servidor y apagarlo.
securityadmin
Los miembros del rol fijo de servidor securityadmin administran los inicios de sesin y sus propiedades. Pueden administrar los permisos de servidor GRANT, DENY y REVOKE. Tambin, pueden administrar los permisos de nivel de base de datos GRANT, DENY y REVOKE si tienen acceso a una base de datos. Asimismo, pueden restablecer las contraseas para los inicios de sesin de SQL Server. Nota de seguridad.- La capacidad de conceder acceso a Motor de base de datos y configurar los permisos de usuario permite que el administrador de seguridad asigne la mayora de los permisos de
CARRERAS PROFESIONALES
CIBERTEC
167
servidor. El rol securityadmin se debe tratar como equivalente del rol sysadmin. processadmin Los miembros del rol fijo de servidor processadmin pueden finalizar los procesos que se ejecuten en una instancia de SQL Server. setupadmin Los miembros del rol fijo de servidor setupadmin pueden agregar y quitar servidores vinculados. bulkadmin Los miembros del rol fijo de servidor bulkadmin pueden ejecutar la instruccin BULK INSERT. diskadmin El rol fijo de servidor diskadmin se usa para administrar archivos de disco. dbcreator Los miembros del rol fijo de servidor dbcreator pueden crear, modificar, quitar y restaurar cualquier base de datos. public Cada inicio de sesin de SQL Server pertenece al rol public de servidor. Cuando a una entidad de seguridad de servidor no se le han concedido ni denegado permisos especficos para un objeto protegible, el usuario hereda los permisos concedidos al rol public en ese objeto. Solo asigne los permisos pblicos en objetos cuando desee que estos estn disponibles para todos los usuarios.
Los roles de nivel de base de datos se aplican a toda la base de datos en lo que respecta a su mbito de permisos.
Existen dos tipos de roles de nivel de base de datos en SQL Server: los roles fijos de base de datos, que estn predefinidos en la base de datos, y los roles flexibles de base de datos, que pueden crearse.
Los roles fijos de base de datos se definen en el nivel de base de datos y existen en cada una de ellas. Los miembros de los roles de base de datos db_owner y
CIBERTEC
CARRERAS PROFESIONALES
168
db_securityadmin pueden administrar los miembros de los roles fijos de base de datos. Sin embargo, slo los miembros del rol de base de datos db_owner pueden agregar miembros al rol fijo de base de datos db_owner.
Puede agregar cualquier cuenta de la base de datos y otros roles de SQL Server a los roles de nivel de base de datos. Cada miembro de un rol fijo de base de datos puede agregar otros inicios de sesin a ese mismo rol. En la tabla siguiente, se muestran los roles fijos de nivel de base de datos y sus capacidades. Estos roles existen en todas las bases de datos.
rol de base de datos Descripcin db_owner Los miembros del rol fijo de base de datos db_owner pueden realizar todas las actividades de configuracin y mantenimiento en la base de datos y tambin pueden quitar la base de datos. db_securityadmin Los miembros del rol fijo de base de datos db_securityadmin pueden modificar la pertenencia a roles y administrar permisos. Si se agregan entidades de seguridad a este rol, podra habilitarse un aumento de privilegios no deseado. db_accessadmin Los miembros del rol fijo de base de datos db_accessadmin pueden agregar o quitar el acceso a la base de datos para inicios de sesin de Windows, grupos de Windows e inicios de sesin de SQL Server. db_backupoperator Los miembros del rol fijo de base de datos db_backupoperator pueden crear copias de seguridad de la base de datos. db_ddladmin Los miembros del rol fijo de base de datos db_ddladmin pueden ejecutar cualquier comando del lenguaje de definicin de datos (DDL) en una base de datos. db_datawriter Los miembros del rol fijo de base de datos db_datawriter pueden agregar, eliminar o cambiar datos en todas las tablas de usuario. db_datareader Los miembros del rol fijo de base de datos db_datareader
CARRERAS PROFESIONALES
CIBERTEC
169
pueden leer todos los datos de todas las tablas de usuario. db_denydatawriter Los miembros del rol fijo de base de datos db_denydatawriter no pueden agregar, modificar ni eliminar datos de tablas de usuario de una base de datos. db_denydatareader Los miembros del rol fijo de base de datos db_denydatareader no pueden leer datos de las tablas de usuario dentro de una base de datos.
Los permisos se pueden manipular con las conocidas consultas GRANT, DENY y REVOKE de TRANSACT-SQL.
5.1.4.1 Comando GRANT Concede permisos sobre un elemento protegible a una entidad de seguridad. El concepto general es GRANT <algn permiso> ON <algn objeto> TO <algn usuario, inicio de sesin o grupo>. La sintaxis de este comando:
GRANT { ALL [ PRIVILEGES ] } | permission [ ( column [ ,...n ] ) ] [ ,...n ] [ ON [ class :: ] securable ] TO principal [ ,...n ] [ WITH GRANT OPTION ] [ AS principal ]
La sintaxis completa de la instruccin GRANT es compleja. El anterior diagrama de sintaxis se ha simplificado para concentrar la atencin en su estructura. La sintaxis completa para conceder permisos para elementos protegibles especficos se describe en los temas enumerados a continuacin.
En la siguiente tabla, se enumeran los elementos protegibles y los temas donde se describe la sintaxis especfica de los mismos.
CIBERTEC
CARRERAS PROFESIONALES
170
Rol de aplicacin
GRANT (permisos de objeto de Transact-SQL) GRANT (permisos de entidad de seguridad de servidor de Transact-SQL)
Objeto Rol
GRANT (permisos de objeto de Transact-SQL) GRANT (permisos de entidad de seguridad de base de datos de Transact-SQL)
GRANT (permisos de esquema de Transact-SQL) GRANT (permisos de servidor de Transact-SQL) GRANT (permisos de objeto de Transact-SQL) GRANT (permisos de objeto de sistema de Transact-SQL)
GRANT (permisos de objeto de Transact-SQL) GRANT (permisos de tipo de Transact-SQL) GRANT (permisos de entidad de seguridad de base de datos de Transact-SQL)
Vista
CARRERAS PROFESIONALES
CIBERTEC
171
El siguiente ejemplo muestra cmo otorgar permiso de alterar cualquier base de datos al usuario ciber
El siguiente ejemplo muestra como otorgar permiso de ejecutar el comando SELECT y UPDATE hacia la tabla Ventas.Cliente, al usuario ciber
5.1.4.2 Comando DENY Deniega un permiso a una entidad de seguridad. Evita que la entidad de seguridad herede permisos por su pertenencia a grupos o roles. La sintaxis simplificada de este comando:
DENY { ALL [ PRIVILEGES ] } | permission [ ( column [ ,...n ] ) ] [ ,...n ] [ ON [ class :: ] securable ] TO principal [ ,...n ] [ CASCADE] [ AS principal ]
La sintaxis completa de la instruccin DENY es compleja. El diagrama anterior se ha simplificado para concentrar la atencin en su estructura.
DENY producir un error si CASCADE no se especifica al denegar un permiso a una entidad de seguridad a la que se concedi ese permiso con GRANT OPTION.
El siguiente ejemplo muestra cmo denegar permiso de crear un procedimiento almacenado al usuario ciber
CIBERTEC
CARRERAS PROFESIONALES
172
El siguiente ejemplo muestra como denegar permiso de ejecutar el comando UPDATE y DELETE hacia la tabla RRHH.Empleados, al usuario ciber
5.1.4.3 Comando REVOKE Quita un permiso concedido o denegado previamente. La sintaxis simplificada de este comando:
| permission [ ( column [ ,...n ] ) ] [ ,...n ] } [ ON [ class :: ] securable ] { TO | FROM } principal [ ,...n ] [ CASCADE] [ AS principal ]
La sintaxis completa de la instruccin REVOKE es compleja. El diagrama de sintaxis anterior se ha simplificado para concentrar la atencin en su estructura.
El siguiente ejemplo muestra como revocar permiso de crear una tabla al usuario ciber
El siguiente ejemplo muestra como revocar permiso de ejecutar el comando SELECT, UPDATE y DELETE hacia la tabla RRHH.Empleados, al usuario ciber
CARRERAS PROFESIONALES
CIBERTEC
173
El administrador de una base de datos puede otorgar, denegar o revocar permisos al usuario sobre los objetos de la base de datos asignada.
Para
realizar
este
proceso,
seleccione la base de datos, para nuestro case ser Negocios2011, tal como se muestra.
Seleccione la carpeta SEGURIDAD, desplegar la carpeta. Seleccione la carpeta USUARIOS, hacer click derecho sobre la carpeta y seleccione tal la opcin como se
PROPIEDADES,
muestra en la figura.
CIBERTEC
CARRERAS PROFESIONALES
174
En esta opcin, debemos seleccionar los objetos que vamos a asignar permisos. Seleccione todos los objetos para que liste los objetos de la base de datos. Presione el botn ACEPTAR.
Seleccione los tipos de objetos que vamos a manejar sus permisos. Para nuestro caso, seleccionamos el objeto TABLAS, tal como se muestra. Presione el botn ACEPTAR.
A continuacin, se lista todas las tablas de la base de datos. Al seleccionar una tabla, se listan los permisos de la tabla para cada uno de sus procesos. Incluso, podemos controlar permisos a cada columna de la tabla.
CARRERAS PROFESIONALES
CIBERTEC
175
En
esta
ventana,
podemos
dar
Si abrimos la ventana de propiedades del usuario, visualizamos los permisos efectuado a la tabla RRHH.Cargos que concede el permiso de UPDATE y denega el permiso de SELECT
CIBERTEC
CARRERAS PROFESIONALES
176
CARRERAS PROFESIONALES
CIBERTEC
177
Resumen
Las entidades de seguridad son entidades que pueden solicitar recursos de SQL Server. Igual que otros componentes del modelo de autorizacin de SQL Server, las entidades de seguridad se pueden organizar en jerarquas. El inicio de sesin sa de SQL Server es una entidad de seguridad del servidor. Se crea de forma predeterminada cuando se instala una instancia. En SQL Server 2005 y SQL Server 2008, la base de datos predeterminada de sa es master. Es un cambio de comportamiento con respecto a versiones anteriores de SQL Server. Por definicin, un cliente y un servidor de base de datos son entidades de seguridad y se pueden proteger. Estas entidades se pueden autenticar mutuamente antes de establecer una conexin de red segura. SQL Server admite el protocolo de autenticacin Kerberos, que define cmo interactan los clientes con un servicio de autenticacin de red. Para acceder a SQL SERVER, se dispone de dos modos de autenticacin:
Autenticacin de Windows y Autenticacin en modo mixto. En la autenticacin de Windows, el sistema operativo es el responsable de identificar al usuario. SQL Server usa despus esa identificacin del sistema operativo para determinar los permisos del usuario que hay que aplicar. Con la autenticacin en modo mixto, los dos Windows y SQL Server son responsables de identificar al usuario. Una cuenta de usuario de Windows puede ser necesaria para conectarse a una base de datos. Tambin, podra ser necesaria la autenticacin de SQL Server. Tanto si se va a usar autenticacin de Windows o autenticacin de modo mixto, la cuenta que se usa para la conexin a SQL SERVER se le conoce como inicio de sesin de SQL Server. Una consulta SELECT devuelve los resultados como un conjunto de filas. Opcionalmente, se pueden recuperar resultados formales de una consulta SQL como XML especificando la clusula FOR XML en la consulta. La clusula FOR XML puede usarse en consultas de nivel superior y en subconsultas. Para administrar con facilidad los permisos en el servidor, SQL Server proporciona varios roles, que son las entidades de seguridad que agrupan a otras entidades de seguridad. Los roles son como los grupos del sistema operativo Microsoft Windows
CIBERTEC
CARRERAS PROFESIONALES
178
Los roles de nivel de base de datos se aplican a toda la base de datos en lo que respecta a su mbito de permisos. Existen dos tipos de roles de nivel de base de datos en SQL Server: los roles fijos de base de datos, que estn predefinidos en la base de datos, y los roles flexibles de base de datos, que pueden crearse. Todos los elementos protegibles de SQL Server tienen permisos asociados que se pueden conceder a una entidad de seguridad. Los permisos se pueden manipular con las conocidas consultas GRANT, DENY y REVOKE de TRANSACT-SQL Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas:
http://msdn.microsoft.com/es-es/library/ms173463.aspx Aqu hallar los conceptos de crear usuarios http://mredison.wordpress.com/2009/03/15/como-creo-un-usuario-en-sql-server/ En esta pgina, hallar los conceptos de cmo crear un usuario http://msdn.microsoft.com/es-es/library/bb510418.aspx Aqu hallar los conceptos de manejo identidades y control de acceso
CARRERAS PROFESIONALES
CIBERTEC
179
UNIDAD DE APRENDIZAJE
TEMARIO 1.1. Introduccin a las estrategias de seguridad y restauracin en SQL Server 1.1.1. Impacto del modelo de recuperacin de copia de seguridad. 1.1.2. Diseo de la estrategia de copia de seguridad 1.2. Copia de Seguridad en SQL Server 1.2.1. Copia de seguridad completa 1.2.2. Copia de seguridad diferencial 1.2.3. Copia de seguridad de registro de transacciones 1.2.4. BACK UP (Transact-SQL) 1.2.5. Realizar copia de seguridad utilizando el Management Studio de SQL Server 1.3. Restaurando una copia de seguridad 1.3.1. RESTORE (Transact-SQL) 1.3.2. Restaurando una base de datos utilizando Management Studio ACTIVIDADES PROPUESTAS
Los alumnos crea copia de respaldo o seguridad a una base de datos y su registro de transacciones en forma completa o diferencial. Los alumnos restauran una base de datos desde una copia de respaldo o de seguridad de una base de datos o de registro de transacciones.
CIBERTEC
CARRERAS PROFESIONALES
180
CARRERAS PROFESIONALES
CIBERTEC
181
6.1
El propsito de crear copias de seguridad de SQL Server es para que usted pueda recuperar una base de datos daada. Sin embargo, copias de seguridad y
restauracin de los datos debe ser personalizado para un ambiente particular y debe trabajar con los recursos disponibles. Por lo tanto, un uso fiable de copia de seguridad y restauracin para la recuperacin exige una copia de seguridad y restauracin de la estrategia.
Una copia de seguridad bien diseado y restaurar la estrategia maximiza la disponibilidad de datos y minimiza la prdida de datos, teniendo en cuenta sus necesidades de negocio en particular.
Una estrategia de copia de seguridad y restauracin de copia de seguridad contiene una porcin de seguridad y una porcin de restauracin. La parte de seguridad de la estrategia define el tipo y frecuencia de las copias de seguridad, la naturaleza y la velocidad del hardware que se requiere para que, como copias de seguridad deben ser probados, y dnde y cmo los medios de comunicacin copia de seguridad se van a almacenar (incluyendo las consideraciones de seguridad).
La parte de restauracin de la estrategia define quin es responsable de las restauraciones y cmo restaurar se debe realizar para cumplir con sus objetivos de disponibilidad de la base de datos y para minimizar la prdida de datos. Le
recomendamos que documente la copia de seguridad y restaurar los procedimientos y guardar una copia de la documentacin en su libro de ejecutar.
CIBERTEC
CARRERAS PROFESIONALES
182
restauracin son compatibles con la base de datos. Normalmente, una base de datos utiliza ya sea el modelo de recuperacin simple o el modelo de recuperacin completa.
La mejor opcin de modelo de recuperacin de la base de datos depende de los requerimientos de su negocio. Para evitar la gestin del registro de transacciones y simplificar el BACKUP y restauracin, utilice el modelo de recuperacin simple. Para minimizar la prdida de trabajo, a costa de los gastos generales de administracin, utilice el modelo de recuperacin completa.
La estrategia de copia de seguridad ptima depende de una variedad de factores, de los cuales los siguientes son especialmente importantes:
Si hay una predecible temporada baja perodo, le recomendamos que programe copias de seguridad completas de bases de datos para ese perodo.
Bajo el modelo de recuperacin simple, considere la programacin de copias de seguridad diferenciales entre copias de seguridad de base de datos completa.
Bajo el modelo de recuperacin completa, debe programar copias de seguridad frecuentes de registro. Programacin de copias de seguridad diferenciales
entre copias de seguridad completas puede reducir el tiempo de restauracin mediante la reduccin del nmero de copias de seguridad de registros que se deben restaurar despus de restaurar los datos.
Son los cambios probables de ocurrir en tan slo una pequea parte de la base de datos o en una gran parte de la base de datos?
CARRERAS PROFESIONALES
CIBERTEC
183
Para una gran base de datos en la que los cambios se concentran en una parte de los archivos o grupos de archivos, copias de seguridad parciales o copias de seguridad de archivos y puede ser til.
Contiene todos los datos en una base de datos especfica o un conjunto de grupos de
archivos o archivos, y tambin suficiente registro para permitir la recuperacin de los datos.
Se basa en la ltima copia de seguridad completa de los datos. Esto se conoce como copia diferencial. Una copia diferencial es una copia de seguridad completa de lectura / escritura de datos. Una copia de seguridad diferencial incluye slo los datos que ha cambiado desde la base diferencial. Por lo general, los respaldos diferenciales que se toman poco despus de la copia de seguridad de base son ms pequeos y ms rpidos de crear que la base de una copia de seguridad completa. Por lo tanto, utilizar los respaldos diferenciales puede acelerar el proceso de hacer copias de seguridad frecuentes para disminuir el riesgo de prdida de datos. Por lo general, una base diferencial es utilizada por varias copias de seguridad diferenciales sucesivas. En el tiempo de restauracin, la copia de seguridad que se restaura el primero, seguido por la copia de seguridad diferencial ms reciente.
CIBERTEC
CARRERAS PROFESIONALES
184
Bajo el modelo de recuperacin optimizado para cargas masivas de registros de modelo de recuperacin, copias de seguridad del registro de transacciones (o copias de seguridad de registro) son obligatorias. Cada copia de seguridad de registro cubre la parte del registro de transacciones que estaba activa cuando la copia de seguridad fue creada, e incluye todos los registros que no fueron respaldados en una copia de seguridad de registros anterior. Una secuencia ininterrumpida de seguridad del registro contiene la cadena de registro completo de la base de datos, lo que se dice que es continua. Bajo el modelo de recuperacin completa, y, a veces bajo el registro masivo modelo de recuperacin, una cadena de registros ininterrumpida permite restaurar la base de datos a cualquier punto en el tiempo.
Antes de crear la copia de seguridad de registro en primer lugar, debe crear una copia de seguridad completa, como una copia de seguridad de bases de datos. A partir de entonces, la copia de seguridad del registro de transacciones con regularidad es necesaria, no slo para minimizar la prdida de trabajo sino tambin para permitir el truncamiento del registro de transacciones. . 6.1.3.4 BACKUP (TRANSACT-SQL)
Comando TRANSACT-SQL que realiza copias de seguridad de una base de datos completa, o uno o ms archivos o grupos de archivos (BASE DE DATOS DE SEGURIDAD). Adems, bajo el modelo de recuperacin optimizado para cargas
masivas de registros de modelo de recuperacin, copias de seguridad del registro de transacciones (BACKUP LOG).
BACKUP DATABASE { nombre_base_datos | @var_nombre_base_datos } TO <dispositivo_backup> [ ,...n ] [ <MIRROR TO clause> ] [ next-mirror-to ] [ WITH { DIFFERENTIAL | <general_WITH_options> [ ,...n ] } ] [;]
CARRERAS PROFESIONALES
CIBERTEC
185
BACKUP DATABASE { nombre_base_datos | @var_nombre_base_datos } <file_or_filegroup> [ ,...n ] TO <dispositivo_backup> [ ,...n ] [ <MIRROR TO clause> ] [ next-mirror-to ] [ WITH { DIFFERENTIAL | <general_WITH_options> [ ,...n ] } ] [;]
BACKUP LOG { nombre_base_datos | @var_nombre_base_datos } TO <dispositivo_backup> [ ,...n ] [ <MIRROR TO clause> ] [ next-mirror-to ] [ WITH { <general_WITH_options> | <log-specific_optionspec> } [ ,...n ] ] [;]
Argumentos
Argumento
DATABASE
completa de la base de datos. Si se especifica una lista de archivos y grupos de archivos, slo se realiza la copia de seguridad de esos archivos o grupos de archivos. Durante una copia de seguridad completa o diferencial de una base de datos, SQL Server realiza la copia de seguridad de una parte suficiente del registro de transacciones para producir una base de datos coherente cuando se restaure la base de datos.
LOG
CIBERTEC
CARRERAS PROFESIONALES
186
seguridad del registro desde la ltima copia de seguridad del registro ejecutada correctamente hasta el final actual del registro.
{ nombre_base_datos | @var_nombre_base_datos }
Es la base de datos para la que se realiza la copia de seguridad del registro de transacciones, de una parte de la base de datos o de la base de datos completa. Si se proporciona como una variable este
(@var_nombre_base_datos),
(@var_nombre_base_datos
Se utiliza slo con BACKUP DATABASE, especifica un grupo de archivos o un archivo de copia de seguridad que se va a incluir en una copia de seguridad de archivos, o especifica un grupo de archivos o un archivo de slo lectura que se va a incluir en una copia de seguridad parcial. En el modelo de recuperacin simple, se permite la copia de seguridad de un grupo de archivos slo si se trata de un grupo de archivos de slo lectura.
TO <dispositivo_backup> [ ,...n ]
Indica que el conjunto de dispositivos de copia de seguridad correspondiente es un conjunto de medios no reflejado o el primero de los reflejos de un conjunto de medios reflejado. < dispositivo_backup > Especifica el dispositivo de copia de seguridad fsico o lgico que se va a utilizar para la operacin de copia de
CARRERAS PROFESIONALES
CIBERTEC
187
seguridad. { device_logico | @var_device_logico } Es el nombre lgico del dispositivo de copia de seguridad en que se hace la copia de seguridad de la base de datos. El nombre lgico debe seguir las reglas definidas para los identificadores. { DISK | TAPE } = { 'device_fisico' | @var_device_fisico } Especifica un archivo de disco o un dispositivo de cinta.
[<MIRROR TO clause>] [ nextmirror-to ]
Especifica un conjunto de hasta tres dispositivos de copia de seguridad, cada uno de los de cuales copia reflejar de los
dispositivos
seguridad
especificados en la clusula TO. La clusula MIRROR TO debe incluir el mismo nmero y tipo de dispositivos de copia de seguridad que la clusula TO.
Opciones de WITH
Opcin
DIFFERENTIAL
Especifica que la copia de seguridad de la base de datos o el archivo slo debe estar compuesta por las partes de la base de datos o el archivo que hayan cambiado desde la ltima copia de seguridad completa. Una copia de seguridad diferencial suele ocupar menos espacio que una copia de seguridad completa.
{ NOINIT | INIT }
NOINIT Indica que el conjunto de copia de seguridad se anexa al conjunto de medios especificado, conservando as los conjuntos de copia de seguridad existentes, es el valor predeterminado.
CIBERTEC
CARRERAS PROFESIONALES
188
INIT Especifica que se deben sobrescribir todos los conjuntos de copia de seguridad, pero conserva el encabezado de los medios. Si se especifica INIT, se sobrescriben todos los conjuntos de copia de seguridad existentes en el dispositivo, si las condiciones lo permiten.
{ NOSKIP | SKIP }
NOSKIP Indica a la instruccin BACKUP que compruebe la fecha de expiracin de todos los conjuntos de copia de seguridad de los medios antes de permitir que se sobrescriban. ste es el
comportamiento predeterminado. SKIP Deshabilita la comprobacin de la expiracin y el nombre del conjunto de copia de seguridad que suele realizar la instruccin BACKUP para impedir que se sobrescriban los conjuntos de copia de seguridad. Para obtener ms informacin acerca de las interacciones entre {INIT | NOINIT} y {NOSKIP | SKIP},
{ NOFORMAT | FORMAT }
NOFORMAT Especifica que la operacin de copia de seguridad conservar los conjuntos de copias de seguridad y el encabezado del medio existentes en los volmenes del medio usados en esta operacin de copia de seguridad. ste es el comportamiento predeterminado. FORMAT Especifica que se debe crear un conjunto de medios nuevo. FORMAT hace que la operacin de copia de seguridad escriba un nuevo
encabezado en todos los volmenes del medio usados en la operacin de copia de seguridad.
{NO_CHECKSUM|CHECKSUM}
CARRERAS PROFESIONALES
CIBERTEC
189
sumas de comprobacin de copia de seguridad (y la validacin de sumas de comprobacin de pgina). Es el comportamiento predeterminado, salvo para una copia de seguridad comprimida. CHECKSUM Habilita las sumas de comprobacin de copia de seguridad.
NO_TRUNCATE
Especifica que el registro no se va a truncar y hace que Motor de base de datos intente hacer la copia de seguridad con independencia del estado de la base de datos. Por consiguiente, una copia de seguridad realizada con NO_TRUNCATE puede tener metadatos incompletos.
El siguiente ejemplo muestra cmo se consigue una copia de seguridad de la base de datos Negocios2011 en forma complete en el disco
Use Negocios2011 Go
El siguiente ejemplo muestra cmo se logra una copia de seguridad de la base de datos Negocios2011 en forma diferencial en el disco
Use Negocios2011 Go
CIBERTEC
CARRERAS PROFESIONALES
190
En el ejemplo siguiente, se crea una copia de seguridad de archivos completa de cada archivo en los dos grupos de archivos secundarios.
Use Negocios2011 Go
En el siguiente ejemplo, crea una copia de seguridad de archivos diferencial de todos los archivos secundarios.
Use Negocios2011 Go
BACKUP DATABASE Negocios2011 FILEGROUP = 'SalesGroup1', FILEGROUP = 'SalesGroup2' TO DISK = 'D:\SQLNegocios2011.Bak' WITH DIFFERENTIAL; Go
En el ejemplo siguiente, se realiza la copia de seguridad de la base de datos de ejemplo Negocios2011, que usa de forma predeterminada un modelo de recuperacin simple. Para admitir las copias de seguridad del registro, la base de datos Negocios2011 se ha modificado para usar el modelo de recuperacin completa.
A continuacin, en el ejemplo se usa sp_addumpdevice para crear un dispositivo de copia de seguridad lgico para realizar la copia de seguridad de datos, NegociosData, y se crea un dispositivo de copia de seguridad lgico para copiar el registro, NegociosLog.
CARRERAS PROFESIONALES
CIBERTEC
191
A continuacin, en el ejemplo se crea una copia de seguridad de base de datos completa en NegociosData y, tras un periodo de actividad de actualizacin, se copia el registro en NegociosLog.
/*Para permitir copias de seguridad de registro, antes de la copia de seguridad completa, modificar la base de datos utilice full recovery model*/
-- Copia de seguridad de la base de datos completa Negocios2011. BACKUP DATABASE Negocios2011 TO NegociosData; GO -- Copia de seguridad del registro de Negocios2011. BACKUP LOG Negocios2011 TO NegociosLog; GO
En el ejemplo siguiente, se da formato a los medios, que crean un nuevo conjunto de medios y se realiza una copia de seguridad completa comprimida de la base de datos Negocios2011.
CIBERTEC
CARRERAS PROFESIONALES
192
Use Negocios2011 Go
En el siguiente ejemplo, se crea un conjunto de medios reflejado que contiene una sola familia de medios y cuatro reflejos, y se realiza una copia de seguridad de la base de datos Negocios2011.
BACKUP DATABASE Negocios2011 TO TAPE = '\\.\tape0' MIRROR TO TAPE = '\\.\tape1' MIRROR TO TAPE = '\\.\tape2' MIRROR TO TAPE = '\\.\tape3' WITH Go FORMAT
6.1.3.5 Realizar una copia de seguridad utilizando el SQL SERVER Management Studio
1. Despus de conectarse a la instancia adecuada del motor de datos de Microsoft SQL Server, en el Explorador de objetos, haga clic en el nombre del servidor para expandir el rbol del servidor. 2. Expanda Bases de datos, seleccione una base de datos de usuario. 3. Haga clic derecho en la base de datos, seleccione Tareas y, a continuacin, haga clic en copia de seguridad. La copia de seguridad de base de datos aparece el cuadro de dilogo.
CARRERAS PROFESIONALES
CIBERTEC
193
4. En el cuadro de lista Base de datos, compruebe el nombre de base de datos. Si lo desea, puede seleccionar otra base de datos de la lista. 5. Usted puede realizar una copia de seguridad de base de datos para cualquier modelo de recuperacin (FULL, BULK_LOGGED, o simple). 6. En el cuadro de lista Tipo de copia de seguridad, seleccione Completa.
7. Especificar cuando el conjunto de copia de seguridad caduca y pueden ser anuladas sin saltar explcitamente la verificacin de los datos de caducidad.
CIBERTEC
CARRERAS PROFESIONALES
194
8. Para que el conjunto de copia de seguridad caduque despus de un nmero especfico de das, haga clic en Despus de (opcin predeterminada), e introduzca el nmero de das despus de la creacin del conjunto en que expirar. Este valor puede ser de 0 a 99999 das; un valor de 0 significa que el conjunto de copia de seguridad nunca se expira.
9. Seleccione el tipo de destino de copia de seguridad, haga clic en Disco o Cinta. Para seleccionar las rutas de hasta 64 unidades de disco o cinta que contengan un conjunto de medios, haga clic en Agregar. Las rutas seleccionadas se muestran en el cuadro de lista Copia de seguridad. Para eliminar un destino de copia de seguridad, seleccione y haga clic en Quitar. Para ver el contenido de un destino de copia de seguridad, seleccione y haga clic en Contenido.
CARRERAS PROFESIONALES
CIBERTEC
195
10. Seleccionar las opciones avanzadas, haga clic en Opciones en el panel Seleccionar una pgina. 11. Seleccione una opcin de Sobrescribir medios de comunicacin, haciendo clic en: Copia de seguridad en el conjunto de medios existente 12. En la seccin de fiabilidad, de manera opcional de verificacin:
Comprobar copia de seguridad cuando haya terminado. Realizar suma de comprobacin antes de escribir en los medios de comunicacin.
6.1.4
Un escenario de restauracin es un proceso que restaura los datos de una o ms copias de seguridad y se recupera la base de datos cuando la ltima copia de seguridad se restaura.
Restaura copias de seguridad realizadas con el comando BACKUP. Este comando le permite realizar los siguientes escenarios de restauracin:
CIBERTEC
CARRERAS PROFESIONALES
196
Restaurar una base de datos completa a partir de una copia de seguridad completa de la base de datos (restauracin completa).
Restaurar parte de una base de datos (restauracin parcial). Restaurar archivos o grupos de archivos en una base de datos. Restaurar pginas especficas en una base de datos (restauracin de pginas). Restaurar un registro de transacciones en una base de datos (restauracin del registro de transacciones).
Revertir una base de datos al punto temporal capturado por una instantnea de la base de datos.
La sintaxis para restaurar una base de datos desde una copia de seguridad completa
RESTORE DATABASE { nombre_base_datos | @var_nombre_base_datos } [ FROM <backup_device> [ ,...n ] ] [ WITH { [ RECOVERY | NORECOVERY | STANDBY = {standby_file_name | @standby_file_name_var } ]
RESTORE DATABASE { nombre_base_datos | @var_nombre_base_datos } <file_or_filegroup> [ ,...n ] [ FROM < dispositivo_backup > [ ,...n ] ] WITH { [ RECOVERY | NORECOVERY ] [ , <general_WITH_options> [ ,...n ] ] } [ ,...n ] [;]
CARRERAS PROFESIONALES
CIBERTEC
197
RESTORE LOG { nombre_base_datos | @var_nombre_base_datos } [ <file_or_filegroup_or_pages> [ ,...n ] ] [ FROM <ba dispositivo_backup ckup_device> [ ,...n ] ] [ WITH {
Argumentos
Argumento
DATABASE
Descripcin Especifica la base de datos de destino. Si se especifica una lista de archivos y grupos de archivos, slo se restauran esos archivos y grupos de archivos.
LOG
Especifica que slo se va a aplicar una copia de seguridad de registro de transacciones a esta base de datos. Los registros de transacciones deben aplicarse en orden secuencial. Para aplicar varios registros de transacciones, utilice la opcin
Es la base de datos para la que se realiza la restauracin del registro o de la base de datos completa. Si se proporciona como una variable (@var_nombre_base_datos), este
(@var_nombre_base_datos
Especifica un grupo de archivos o un archivo de que se van a incluir en una instruccin RESTORE DATABASE o RESTORE LOG. Puede especificar una lista de archivos o grupos de archivos.
CIBERTEC
CARRERAS PROFESIONALES
198
Especifica los dispositivos de copia de seguridad desde los que se restaurar la copia de seguridad. Alternativamente, en una instruccin RESTORE DATABASE, la
clusula FROM puede especificar el nombre de una instantnea de base de datos a la que va a revertir la base de datos, en cuyo caso no se admite ninguna clusula WITH. Si se omite la clusula FROM, no se produce la restauracin de la copia de seguridad. En su lugar, se recupera la base de datos. Esto permite recuperar una base de datos
restaurada con la opcin NORECOVERY o cambiar a un servidor en espera. . < dispositivo_backup > Especifica el dispositivo de copia de
seguridad fsico o lgico que se va a utilizar para la operacin de copia de seguridad. { device_logico | @var_device_logico } Es el nombre lgico del dispositivo de copia de seguridad en que se hace la copia de seguridad de la base de datos. El nombre lgico debe seguir las reglas definidas para los identificadores. { DISK | TAPE } = { 'device_fisico' | @var_device_fisico } Especifica un archivo de disco o un
dispositivo de cinta.
DATABASE_SNAPSHOT =database_snapshot_name
Revierte la base de datos a la instantnea de base de datos especificada La solo por opcin est
database_snapshot_name. DATABASE_SNAPSHOT
CARRERAS PROFESIONALES
CIBERTEC
199
ocupa el lugar de una copia de seguridad de base de datos completa. En una operacin de reversin, se requiere que la instantnea de base de datos especificada sea la nica en la base de datos. Durante la operacin de reversin, la instantnea de base de datos y la base de datos de destino se marcan como In restore. .
Opciones de WITH
Opcin PARTIAL
Descripcin Especifica una operacin de restauracin parcial que solo restaura el grupo de archivos principal y cualquiera de los grupos de archivos secundarios especificados. La opcin PARTIAL selecciona implcitamente el grupo de archivos principal; por tanto, no es necesario especificar FILEGROUP = 'PRIMARY'. Para restaurar un grupo de archivos secundarios, debe especificarlo de forma explcita mediante la opcin FILE o FILEGROUP. La opcin PARTIAL no se permite en las instrucciones RESTORE LOG.
[ RECOVERY | NORECOVERY RECOVERY | STANDBY ] Indica a la operacin de restauracin que revierta las transacciones no confirmadas. Despus del proceso de recuperacin, la base de datos est preparada para ser utilizada, la opcin
predeterminada es RECOVERY. NORECOVERY Indica a la operacin de restauracin que no revierta las transacciones no confirmadas. Si se utiliza la opcin NORECOVERY durante una operacin de restauracin sin conexin, la base de datos no puede utilizarse. STANDBY =standby_file_name
CIBERTEC
CARRERAS PROFESIONALES
200
Especifica un archivo en espera que permite deshacer los efectos de la recuperacin. La opcin STANDBY de se puede utilizar sin en
operaciones
restauracin
conexin
(incluida la restauracin parcial). {NO_CHECKSUM|CHECKSUM} NO_CHECKSUM Deshabilita de forma explcita la generacin de sumas de comprobacin de copia de seguridad (y la validacin de sumas de comprobacin de pgina). Es el comportamiento predeterminado, salvo para una copia de seguridad comprimida. CHECKSUM Habilita las sumas de comprobacin de copia de seguridad.
El siguiente ejemplo se restaura una copia de seguridad completa de la base de datos desde un dispositivo lgico de copia de seguridad de la base de datos Negocios2011Back
En el siguiente ejemplo, se restaura una copia de seguridad completa despus de una copia de seguridad diferencial del dispositivo de copia de seguridad
CARRERAS PROFESIONALES
CIBERTEC
201
En el ejemplo siguiente, se restaura una base de datos completa y el registro de transacciones, y se mueve la base de datos restaurada al directorio C:\Data.
RESTORE DATABASE Negocios2011 FROM Negocios2011Backups WITH NORECOVERY, MOVE 'Negocios2011_Data' TO 'C:\Data\Negocios2011.mdf', MOVE ' Negocios2011_Log' TO 'C:\Data\Negocios2011.ldf' RESTORE LOG Negocios2011 FROM Negocios2011Backups WITH RECOVERY
En el ejemplo siguiente, se restaura el registro de transacciones hasta la marca de la transaccin marcada denominada ActualizarPrecios.
USE NEGOCIOS2011; GO
CIBERTEC
CARRERAS PROFESIONALES
202
USE MASTER GO
STOPATMARK = 'ACTUALIZARPRECIOS';
6.1.4.2 Restaurando una base de datos utilizando SQL SERVER Management Studio
1. En el Explorador de objetos, expandir el rbol del servidor. 2. Expanda Bases de datos. Dependiendo de la base de datos, seleccione una base de datos de usuario. 3. Haga clic derecho en la base de datos, seleccione Tareas y, a continuacin, haga clic en Restaurar. 4. Haga clic en la base de datos, que se abre el cuadro de dilogo Restaurar base de datos.
CARRERAS PROFESIONALES
CIBERTEC
203
Para especificar el origen y la ubicacin de la copia de seguridad conjuntos para restaurar, haga clic en una de las siguientes opciones: Base de datos
Haga clic en el botn Examinar, que abrir el cuadro de dilogo Especificar copia de seguridad. En el cuadro de lista Copia de seguridad de los medios de
comunicacin, seleccione uno de los tipos de dispositivo. Para seleccionar uno o varios dispositivos del cuadro de lista Ubicacin de copia de seguridad, haga clic en Agregar.
Despus de agregar los dispositivos que desee al cuadro de lista Ubicacin de copia de seguridad, haga clic en Aceptar para regresar a la pgina General.
CIBERTEC
CARRERAS PROFESIONALES
204
En el panel Opciones de restauracin, puede elegir cualquiera de las siguientes opciones, si es apropiado para su situacin:
1. 2. 3. 4.
Sobrescribir la base de datos existente Conservar la configuracin de la replicacin Preguntar antes de restaurar cada copia de seguridad Restringir el acceso a la base de datos restaurada
CARRERAS PROFESIONALES
CIBERTEC
205
Resumen
El propsito de crear copias de seguridad de SQL Server es para que usted pueda recuperar una base de datos daada. Sin embargo, copias de seguridad y
restauracin de los datos deben ser personalizados para un ambiente particular y debe trabajar con los recursos disponibles. Por lo tanto, un uso fiable de copia de seguridad y restauracin para la recuperacin exige una copia de seguridad y restauracin de la estrategia. La mejor opcin de modelo de recuperacin de la base de datos depende de los requerimientos de su negocio. Para evitar la gestin del registro de transacciones y simplificar el BACKUP y restauracin, utilice el modelo de recuperacin simple. Para minimizar la prdida de trabajo, a costa de los gastos generales de administracin, utilice el modelo de recuperacin completa El alcance de una copia de seguridad de los datos puede ser una base de datos completa, una base de datos parciales, o un conjunto de archivos o grupos de archivos. Para cada uno de estos, SQL Server admite copias de seguridad
completas y diferenciales Bajo el modelo de recuperacin optimizado para cargas masivas de registros de modelo de recuperacin, copias de seguridad del registro de transacciones (o copias de seguridad de registro) son obligatorias. Cada copia de seguridad de registro cubre la parte del registro de transacciones que estaba activa cuando la copia de seguridad fue creada, e incluye todos los registros que no fueron respaldados en una copia de seguridad de registros anterior BACK UP TRANSACT-SQL realiza copias de seguridad de una base de datos completa, o uno o ms archivos o grupos de archivos (BASE DE DATOS DE SEGURIDAD). Adems, bajo el modelo de recuperacin optimizado para cargas masivas de registros de modelo de recuperacin, copias de seguridad del registro de transacciones (BACKUP LOG). Un escenario de restauracin es un proceso que restaura los datos de una o ms copias de seguridad y se recupera la base de datos cuando la ltima copia de seguridad se restaura
CIBERTEC
CARRERAS PROFESIONALES
206
Si desea saber ms acerca de estos temas, puede consultar las siguientes pginas.
Error! Referencia de hipervnculo no vlida. http://technet.microsoft.com/eses/library/ms186858.aspx Aqu hallar los conceptos RESTORE TRANSACT SQL Error! Referencia de hipervnculo no vlida.http://technet.microsoft.com/eses/library/ms186865.aspx En esta pgina, hallar los conceptos de BACK UP TRANSACT SQL http://translate.googleusercontent.com/translate_c?hl=es&prev=/search%3Fq%3DPl anning%2Ba%2Bbackup%2Bstrategy%2Bin%2Bsql%2Bserver%26hl%3Des%26biw %3D1280%26bih%3D619%26prmd%3Divns&rurl=translate.google.com.pe&sl=en& u=http://msdn.microsoft.com/enus/library/ms187048.aspx&usg=ALkJrhgYgMJDrnvutDfU9eIJ2B0a0Ps1mw Aqu hallar los conceptos de copia de seguridad y recuperacin.
CARRERAS PROFESIONALES
CIBERTEC