Post on 25-May-2015
Base de Datos
Profesor:
MSC Luis Serna Jherry
Funciones, Procedimientos Almacenados, Disparadores Triggers
Profesor:
MS. Luis Serna Jherry
Contenido Que es una Function (Función). Que es un Stored Procedure
(Procedimiento Almacenado). Que es un Trigger (Disparador ). Implementar Functions. Implementar Stored Procedures. Implementar Triggers.
Que es una Función.
Es una porción encapsulada de código que puede ser reutilizada por diferentes programas.
Que es un Stored Procedure.
Un Store Procedure es un elemento de base de datos reutilizable almacenado que realiza alguna operación en la base de datos.
Contiene código SQL que puede, entre otras cosas, insertar, actualizar o eliminar registros.
Los procedimientos almacenados pueden alterar la estructura de la base de datos. Por ejemplo, se puede utilizar un procedimiento almacenado para añadir una columna de tabla o borrar una tabla.
Un Store Procedure también puede llamar a otro Store Procedure, así como aceptar entradas y devolver múltiples valores al procedimiento llamado en forma de parámetros de salida.
Que es un Trigger Un trigger o un disparador en una
Base de datos es un evento que se ejecuta automáticamente cuando se cumple una condición establecida al realizar una operación de inserción (INSERT), actualización (UPDATE) o borrado (DELETE).
Implementando una Función SQL Server contiene funciones ya
construidas que pueden ser utilizadas dentro de las aplicaciones para proveer funcionalidad común (como las funciones de fecha y hora).
Un ejemplo de una función es GETDATE(), la cual retorna la fecha y hora actual del sistema.
Tipos de funciones
Scalar Functions: Retorna un resultado con un valor escalar.
Table-Value Functions: Retorna el resultado en forma de tabla.
Scalar Functions Pueden aceptar 0 o mas parámetros de
entrada. Retorna solo un valor escalar. Generalmente se usan como campos de
columnas y en las condiciones de la cláusula Where.
No se puede utilizar una función para cambiar el estado de un objeto de la base de datos (no puede insertar, modificar, eliminar datos de una tabla. No puede borrar tablas u otros objetos de la base de datos).
El Nombre debe ser único
Puede o no tener parámetrosTipo de parámetro
Sintaxis de una Funcion Escalar
Tipo de dato de retorno
Opciones
Cuerpo
CREATE FUNCTION [ propietario. ] nombre( [ { @parametro [AS] tipo_dato [ = valor_por_defecto ] } [ , ... n ] ] )RETURNS tipo_dato_valor_retornoASBEGIN--cuerpo de la función, TSQLRETURN valor_retornoEND
Sintaxis de una Funcion Escalar
propietario: cuenta de usuario que crea la función nombre: es el nombre de la función que se va a crear. parametro: parámetros de entrada de la función Tipo_dato: tipo de dato asociado a cada parámetro Valor_por_defecto: valor asignado por defecto al parámetro tipo_dato_valor_retorno: tipo de dato asociado al valor de
retorno. valor retorno: valor de retorno de la función
Ejemplo Función Escalar
CREATE FUNCTION Calcular_Pedido (@codigo int)RETURNS decimal (10,2)ASBEGIN
DECLARE @precio moneyDECLARE @iva floatSELECT @precio= sum(totallin) from lineas WHERE numped=@codigoSELECT @iva=ivaped from pedidos WHERE numped=@codigoSET @precio= (@precio* (@iva/100))+@precioRETURN @precio
ENDGO
-- EjecuciónSELECT dbo.Calcular_Pedido (1)
Tabled-Value Functions
Cumplen las mismas reglas de las Scalar Functions.
Retorna una tabla como salida. Generalmente se usan en la
cláusula FROM.
Sintaxis de una Table-Value Functions
Cuerpo
Sintaxis de una Table-Value Functions
CREATE FUNCTION [propietario.] nombre ([ { @parametro [AS] tipo_dato [ = valor_por_defecto ] } [ ,…n]])RETURNS @variable_retorno TABLE < definicion_tabla >ASBEGIN--cuerpo de la función, TSQLRETURN
propietario: cuenta de usuario que crea la función nombre: es el nombre de la función que se va a crear. parametro: parámetros de entrada de la función tipo_dato: tipo de dato asociado a cada parámetro valor_por_defecto: valor asignado por defecto al parámetro variable retorno: variable de retorno de la función Definicion_tabla: definición de la tabla que devuelve la función
Ejemplo Función que devuelve una Tabla
CREATE FUNCTION PedidosPorProveedor (@codigo char(4))RETURNS TABLEAS RETURN (SELECT count(numped) numero, nombrpro
FROM pedidos p, proveedores pr WHERE pr.codigpro=@codigo and
p.codigpro = pr.codigpro GROUP BY nombrpro)
GO
-- EjecuciónSELECT dbo.PedidosPorProveedor('0010')
Funciones Deterministicas y No Deterministicas
Funciones Deterministicas: retornan siempre para el o los mismos parámetros de entrada, el mismo valor de resultado. Ejemplo: el coseno de un ángulo.
Funciones No Deterministicas: retorna diferentes valores de resultado cada vez que se les llaman.Ejemplo la función GetDate().
Implementando un Stored Procedure Es la estructura de programación más
usada dentro de una base de datos. Un procedimiento es un nombre asociado a
proceso batch de instrucciones SQL que son mantenidas y ejecutadas en el servidor.
Los stored procedures pueden retornar un valor escalar, o un conjunto de valores.
Es la interfaz necesaria que las aplicaciones deben usar para acceder a los datos dentro de una base de datos.
Sintaxis de un Stored Procedure
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. valorpor_defecto: valor asignado por defecto al parámetro instrucciones sql: instrucciones SQL
CREATE PROC [ EDURE ] nombre[ { @parametros tipo_dato }[ = valor por defecto ] [ OUTPUT ]] [,...n ][ WITH { RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ][ FOR REPLICATION ]
AS instrucciones sql [ ...n ]
Ejemplo procedimiento sin parámetros
CREATE PROCEDURE dameProveedores ASSELECT codigpro, nombrpro, direcpro, cpostpro, localpro, telefproFROM Proveedores;Go
-- Ejecuciónexec dameProveedores;
Ejemplo procedimiento con parámetros
CREATE PROCEDURE upd_precio_articulo @ipc numeric(3,2) ASBEGIN TRANSACTION
update articulos set preunart = preunart + (preunart*@ipc/100) where preunart is not nullif @@ERROR <> 0 GOTO on_error
on_error:begin ROLLBACK TRANSACTION RAISERROR ('No se han modificado los precios,16,1)end
fin:Go
-- Ejecución exec upd_precio_articulo 3.2
Asignación de permisos a un Stored Procedure
Como en todos los objetos y operaciones en la base de datos, se deben asignar permisos para que un usuario pueda ejecutar un stored procedure.
Cuando se asigna permisos en un Stored Procedure, automáticamente se delegan permisos sobre los objetos y comandos utilizados dentro del Stored Procedure.
Implementando Triggers Es una implementación de
Transacciones-SQL o un proceso batch que responde a un evento dentro de la base de datos.
Existen 2 tipos: Data Manipulation Languaje (DML): se
ejecutan con las instrucciones INSERT, UPDATE or DELETE.
Data Definition Languaje (DDL): se ejecutan cuando se crean, alteran o borran objetos de la base de datos.
DML Triggers Un DML trigger no puede ser ejecutado por un
usuario. Puede estar asociado a una tabla o una vista en
un evento particular definido. Modos de ejecución:
AFTER: Se ejecuta cuando se completa exitosamente todas las validaciones y operaciones de una acción.
INSTEAD OF: Se ejecuta sobre la operación definida, sin importar si se completo toda la acción.
No se puede crear, modificar, borrar, realizar o restaurar una base de datos mediante un trigger.
No puede crear alterar tablas o índices mediante un trigger.
Sintaxis de un DML Trigger
Sintaxis de un DML Trigger
CREATE TRIGGER nombreON { tabla | vista }{ {{ FOR | INSTEAD OF }{ [ INSERT] [,] [ UPDATE] [,] [ DELETE] } [ NOT FOR REPLICATION ] AS [ { IF UPDATE (campo) [ { AND | OR } UPDATE (campo) ] [ ...n ] }] instrucciones_sql [ ...n ] }} nombre: es el nombre del desencadenador que se va a crear.
tabla/vista: es el nombre de una tabla/vista sobre la que se crea. campo: campo de la tabla o vista afectada por el desencadenador . instrucciones sql: reglas de negocio que se requieren especificar
por medio de SQL
Ejemplo No pedir un artículo descatalogadoCREATE TRIGGER tr_lineas ON dbo.Lineas FOR INSERT, UPDATEAS BEGIN
DECLARE @valor intDECLARE @errmsg char(255)SELECT @valor=count(*) FROM insertedWHERE dbo.ArticuloDescatalogado(codigart)!=0IF (@valor) > 0 BEGIN
set @errmsg = 'No puede seleccionar un articulo descatalogado'RAISERROR ( @errmsg,16,1)GOTO on_error
ENDGOTO fin
on_error:ROLLBACK TRANSACTION
fin: END
DDL Triggers
El propósito principal es auditar acciones realizadas en una base de datos.
Sintaxis de un DDL Trigger
Sintaxis de un DDL Trigger
CREATE TRIGGER nombreON { ALL SERVER | DATABASE }[ WITH <ddl_trigger option> [ ,...n ] ]{ FOR I AFTER } { tipo_evento } [ ,...n ]AS { instrucciones_sql [ ; ] [ ,...n ] I EXTERNAL NAME < metodo > [ ; ] }
nombre: es el nombre del desencadenador que se va a crear. instrucciones sql: reglas de negocio que se requieren especificar
por medio de SQL tipo_evento: create, alter,... metodo: ensamblado.clase.metodo <ddl_trigger_option> ::= [ ENCRYPTION ] | [ EXECUTE AS Clause ]
CREATE TRIGGER tr_articulos ON articulos FOR UPDATEAS BEGIN
IF UPDATE (stockart) BEGIN INSERT INTO eventos (fecha, motivo)
SELECT getdate(), 'Stock minimo alcanzado ' + codigart FROM inserted WHERE stockart<=stockmin
END END
Ejemplo Notificar si el stock alcanza el mínimo establecido
EliminaciónPara eliminar objetos que existan en la base de datos, Su sintaxis es:
DROP { TABLE nombre |INDEX nombre |VIEW nombre |TRIGGER nombre |RULE nombre |DATABASE nombre |PROCEDURE nombre |FUNCTION nombre |.... Otros objetos .. }