lunes, 27 de septiembre de 2010

MS SQL 2005: Crear un disparador (TRIGGER) sobre una vista (VIEW) que mande un e-mail al DBA

Supongamos que queremos que nuestro gestor de bases de datos nos avise cuando se modifiquen ciertos datos. En este caso concreto, quiero recibir un email a mi cuenta cuando los datos de una tabla no concuerden con los datos de otra (es decir, que la cantidad de un artículo que hay en una tabla sea diferente a la cantidad de ese mismo artículo en otra tabla). Parece lioso, pero se ve rápido con un ejemplo:

TABLA datos_almacen

Codigo_articulo varchar(16)
Cantidad decimal(12,3)

TABLA datos_almacen_2

Codigo_articulo varchar(16)
Cantidad decimal(12,3)

Entonces, si la cantidad del mismo artículo es diferente para las dos tablas, quiero que me avise. Supongamos que tengo la siguiente vista que muestra todos los artículos con diferencias:

CREATE VIEW mi_vista AS
SELECT *
FROM datos_almacen a inner join datos_almacen_2 b
on a.codigo_articulo = b.codigo_articulo
and a.cantidad <> b.cantidad

Correcto, esta vista muestra las diferencias (recuerda que estamos suponiendo que ambas tablas tienen los mismos códigos de artículo, si en uno hubiese más que en otro habría que hacer un JOIN lateral). Ahora el trigger para que salte cuando aparezca alguna diferencia:

MS SQL 2005: Crear una vista

Lo que hace una vista es devolver el resultado de una consulta de selección como si se tratase de un select, pero de forma que podemos impedir al usuario el acceso a las tablas sobre las que se ejecuta la consulta.

Un ejemplo:

CREATE VIEW mi_vista AS
select *
from mi_tabla

Ahora podemos quitarle permisos a un usuario sobre la tabla 'mi_tabla' pero darle permisos sobre la vista 'mi_vista' y el usuario podría consultar los datos de la tabla (los que nosotros, DBAs, queramos, jeje) sin tener acceso directo a la misma.