31
Ingeniería en Sistemas Computacionales Taller de Base de Datos Unidad VI: TSQL Procedural Este material está desarrollado para la asignatura Taller de Base de Datos, de la carrera de Ingeniería en Sistemas Computacionales, plan de estudios ISIC-2010-224 TALLER DE BASE DE DATOS

Taller de Base de Datos - Unidad 6 SQL procedural

Embed Size (px)

Citation preview

Page 1: Taller de Base de Datos - Unidad 6 SQL procedural

Ingeniería en Sistemas Computacionales

Taller de Base de DatosUnidad VI: TSQL Procedural

Este material está desarrollado para la asignatura Taller de Base de Datos, de la carrera de Ingeniería en Sistemas Computacionales, plan de estudios ISIC-2010-224

TALLER DE BASE DE DATOS

Page 2: Taller de Base de Datos - Unidad 6 SQL procedural

Competencia: Aplicar mecanismos de SQL procedural como mecanismo de actualización y auditoria de una base de datos.

TALLER DE BASE DE DATOS

Page 3: Taller de Base de Datos - Unidad 6 SQL procedural

SQL Procedural

¿Qué es SQL Procedural? Son un conjunto de sentencias de T-SQL los cuales son guardados en un archivo fuente y almacenados en el SQL Server, para ser convocados posteriormente por medio de Queries o desde una aplicación que se conecta al SQL Server.

Existen dos tipos básicos:

• Procedimientos Almacenados (Stored Procedures)• Disparadores (Triggers)

TALLER DE BASE DE DATOS

Page 4: Taller de Base de Datos - Unidad 6 SQL procedural

• Procedimientos Almacenados (SP): Los SP por sus siglas en inglés son un conjunto de procedimientos almacenados físicamente en una base de datos (de ahí su nombre). Estos pueden ser llamados por una aplicación externa, un trigger, e incluso desde otro SP.

• La implementación de un SP varía de un SGBD a otro. La mayoría lo soportan de alguna forma. Dependiendo del SGBD, los SP pueden ser implementados por varios lenguajes de programación, tales como SQL, Java, C y C++.

TALLER DE BASE DE DATOS

Page 5: Taller de Base de Datos - Unidad 6 SQL procedural

• La creciente adopción de los SP llevó a la introducción de elementos procedurales en el propio estándar SQL. La mayoría de los sistemas de bases de datos ofrecen extensiones propietarias, extendiendo así las funcionalidades de SQL.

TALLER DE BASE DE DATOS

Page 6: Taller de Base de Datos - Unidad 6 SQL procedural

Usos

• En algunos sistemas se usan para controlar el manejo de las transacciones.

• También pueden ser usados para el control de gestión de operaciones, y ejecutar procedimientos almacenados dentro de una transacción de tal manera que las transacciones sean efectivamente transparentes para ellos.

TALLER DE BASE DE DATOS

Page 7: Taller de Base de Datos - Unidad 6 SQL procedural

Ventajas

• El servidor de la base de datos tiene acceso directo a los datos necesarios para manipular y sólo necesita enviar el resultado final al usuario.• Los procedimientos almacenados pueden permitir que la lógica del negocio se

encuentre como un API en la base de datos. • Reducen la probabilidad de que los datos sean corrompidos por el uso de

programas clientes defectuosos o erróneos. • Aumentan el rendimiento: Una vez creados, son compilados y almacenados

en el catálogo de la base de datos. Corren más rápido que comandos SQL enviados desde aplicaciones externas, ya que estos no están compilados.

TALLER DE BASE DE DATOS

Page 8: Taller de Base de Datos - Unidad 6 SQL procedural

• Reducen el tráfico entre las aplicaciones y el servidor de bases de datos.• Son reusables y transparentes a cualquier aplicación que lo quiera usar.• Son seguros: Los DBA pueden dar permiso a cierta aplicación para que pueda

acceder a y SP en el catálogo de la base de datos,

TALLER DE BASE DE DATOS

Page 9: Taller de Base de Datos - Unidad 6 SQL procedural

Desventajas• No son modificables: Los Stored procedures son “definidos una vez, usados

muchas”. Si se necesita modificarlo, su definición tiene que ser reemplazada totalmente.• Cualquier cambio instantáneamente afecta todas las otras piezas de software,

reportes, etc. (dentro o fuera del DBMS) que directa o indirectamente se refieran a este.• Por varias razones, muchas organizaciones limitan estrictamente quiénes

pueden hacer consultas a la base de datos.• Sólo contienen SQL declarativo, así que es muy dificultoso escribir

procedimientos complejos para negocios como en otros lenguajes

TALLER DE BASE DE DATOS

Page 10: Taller de Base de Datos - Unidad 6 SQL procedural

Tipos de SP

• SP definidos por el usuario: son procedimientos definidos por el usuario que se deben llamar explícitamente

• Triggers: son procedimientos definidos por el usuario que se ejecutan automáticamente cuando se modifica un dato en una tabla

• SP del sistema: procedimientos suministrados por el sistema (SQL Server)

• SP extendidos: procedimientos que hacen llamadas al sistema operativo y ejecutan tareas a ese nivel

TALLER DE BASE DE DATOS

Page 11: Taller de Base de Datos - Unidad 6 SQL procedural

Un procedimiento almacenado puede: • Seleccionar y modificar datos • Crear tablas temporales y permanentes • Llamar otros procedimientos almacenados • Referenciar objetos de bases de datos

Un procedimiento almacenado no puede ejecutar: • use database • create view • create default • create rule • create procedure • create trigger

TALLER DE BASE DE DATOS

Page 12: Taller de Base de Datos - Unidad 6 SQL procedural

SintaxisCREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]

[ { @parameter [ type_schema_name. ] data_type } [ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY] ] [ ,...n ] [ WITH <procedure_option> [ ,...n ] ] [ FOR REPLICATION ] AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } [;] <procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ] [ EXECUTE AS Clause ]

TALLER DE BASE DE DATOS

Page 13: Taller de Base de Datos - Unidad 6 SQL procedural

• La forma de crear un procedimiento en SQL Server, es por medio de la pantalla correspondiente en la base de datos deseada.

TALLER DE BASE DE DATOS

Page 14: Taller de Base de Datos - Unidad 6 SQL procedural

Al oprimir la opción New Procedure se abre el una nueva ventana de Query Analyzer en donde ya por default tenemos un templete de procedimiento el cual podemos modificar según la necesidad que tengamos de desarrollo.

TALLER DE BASE DE DATOS

Page 15: Taller de Base de Datos - Unidad 6 SQL procedural

Ejemplo:• Expandir la base de datos AdventureWorks2012• Expandir la opcion Programability • Con el click derecho seleccionar Procedures y la opción New

Procedure

Aparecerá la pantalla del Query Analyzer• Copiar el siguiente código:

TALLER DE BASE DE DATOS

Page 16: Taller de Base de Datos - Unidad 6 SQL procedural

CREATE PROCEDURE dbo.PurchaseOrderInformation AS BEGIN SELECT poh.PurchaseOrderID, pod.PurchaseOrderDetailID, poh.OrderDate, poh.TotalDue, pod.ReceivedQty, p.Name ProductName FROM Purchasing.PurchaseOrderHeader poh INNER JOIN Purchasing.PurchaseOrderDetail pod ON poh.PurchaseOrderID = pod.PurchaseOrderID INNER JOIN Production.Product p ON pod.ProductID = p.ProductID END GO

TALLER DE BASE DE DATOS

Page 17: Taller de Base de Datos - Unidad 6 SQL procedural

• Al ejecutar el query se creará el procedimiento en la base de datos seleccionada y las demás DB no podrán verlo• La instrucción para ejecutar posteriormente el procedimiento es excec:

SintaxisEXECUTE | EXEC procedure_name [parameter1, parameter2, n…] WITH RESULT SETS ( ( [column_definition1, column_definition2, n…]) )

EjemploUSE AdventureWorks2012 EXEC dbo.PurchaseOrderInformation

TALLER DE BASE DE DATOS

Page 18: Taller de Base de Datos - Unidad 6 SQL procedural

Ejemplo: en este caso ejecutaremos de nuevo el procedimiento ya creado pero usando la instrucción With Result Sets, la cual debe tener el mismo orden que las variables que toma el Select del procedimiento o de lo contrario SQL Server enviará un error de ejecución:

USE AdventureWorks2012;EXEC dbo.PurchaseOrderInformation WITH RESULT SETS ( ( [Purchase Order ID] int, [Purchase Order Detail ID] int, [Order Date] datetime, [Total Due] Money, [Received Quantity] float, [Product Name] varchar(50) ) )

TALLER DE BASE DE DATOS

Page 19: Taller de Base de Datos - Unidad 6 SQL procedural

Uso de parámetros en los procedimientos• AL ser los procedimientos subrutinas de código programadas, es posible

pasarles parámetros en la misma forma que lo hacemos en un lenguaje de programación de alto nivel. Para esto debemos especificarlos en la cláusula Create Proc al final de la misma, como lo muestra el siguiente ejemplo:

USE AdventureWorks2012;GOCREATE PROC dbo.SampleOutput @Parameter2 int OUTPUTAs SELECT @Parameter2 = 10DECLARE @HoldParameter2 INTEXEC dbo.SampleOutput @HoldParameter2 OUTPUTSELECT @HoldParameter2

TALLER DE BASE DE DATOS

Page 20: Taller de Base de Datos - Unidad 6 SQL procedural

Ejemplo:

USE AdventureWorks2012;GOALTER PROCEDURE [dbo].[PurchaseOrderInformation] @EmployeeID int, @OrderYear int = 2005AS BEGIN SELECT poh.PurchaseOrderID, pod.PurchaseOrderDetailID, poh.OrderDate, poh.TotalDue, pod.ReceivedQty, p.Name ProductName FROM Purchasing.PurchaseOrderHeader poh INNER JOIN Purchasing.PurchaseOrderDetail pod ON poh.PurchaseOrderID = pod.PurchaseOrderID INNER JOIN Production.Product p ON pod.ProductID = p.ProductID WHERE poh.EmployeeID = @EmployeeID AND YEAR(poh.OrderDate) = @OrderYearEND

TALLER DE BASE DE DATOS

Page 21: Taller de Base de Datos - Unidad 6 SQL procedural

• Ejecución:

Con un solo parámetro:USE AdventureWorks2012;EXEC [dbo].[PurchaseOrderInformation] @EmployeeID = 258;

Con los dos parámetrosUSE AdventureWorks2012;EXEC [dbo].[PurchaseOrderInformation] @EmployeeID = 258, @OrderYear = 2006;

TALLER DE BASE DE DATOS

Page 22: Taller de Base de Datos - Unidad 6 SQL procedural

Triggers (Disparadores)• Un trigger es un conjunto de instrucciones de T-SQL los cuales realizan tareas

específicas, las cuales se ejecutan únicamente cuando un evento de manipulación de datos ocurre (por medio de DML), estos eventos son Delete, Insert, y Update, los cuales pueden ser sobre tablas o sobre vistas.

Tipos de triggers:• Existen varios tipos de triggers en SQL Server, en esta unidad nos enfocaremos

en dos de ellos, que son:AfterInstead Of

TALLER DE BASE DE DATOS

Page 23: Taller de Base de Datos - Unidad 6 SQL procedural

• After: este tipo de trigger es ejecutado después que una instrucción de DML fue llamada. Es muy importante tener en cuenta que el trigger formará parte de la misma transacción en la que fue disparado, por lo que dicha transacción no se considera completa hasta que el trigger completa toda su ejecución.

• Instead Of: un trigger que es marcado como Instead Of es ejecutado en el momento que el evento que lo dispara ocurre, sin embargo el evento en si no será ejecutado, es decir, si lo llama un Insert, el trigger será ejecutado en su lugar, y el insert en realidad no ocurrirá.

TALLER DE BASE DE DATOS

Page 24: Taller de Base de Datos - Unidad 6 SQL procedural

Sintaxis

CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH <dml_trigger_option> [ ,...n ] ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } [ NOT FOR REPLICATION ] AS { sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }<dml_trigger_option> ::= [ ENCRYPTION ] [ EXECUTE AS Clause ] <method_specifier> ::= assembly_name.class_name.method_name

TALLER DE BASE DE DATOS

Page 25: Taller de Base de Datos - Unidad 6 SQL procedural

Procedimiento para crear un trigger

• Abrir • SQL Server Management Studio (SSMS) • Expandir la base de datos• Expandir la carpeta Tables• Seleccionar y expandir la tabla

correspondiente• Expandir la carpeta Triggers• Click con el derecho sobre Triggers• Seleccionar New Trigger

TALLER DE BASE DE DATOS

Page 26: Taller de Base de Datos - Unidad 6 SQL procedural

Creación de el trigger:USE AdventureWorks2012;GOCREATE TRIGGER HumanResources.iCheckModifedDate

ON HumanResources.Department FOR INSERTAS BEGINDECLARE @modifieddate datetime, @DepartmentID intSELECT @modifieddate = modifieddate, @DepartmentID = departmentid FROM inserted;IF (DATEDIFF(Day, @modifiedDate, getdate()) > 0)BEGIN UPDATE HumanResources.Department SET ModifiedDate = GETDATE() WHERE DepartmentID = @DepartmentIDEND

END

TALLER DE BASE DE DATOS

Page 27: Taller de Base de Datos - Unidad 6 SQL procedural

Disparar su ejecución:

USE AdventureWorks2012;INSERT INTO HumanResources.Department

VALUES ('Executive Marketing', 'Executive General and Administration', '2/12/2011');

SELECT * FROM HumanResources.Department

TALLER DE BASE DE DATOS

Page 28: Taller de Base de Datos - Unidad 6 SQL procedural

Modificación de un trigger

• Expandir la base de datos• Expandir la tabla correspondiente• Expandir la carpeta triggers• Seleccionar el trigger con click derecho y

luego la opción Modify• Aparecerá el trigger en una ventana pero

con la sentencia Alter en lugar de Create• Realizar los cambios necesarios y ejecutar

TALLER DE BASE DE DATOS

Page 29: Taller de Base de Datos - Unidad 6 SQL procedural

• Basándonos en la lámina anterior en el trigger buscar el código:SET ModifiedDate = GETDATE()

• Y sustituirlo por:SET ModifiedDate = DATEADD(day, -1, GETDATE() )

• Ejecutamos el query para completar la modificación del trigger• En una nueva ventana de query analycer ejecutar el siguiente código:

USE AdventureWorks2012;INSERT INTO HumanResources.Department VALUES ('Executive Purchasing', 'Executive General and Administration', '2/12/2011')SELECT *FROM HumanResources.Department

TALLER DE BASE DE DATOS

Page 30: Taller de Base de Datos - Unidad 6 SQL procedural

• Desactivar y reactivar triggers: en algunos casos es necesario que un trigger deje de ser disparado pero no deseamos eliminarlo por lo que SQL Server proporciona el medio para desactivar un trigger en particular y luego reactivarlo cuando sea necesario:

• Desactivar: USE AdventureWorks2012; DISABLE TRIGGER HumanResources.iCheckModifedDate ON HumanResources.Department;

• Reactivar:USE AdventureWorks2012; ENABLE TRIGGER HumanResources.iCheckModifedDate ON HumanResources.Department;

TALLER DE BASE DE DATOS

Page 31: Taller de Base de Datos - Unidad 6 SQL procedural

Bibliografía Consultada

Adam Jorgersen, Microsoft SQL Server 2012 Bible. John Wiley & Sons, Inc. Indianapolis, Indiana. 2012.

https://msdn.microsoft.com. Página en Español, Sección de Ayuda de SQL Server 2012. Consultado en Junio de 2015.

TALLER DE BASE DE DATOS