con T-SQL Transacciones • Las transacciones agrupan un conjunto de una o más sentencias en una sola unidad. Si cualquiera de las tareas falla, toda la transacción falla, lo cual evita que se dañe la base de datos. • Las transacciones se puede considerar como si compilara un conjunto de líneas de programación. • Una transacción comienza con la ejecución de una sentencia SQL(UPDATE/INSERT/DELETE). • Todas las sentencias subsecuentes hasta una sentencia COMMIT o ROLLBACK se hacen parte de la transacción. La ejecución de una sentencia COMMIT o ROLLBACK completan la transacción actual. • COMMIT: si todas las sentencias son correctas en una sola transacción , todos los cambios se registran en la base de datos. • ROLLBACK: el proceso de revertir cambios. Transacciones • La transacción mas simple en Microsoft SQL Server es una sentencia de modificación de datos sencilla: • UPDATE autores SET au_nombre=‘Juan‘ WHERE au_id='172- 32-1176’ • Es una transacción automática. • El servidor SQL primero registra lo que va a hacer y luego realiza la sentencia UPDATE actual. • Finalmente, registra que se ha completado la sentencia UPDATE. • Si el servidor falla después de que la transacción se haya registrado en la bitácora(log),SQL server utiliza el registro de la transacción para reiniciarla al recuperarse. Transacciones Para ser de utilidad, las transacciones necesitan tener dos o más sentencias en ellas. A este tipo de transacciones se les llama explícitas: BEGIN TRAN UPDATE autores SET nombre=‘Juan' WHERE id='172-32-1176' UPDATE autores SET nombre=‘Luis' WHERE id='213-46-8915' COMMIT TRAN Nota: las sentencias BEGIN TRAN y COMMIT TRAN comienzan y completan una transacción. Todo lo que se encuentre dentro de estas transacciones se consideran como una unidad lógica de trabajo. Si cualquiera sentencia en la transacción falla, no cambiará nada en la base de datos. Transacciones Una transacción se puede cancelar si no hace lo que se esperaba: BEGIN TRAN UPDATE autores SET nombre = ‘Juan' WHERE au_id= '172-32-1176' UPDATE autores SET nombre = 'Juana' WHERE ciudad= ‘Monterrey' IF @@ROWCOUNT = 10 COMMIT TRAN ELSE ROLLBACK TRAN Nota: Si @@ROWCOUNT (una función SQL) es igual a 10, entonces la transacción se lleva a cabo, de lo contrario se cancela. La sentencia ROLLBACK TRAN “deshace” todo el trabajo desde la sentencia BEGIN TRAN. Ninguno de las sentencias UPDATE se llevan a cabo. Vistas • Las vistas son consultas almacenadas (tablas lógicas). Aunque también se pueden definir física • Una vista es una tabla virtual que muestra los datos de una o varias tablas seleccionadas. Vistas Ventajas de las vistas •Una vista se puede concebir como una consulta almacenada. • Los datos accesibles a través de la vista no se almacenan en la base de datos como un objeto definido. Vistas Ventajas de las vistas •Lo que se almacena en la base de datos es una sentencia SELECT. El resultado del conjunto de sentencias SELECT forman la tabla virtual. • La tabla virtual se accede al referenciar el nombre de la vista en sentencias T-SQL como se indica a continuación: SELECT * from <Nombre de la vista> Where <condición = x> Vistas ¿cómo se puede utilizar una vista? Una vista se puede utilizar para restringir información en lugar de proporcionar detalles. Por ejemplo, puede mostrar a suma de una columna o el valor máximo o mínimo de una columna. Vistas Aunque una vista es un nombre almacenado para una declaración SELECT, el SELECT definido para la vista puede hacer referencia a otras tablas, vistas y funciones. La declaración SELECT no puede:
•Contener las cláusulas COMPUTE o COMPUTE BY
•Usar la palabra clave INTO •Usar una cláusula OPTION •Hacer referencia a una tabla temporal o variable o cualquier otro tipo. •Contener una cláusula ORDER BY a menos que se especifique un operador TOP La vista puede contener varias declaraciones SELECT, siempre y cuando usted utilice los operadores UNION o UNION ALL. Vistas Sintaxis para crear una vista
CREATE VIEW[ < nombreBD> . ] [ < propietario> .
] nombre[ ( campo[ ,...n ] ) ] [ WITH<view_attribute> [ ,...n ] ] AS Instrucción_Select[ WITH CHECK OPTION ] Vistas • nombreBD: es el nombre de la base de datos en la que se crea. • propietario: cuenta de usuario que crea la vista • nombre: es el nombre de la vista que se va a crear. • campo: es el nombre que se va a utilizar para una columna en una vista. • instrucción_Select: consulta a través de la cuál se define la vista Vistas • view_attribute: toma uno de los siguientes valores • [ ENCRYPTION ]: evita que la vista se publique como parte de la réplica de SQL Server • [ SCHEMABINDING ]: enlaza la vista al esquema de las tablas subyacentes. Cuando se especifica, las tablas base no se pueden modificar de una forma que afecte a la definición de la vista. • [ VIEW_METADATA ]: Especifica que la instancia de SQL Server devolverá a las API de DB-Library, ODBC y OLE DB la información de metadatos sobre la vista en vez de las tablas base. • [ WITH CHECK OPTION ] : Exige que todas las instrucciones de modificación de datos ejecutadas contra la vista adhieran a los criterios establecidos en la instrucción Select. Vistas Ejemplo de vista CREATE VIEW graduados AS SELECT id_alumno, nombre_alumno FROM alumnos_inscritos
El código anterior crea una tabla virtual llamada
graduados que contiene los datos de identificación del alumno y su nombre. Los datos se obtienen de la tabla alumnos_inscritos. Procedimientos y funciones almacenados Los procedimientos son una colección de instrucciones de Transact-SQL (o una referencia a un método de Common Language Runtime (CLR) de Microsoft .NET Framework) que pueden aceptar y devolver parámetros proporcionados por el usuario. Un función almacenada es una rutina con instrucciones T-SQL (o de Common Language Runtime) que devuelve un valor o una tabla. Procedimientos y funciones almacenados Diferencias: •Las funciones no se pueden utilizar para realizar acciones que modifican el estado de la base de datos. Los procedimientos sí. •Las funciones se pueden combinar con instrucciones SELECT. Los procedimientos no. Procedimientos y funciones almacenados Ventajas de usar procedimientos y funciones versus scripts SQL son: •Mejor rendimiento al estar compilados y almacenados en la base de datos. •Mejor gestión de la memoria. •Mayor productividad e integridad. •Facilidad para gestionar la seguridad. Procedimientos almacenados Sintaxis CREATE PROC [ EDURE ] nombre [ { @parametros tipo_dato } [ = valor_por_defecto ] [ OUTPUT ] ] [ ,...n ] [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ] [ FOR REPLICATION ] AS instrucciones_sql [ ...n ] Procedimientos almacenados • nombre: es el nombre del procedimiento que se va a crear. • parámetros: parámetros de entrada y salida del procedimiento • tipo_dato: tipo de dato asociado al parámetro. • valor_por_defecto: valor asignado por defecto al parámetro • instrucciones_sql: instrucciones SQL Procedimientos almacenados Ejemplo CREATE PROCEDURE dameProveedores AS SELECT rut_prov, nombre, direccion,ciudad, fono FROM Proveedor; Go exec dameProveedores; Procedimientos almacenados CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) AS BEGIN TRANSACTION update articulos set preunart = preunart + (preunart*@ipc/100) where preunart is not null if @@ERROR <> 0 Variable de SQL Server donde recoge el nº de error. Valor 0 begin indica no se ha producido error ROLLBACK TRANSACTION RAISERROR ( 'No se han modificado los precios’,16,1) RETURN end COMMIT TRANSACTION Go Procedimientos almacenados La mayoría de las transacciones de usuarios ocurren en procedimientos almacenados. Create Procedure TranTest2 AS BEGIN TRAN INSERT INTO autores(id,anombre, nombre, tel,contrato) VALUES ('123- 321176', Perez', Juan', ‘45234333', 1) IF @@ERROR <> 0 BEGIN ROLLBACK TRAN return 10 END UPDATE autores SET nombre = 'John' WHERE id = '172-32-1177’ IF @@ERROR <> 0 BEGIN ROLLBACK TRAN return 11 END COMMIT TRAN GO Procedimientos almacenados Gestión de errores Siempre es deseable que las instrucciones del procedure esten dentro de un bloque TRY CATCH y controlados por una transacción. Procedimientos almacenados BEGIN TRY BEGIN TRANSACTION update articulos set preunart = preunart + (preunart*@ipc/100) where preunart is not null COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION RAISERROR ( 'No se han modificado los precios’,16,1) END CATCH exec upd_precio_articulo 3.2