Este documento presenta información sobre procedimientos almacenados y disparadores (triggers) en SQL. Explica que los procedimientos almacenados son conjuntos de instrucciones SQL guardadas en la base de datos que pueden ser llamadas por aplicaciones, y que los triggers se ejecutan automáticamente cuando ocurren eventos de manipulación de datos como inserciones, actualizaciones o eliminaciones. También cubre la sintaxis para crear, ejecutar y modificar procedimientos almacenados y triggers, así como sus ventajas y desventajas.
Edificio residencial Becrux en Madrid. Fachada de GRC
SQL Procedural y Triggers
1. 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
2. Competencia: Aplicar mecanismos de SQL procedural como mecanismo
de actualización y auditoria de una base de datos.
TALLER DE BASE DE DATOS
3. 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
4. • 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
5. • 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
6. 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
7. 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
8. • 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
9. 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
10. 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
11. 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
12. Sintaxis
CREATE { PROC | PROCEDURE } [schema_name.] procedure_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ OUT | OUTPUT ] [READONLY] ] [ ,...n ]
[ WITH <procedure_option> [ ,...n ] ]
[ FOR REPLICATION ]
AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] } [;]
<procedure_option> ::= [ ENCRYPTION ] [ RECOMPILE ]
[ EXECUTE AS Clause ]
TALLER DE BASE DE DATOS
13. • 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
14. 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
15. 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
16. 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
17. • 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:
Sintaxis
EXECUTE | EXEC procedure_name [parameter1, parameter2, n…]
WITH RESULT SETS (
( [column_definition1, column_definition2, n…])
)
Ejemplo
USE AdventureWorks2012
EXEC dbo.PurchaseOrderInformation
TALLER DE BASE DE DATOS
18. 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
19. 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;
GO
CREATE PROC dbo.SampleOutput @Parameter2 int OUTPUT
As SELECT @Parameter2 = 10
DECLARE @HoldParameter2 INT
EXEC dbo.SampleOutput @HoldParameter2 OUTPUT
SELECT @HoldParameter2
TALLER DE BASE DE DATOS
20. Ejemplo:
USE AdventureWorks2012;
GO
ALTER PROCEDURE [dbo].[PurchaseOrderInformation]
@EmployeeID int, @OrderYear int = 2005
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
WHERE poh.EmployeeID = @EmployeeID AND
YEAR(poh.OrderDate) = @OrderYear
END
TALLER DE BASE DE DATOS
21. • Ejecución:
Con un solo parámetro:
USE AdventureWorks2012;
EXEC [dbo].[PurchaseOrderInformation] @EmployeeID = 258;
Con los dos parámetros
USE AdventureWorks2012;
EXEC [dbo].[PurchaseOrderInformation] @EmployeeID = 258, @OrderYear = 2006;
TALLER DE BASE DE DATOS
22. 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:
After
Instead Of
TALLER DE BASE DE DATOS
23. • 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
24. 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
25. 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
26. Creación de el trigger:
USE AdventureWorks2012;
GO
CREATE TRIGGER HumanResources.iCheckModifedDate
ON HumanResources.Department FOR INSERT
AS BEGIN
DECLARE @modifieddate datetime, @DepartmentID int
SELECT @modifieddate = modifieddate, @DepartmentID = departmentid
FROM inserted;
IF (DATEDIFF(Day, @modifiedDate, getdate()) > 0)
BEGIN
UPDATE HumanResources.Department
SET ModifiedDate = GETDATE() WHERE DepartmentID = @DepartmentID
END
END
TALLER DE BASE DE DATOS
27. 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
28. 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
29. • 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
30. • 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
31. 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