Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Un Trigger, también llamado Disparador, en una base de datos, es un procedimiento que se ejecuta
cuando se cumple una condición establecida.
Depende de la base de datos, los Triggers pueden ser antes o después de ejecutar un INSERT, UPDATE o
DELETE.
Un Trigger funciona tanto al insertar,actualizar o borrar datos en una base de datos o incluso al crear o
editar usuarios.
Los Triggers son usados para mejorar la administración de la Base de Datos, sin necesidad de que el
usuario ejecute esas sentencias SQL.
La utilidad que se le acostumbra mayoritariamente a dar, es para prevenir errores de datos, actualizar
tablas, modificar valores, entre muchas utilidades que el administrador le quiera dar.
Un programa en el cual poder escribir sentencias SQL/MySQL, por ejemplo MySQL Workbench, y en él
una base de datos, con tablas, campos o inserciones.
Tenemos una base de datos llamada Campus de Verano, dónde en ella tenemos la información de todos
los usuarios que están registrados en el campus, el nombre y los DNI de los monitores, para tener todo
bajo control, hemos creado una tabla vacía, en la cual queremos que se inserte automáticamente datos
del nombre del administrador que está insertando datos, para tenerlo controlado, que nos haga una
especie de chivatazo, por si alguna vez pasa algo.
¿Cómo podemos ver que datos ha introducido que administrador de la Base de Datos?
CON UN TRIGGER!
Como podemos ver, delimitamos el Trigger, al principio y al final, para que ejecute todas las sentencias de
delimitador a delimitador.
Le especificamos en momento en que queremos que actúe, que puede variar en AFTER o BEFORE.
Y le decimos en que tabla queremos que haga efecto, on registro_inserts for each row
Abrimos y cerramos el Trigger con un Begin End; y dentro de éste pondremos las sentencias que
queremos que contenga el Trigger, esa sentencia va a ser que inserte en la tabla registro, los valores del
usuario actual, la hora y fecha, y que ha insertado datos.
Definición de procedimiento almacenado
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 ejecución para que la subsiguiente
ejecución sea muy rápida. Los procedimientos almacenados pueden:
•Incluir parámetros
•Devolver un valor de estado a un procedimiento de llamada o lote para indicar el éxito o el fracaso del
mismo y la razón de dicho fallo
La sintaxis para la creación de un procedimiento almacenado sencillo, sin funciones especiales como
parámetros, es:
create procedure
procedure_name
as
SQL_statements
Los procedimientos almacenados son objetos de base de datos, y sus nombres deben ajustarse a las
reglas para identificadores. Es posible incluir cualquier número y cualquier tipo de instrucción SQL, salvo
las instrucciones
create
execute
namelist
Funciones de agregado
Las funciones de agregado realizan un cálculo sobre un conjunto de valores y devuelven un solo valor. Se
pueden usar en la lista de selección o en la cláusula HAVING de una instrucción SELECT.Puede usar una
agregación en combinación con la cláusula GROUP BY para calcular la agregación en las categorías de
filas. Use la cláusula OVER para calcular la agregación en un intervalo de valor específico. La cláusula OVER
no puede seguir las agregaciones GROUPING o GROUPING_ID.
Todas las funciones de agregación son deterministas; es decir, siempre devuelven el mismo resultado
cuando se ejecutan con los mismos valores de entrada. Para más información, vea Funciones
deterministas y no deterministas.
Funciones analíticas
Las funciones analíticas calculan un valor agregado basándose en un grupo de filas. A diferencia de las
funciones de agregado, estas funciones pueden devolver varias filas para cada grupo. Puede usar
funciones analíticas para calcular medias móviles, totales acumulados, porcentajes o resultados de N
valores superiores dentro de un grupo.
Funciones de categoría
Las funciones de categoría devuelven un valor de categoría para cada fila de una partición. Según la
función que se utilice, algunas filas pueden recibir el mismo valor que otras. Las funciones de categoría
son no deterministas.
Las funciones de conjuntos de filas devuelven un objeto que se puede usar como referencias de tabla en
una instrucción SQL.
Funciones escalares
Operan sobre un valor y después devuelven otro valor. Las funciones escalares se pueden utilizar donde la
expresión sea válida.
Determinismo de función
Intercalación de funciones
Las funciones que toman una entrada de cadena de caracteres y devuelven una salida de cadena de
caracteres utilizan la intercalación de la cadena de entrada para la salida.
Las funciones que toman entradas que no son de caracteres y devuelven una cadena de caracteres
utilizan la intercalación predeterminada de la base de datos actual para la salida.
Las funciones que toman varias entradas de cadena de caracteres y devuelven una cadena de caracteres
utilizan las reglas de prioridad de intercalación para establecer la intercalación de la cadena de
salida. Para más información, vea Prioridad de intercalación (Transact-SQL).
CREATE FUNCTION Sales.ufn_SalesByStore (@storeid int)
RETURNS TABLE
AS
RETURN
(
SELECT P.ProductID, P.Name, SUM(SD.LineTotal) AS 'Total'
FROM Production.Product AS P
JOIN Sales.SalesOrderDetail AS SD ON SD.ProductID = P.ProductID
JOIN Sales.SalesOrderHeader AS SH ON SH.SalesOrderID = SD.SalesOrderID
JOIN Sales.Customer AS C ON SH.CustomerID = C.CustomerID
WHERE C.StoreID = @storeid
GROUP BY P.ProductID, P.Name
);
Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que
aparece encerrada entre paréntesis, no puede contener la cláusula ORDER BY, ni puede ser la UNION de
varias sentencias SELECT, además tiene algunas restricciones en cuanto a número de columnas según el
lugar donde aparece en la consulta principal. Estas restricciones las iremos describiendo en cada caso.
Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta por cada fila de
la consulta principal.
Las consultas que utilizan subconsultas suelen ser más fáciles de interpretar por el usuario.
Referencias externas
A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valor de una columna
en la fila actual de la consulta principal, ese nombre de columna se denomina referencia externa.
Una referencia externa es un nombre de columna que estando en la subconsulta, no se refiere a ninguna
columna de las tablas designadas en la FROM de la subconsulta sino a una columna de las tablas
designadas en la FROM de la consulta principal. Como la subconsulta se ejecuta por cada fila de la
consulta principal, el valor de la referencia externa irá cambiando.
Ejemplo:
SELECT numemp, nombre, (SELECT MIN(fechapedido) FROM pedidos WHERE rep = numemp)
FROM empleados;
- se coge el primer empleado y se calcula la subconsulta sustituyendo numemp por el valor que tiene en
el primer empleado. La subconsulta obtiene la fecha más antigua en los pedidos del rep = 101,
- se coge el segundo empleado y se calcula la subconsulta con numemp = 102 (numemp del segundo
empleado)... y así sucesivamente hasta llegar al último empleado.
Al final obtenemos una lista con el número, nombre y fecha del primer pedido de cada empleado.
Si quitamos la cláusula WHERE de la subconsulta obtenemos la fecha del primer pedido de todos los
pedidos no del empleado correspondiente.
Anidar subconsultas
Ejemplo:
En este ejemplo, por cada linea de pedido se calcula la subconsulta de clientes, y esto se repite por cada
empleado, en el caso de tener 10 filas de empleados y 200 filas de pedidos (tablas realmente pequeñas),
la subconsulta más interna se ejecutaría 2000 veces (10 x 200).
Muchos SQLs no permiten que una subconsulta aparezca en la lista de selección de la consulta principal
pero eso no es ningún problema ya que normalmente se puede obtener lo mismo utilizando como origen
de datos las dos tablas. El ejemplo anterior se puede obtener de la siguiente forma:
SELECT numemp, nombre, MIN(fechapedido)
FROM empleados LEFT JOIN pedidos ON empleados.numemp = pedidos.rep
GROUP BY numemp, nombre
En la cláusula FROM
En la cláusula FROM se puede encontrar una sentencia SELECT encerrada entre paréntesis pero más que
subconsulta sería una consulta ya que no se ejecuta para cada fila de la tabla origen sino que se ejecuta
una sola vez al principio, su resultado se combina con las filas de la otra tabla para formar las filas origen
de la SELECT primera y no admite referencias externas.
En la cláusula FROM vimos que se podía poner un nombre de tabla o un nombre de consulta, pues en vez
de poner un nombre de consulta se puede poner directamente la sentencia SELECT correspondiente a esa
consulta encerrada entre paréntesis.
Se suele utilizar subconsultas en las cláusulas WHERE o HAVING cuando los datos que queremos visualizar
están en una tabla pero para seleccionar las filas de esa tabla necesitamos un dato que está en otra tabla.
Ejemplo:
En este ejemplo listamos el número y nombre de los empleados cuya fecha de contrato sea igual a la
primera fecha de todos los pedidos de la empresa.