sábado, 2 de abril de 2016

Procedimientos almacenados y triggers. (Introducción)

Los procedimientos almacenados (stored procedures) son una serie de colecciones de sentencias Transat-SQL que se encuentran precompiladas y optimizadas para que su ejecución sea mucho más rápida que el conjunto de sentencias individuales que los integran. Un tipo especial de procedimiento almacenado es el trigger. Consiste en un, desencadenador o disparador, lo que  hace referencia a la particularidad de estos procedimientos almacenados de ejecutarse de manera automática disparados cuando se produce una cierta condición o situación especial en los datos que componen la base de datos.
Procedimientos almacenados y triggers

Los triggers son muy útiles para definir modificaciones y acciones automáticas que respondan a la evolución de los datos. Los procedimientos almacenados y los triggers permiten mejorar el rendimiento de las bases de datos, al tiempo que automatizan el proceso de actualización de los datos tomando las decisiones adecuadas a los procesos de negocio.

Procedimientos Almacenados

Un procedimiento almacenado no es más que una colección de sentencias de SQL que se construyen como una función de un lenguaje estructurado. Es decir, se llaman a través de un identificador, es posible definir variables dentro de ellos,  pueden recibir argumentos y devolver un valor de retorno.
La característica principal de los procedimientos almacenados es que se optimizan en el momento de su creación. A diferencia de lo que pasa con las sentencias SQL que se envían el gestor de forma interactiva, los procedimientos almacenados pasan previamente un proceso de normalización.

Compilación de procedimientos almacenados

SQL Server mejora el rendimiento de las consultas utilizando procedimientos almacenados en un doble proceso: normalización y compilación. Cuando se crea un procedimiento almacenado el procesador de consultas del gestor crea una versión del mismo con una estructura normalizada, y la almacena en una de las tablas de sistema. Las siguientes ejecuciones del procedimiento no necesitarán consumir tiempo para llevar a cabo este proceso de normalización de nuevo, por lo que su ejecución será más rápida.
Por otro lado, cuando el procedimiento se ejecuta por primera vez, se compila y la optimiza el acceso del procedimiento a los datos. Este proceso optimizado y compilado, se llama plan y se mantiene en la memoria caché de procedimientos, para posteriores ejecuciones con un gran ahorro de tiempo y recursos.

Características básicas

Las principales características que distinguen a los procedimientos almacenados de las sentencias SQL son:

De forma análoga a las funciones de lenguajes estructurados, aceptan parámetros.
Devuelven un valor de retorno. Este valor sirve como indicador de si las cosas han funcionado de forma correcta o se ha producido algún fallo. También puede devolver un valor como un resultado.
Los procedimientos almacenados pueden estar anidados, es decir, es posible que un procedimiento almacenado llame en su interior a otro En los procedimientos anidados puede hacerse referencia a todos los objetos excepto a las tablas temporales que eventualmente hayan podido crearse en el primero.
Aspectos de seguridad. Se puede autorizar a un usuario para ejecutar procedimientos almacenados aunque no tenga permiso de acceso directo a las tablas de la base de datos con la que trabaja el procedimiento. Esto permite un mayor control sobre las acciones.

Tipos de procedimientos almacenados

Los procedimientos almacenados pueden ser:
Permanentes. Es posible utilizarlos en todas las sesiones de SQL Server para un determinado usuario, si tiene permisos para acceder a él.
Temporales. Sólo se puede acceder a ellos en la sesión actual de trabajo.

Qué es un trigger

Un trigger es un tipo especial de procedimiento almacenado que se ejecuta automáticamente como respuesta a ciertas modificaciones de los datos, las condiciones de disparo se especifican en el momento de la creación del trigger. La utilidad de los triggers es variada. La más ampliamente utilizada es la de establecer reglas de integridad referencia! entre los datos de las tablas de la base de datos.
Triggers y DRI.
DRI significa sentencias de declaración de integridad referencial (Declarative Referential Integity, DRI). Los triggers suelen emplearse para manejar las situaciones cuando estas sentencias DRI no son aplicables. Cuando se declara una sentencia DRI para una determinada situación, no se ejecuta ningún trigger asociado, dado que su ejecución no es necesaria. Las condiciones de integridad referencia que representan las DRI son especificadas en el momento de la creación de las tablas y pueden manejar un buen número de situaciones. Pero su  utilización no permite resolver ciertos planteamientos de los análisis de  datos y, sobre todo, poseen la limitación fundamental de que no permiten hacer referencia a los datos de otras bases de datos para validar los de la nuestra. Esta posibilidad resulta especialmente útil cuando trabajamos en entornos con aplicaciones distribuidas entre múltiples bases de datos o servidores.

Acciones que disparan la ejecución de un trigger

Las acciones que ponen en marcha la ejecución de un trigger son aquellas que  pueden llevarse a cabo en los datos, tanto la adición de datos nuevos como la eliminación de datos existentes. Estas modificaciones se llevan a cabo a través  de la ejecución de las sentencias  UPDATE,  DELETE o INSERT.
Por ejemplo: Queremos que cada vez que se inserta una fila en una tabla se realice un chequeo que determine si los datos introducidos son correctos, o que al eliminar datos se eliminen o modifiquen los datos correspondientes de otras tablas relacionadas.
Para estos aspectos los triggers son una herramienta poderosa y, sobre todo, automática. Es posible definir un trigger que realice las tareas descritas y que se ponga en ejecución inmediatamente después a la operación de borrado o inserción. Cuando dicha acción de modificación se completa, se dispara el trigger correspondiente. Es posible definir triggers que respondan a una o varias de estas acciones. Los triggers también pueden ser recursivos, pues unos pueden   dispararse a otros, o incluso a ellos mismos.

Utilidad de los triggers

Son muy útiles para centralizar en una base de datos la toma de las decisiones de negocio que se asocien a los datos de la misma. De esta forma se descarga en gran medida a las aplicaciones cliente de la tarea de revisar las acciones de actualización de datos. Con el consiguiente ahorro de tiempo y recursos así como se evita que la aplicación externa toque demasiado en la base de datos pudiendo dejarla inconsistente. Además queda todo centralizado en la propia base de datos.
Por ejemplo. Supongamos que tenemos dos tablas una de Almacén y otra de  Ventas, de forma que cada vez que se produce una nueva venta se actualicen las unidades que aún quedan en el almacén. La solución consiste en dejar que sea la propia base de datos la que se encargue de realizar las actualizaciones de manera automática a través de un trigger. De este modo, los triggers pueden utilizarse para resolver, entre otras, las siguientes situaciones:

Preservar la integridad referencial. En el caso en que dos o más tablas en una base de datos se hallen ligadas por claves ajenas no será posible modificar datos en la tabla primaria sin modificar aquellos que se hallen vinculados a él en la tabla subordinada. Utilizando triggers es posible forzar a que los registros dependientes sean eliminados cuando llevamos a cabo un DELETE en la tabla principal. También es necesario en este ámbito deshacer todas las inserciones de datos en la tabla subordinada cuya clave ajena no tenga correspondencia en la clave primaria de la tabla principal.

Establecimiento de condiciones complejas. Los triggers Permiten, especificar condiciones para que los datos de una o varias columnas sean considerados válidos.


Respuesta a cambios de estado de la tabla.  Los triggers permiten examinar el estado de la tabla antes y después de realizar una tarea de modificación y actuar conforme a ella.

No hay comentarios:

Publicar un comentario