Академический Документы
Профессиональный Документы
Культура Документы
Introducción
Desarrollo
TRIGGER
Se han visto las ventajas que la funciones proporcionan al simplificar acciones en una
base de datos. Pero estas acciones requieren la intervención de una persona
encargada de ejecutar las funciones cuando se requiera de su actuación. Los Triggers
al contrario son funciones que se ejecutan de forma automática en respuesta a ciertos
eventos que ocurren en la base de datos.
Un trigger es una función que se ejecuta de forma automática cuando se cumple una
condición establecida al realizar una operación sobre la base de datos. Un Trigger es
una acción en cadena que empieza cuando un evento específico ocurre sobre una
tabla específica.
El uso de los triggers está muy vinculado con la realización de acciones para auditar y
monitorear la actividad de cambio de datos dentro de una base de datos. Permiten
validar datos, cambiando o negando acciones como INSERT, UPDATE y DELETE en
una tabla. Además su funcionalidad les permite preservar la consistencia y claridad de
los datos ejecutando acciones relacionadas con otras tablas.
Ventajas de los triggers:
Pueden consultar otras tablas e incluir instrucciones SQL complejas.
Son especialmente útiles para exigir reglas o requisitos complejos.
Son útiles para exigir la integridad referencial, que conserva las relaciones
definidas entre tablas cuando se agregan, actualizan o eliminan filas en esas
tablas.
Son automáticos, se activan al efectuarse modificaciones en los datos de la
tabla, como una entrada manual o una acción de la aplicación.
Pueden realizar cambios en cascada a través de tablas relacionadas de la base
de datos, al igual que cuando se define las cláusulas ON DELETE y ON
UPDATE al definir restricciones de integridad referencial al crear tablas.
Pueden exigir restricciones más complejas que las definidas con restricciones
CHECK.
Ofrecen un mayor control sobre la Base de Datos.
Ejemplo:
Argumentos:
nombre_trigger: Es el nombre del desencadenador.
FOR EACH [ROW | STATEMENT]: Para cada fila ó para cada sentencia.
NEW: Variable compuesta que almacena los nuevos valores de la tupla que se está
Modificando.
OLD: Variable compuesta que almacena los valores antiguos de la tupla que se está
modificando.
TG_OP: Variable tipo string que indica qué tipo de evento está ocurriendo (INSERT,
UPDATE, DELETE).
TG_ARGV: Variable tipo arreglo que almacena los parámetros de la función del trigger,
los cuales se pueden acceder de la forma TG_ARGV[0], TG_ARGV[1], etc.
Entonces, ¿cuáles son las acciones que se deben realizar con un trigger?
Se necesita llevar un registro de todos los cambios relevantes en la tabla
PRODUCTO, comenzando por tener un seguimiento de los cambios en los
precios de los productos.
Se debe crear una tabla que almacene los cambios de precio en la tabla PRODUCTO,
la cual se llamará PRODUCTO_ACTUALIZADO.
CURSORES
Las operaciones de una base de datos relacional actúan en un conjunto completo de
filas. El conjunto de filas que devuelve una instrucción SELECT está compuesto por
todas las filas que satisfacen las condiciones de la cláusula WHERE de la instrucción.
Este conjunto completo de filas que devuelve la instrucción se conoce como el conjunto
de resultados. Las aplicaciones no siempre pueden trabajar de forma efectiva con el
conjunto de resultados completo si lo toman como una unidad. Estas aplicaciones
necesitan un mecanismo que trabaje con una fila o un pequeño bloque de filas cada
vez. Precisamente los cursores representan consultas SELECT de SQL que devuelven
más de un resultado y que permiten el acceso a cada fila de una consulta.
Declarar el Cursor
Sintaxis:
DECLARE
cursor_name CURSOR FOR select_statement;
Este comando declara un cursor. Pueden definirse varios cursores en una rutina, pero
cada cursor en un bloque debe tener un nombre único.
Argumentos:
cursor_name: Especifica el nombre del cursor.
Ejemplo:
DECLARE
curs1 refcursor;
curs2 CURSOR FOR SELECT * FROM empleado;
Los dos cursores declarados anteriormente tienen el tipo de datos refcursor, pero el
primer cursor (curs1) puede ser usado para cualquier consulta, mientras que el
segundo es específico para la consulta SELECT * FROM empleado.
Esta instrucción cuenta con un selector que indica la dirección del recorrido, que puede
ser:
count: determina cuántas filas hay que seleccionar. Puede ser uno de los siguientes:
#: Un entero con signo que especifica cuántas filas hay que seleccionar. UN
entero negativo es equivalente a cambiar el sentido de la selección (Forward o
Backward)
Ejemplo:
FETCH cursorProvincias INTO v_nombre, v_poblacion;
Una instrucción FETCH lee una sola fila y su contenido lo almacena en variables. Por
ello se usa siempre dentro de bucles:
LOOP
FETCH cursorProvincias INTO (v_nombre, v_poblacion);
EXIT WHEN... --aquí se pondría la condición de salida...
--instrucciones de proceso de los datos del cursor
END LOOP;
Ejemplo:
cursorProvincias IS OPEN;
Ejemplo:
BEGIN
OPEN cursorProvincias;
LOOP
FETCH cursorProvincias INTO v_nombre,v_poblacion;
EXIT WHEN NOT FOUND;
END LOOP;
CLOSE cursorProvincias;
END;
Ejemplo:
DECLARE
cur_personas CURSOR (dep NUMBER, pue VARCHAR2 (20)) FOR
SELECT nombre, apellidos
FROM empleados
WHERE departamento=dep AND puesto=pue;
BEGIN
OPEN cur_personas (12,’administrativo’);
.....
CLOSE cur_personas;
END
Es al abrir el cursor cuando se indica el valor de los parámetros, lo que significa que se
puede abrir varias veces el cursor y que éste obtenga distintos resultados dependiendo
del valor del parámetro.
Ejemplo
DECLARE
cur_personas CURSOR (dep NUMBER, pue VARCHAR2 (20)) FOR
SELECT nombre, apellidos
FROM empleados
WHERE departamento=dep AND puesto=pue;
BEGIN
FOR r IN cur_personas (12,’administrativo’)
LOOP
.....
END LOOP;
END:
Conclusiones
Hasta aquí se vieron los elementos básicos de dos contenidos muy importantes y de
amplia utilización en el trabajo con bases de datos: los triggers y los cursores.
El uso de los triggers y cursores en una base de datos garantiza una mayor seguridad y
fiabilidad en las consultas; pero un uso desmedido de ambos trae consigo demora en la
ejecución de las consultas y un gran consumo de recurso por parte del servidor de
base de datos.