Documentos de Académico
Documentos de Profesional
Documentos de Cultura
(2ª Parte)
Obtención de información de los triggers.
Los triggers igual que el resto de objetos de la base de datos también aparecen
en la tabla sys.sysobjets, con el identificador TR en la columna xtype, por lo
que
Si deseamos saber cuántos triggers hay en una base de datos, basta hacer
una consulta filtrando con TR en la columna xtype. Esto mismo es válido para
el resto de objetos como procedimientos almacenados, tablas, vista, etc sólo
que en el caso de los procedimientos en vez de TR hay que filtrar por P.
Para obtener la definición de los triggers definidos podemos consultar el
campo text de la tabla sys.syscomments donde viene la definición de todos los
objetos de la base de datos. En el caso de que no queremos que la definicion,
del trigger sea consultada, también podemos añadir la cláusula WITH
ENCRIPTION en la creación del trigger. También podemos obtener información
del trigger ejecutando el procedimiento almacenado sp_help
'tr_nombre_Trigger'
INSERT INTO
tbTablaPrueb
as
VALUES( 1,
'PEDRO' ,
'11/13/2015'
)
INSERT INTO
tbTablaPrueb
as
VALUES( 2 ,
'PEPE',
'11/13/2015'
)
UPDATE tbTablaPruebas
SET nombre = 'LUIS' , fecha = '12/12/2015'
WHERE idClave = 2
No existe una tabla virtual UPDATED, el funcionamiento es parecido o idéntico
a eliminar y después insertar.
Triggers y transacciones.
Los triggers pueden descartar las transacciones que ejecutan. Es decir, los
triggers pueden ser ejecutados dentro de una transacción. Para ello, antes de
comenzar a realizar cualquier operación debemos incluir la sentencia BEGIN y
justo debajo de la lista de operaciones a realizar END de este modo si se
produce una condición mientras se ejecuta la acción que lea una sentencia
ROLLBACK, o bien se produce un error de base de datos, entonces se
descartan todas las operaciones realizadas en la transacción en curso. Por
ejemplo en una operación UPDATE asociada a un trigger si, por cualquier
circunstancia falla una actualización de una tabla, para evitar que la base de
datos quede inconsistente deshacen todas las operaciones realizadas desde la
sentencia BEGIN.
CREATE TRIGGER tr_nombre_Trigger
ON dbo.tbTabla
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE tbTabla set campo1 = 'texto' WHERE campo2 = 10
INSERT INTO tbTabla2 VALUES ('1','texto')
END
RAISERROR ('Notificación', 16, 10);
ROLLBACK;
GO
GO
Transacciones y batches.
Aparte de las transacciones son definidas por el usuario, también se considera
como una transacción las sentencias incluidas en un batch, es decir en una
secuencia de sentencias que se envían al gestor conjuntamente. En este caso,
todo el batch, es considerado una única transacción. Si se ejecuta un trigger
conteniendo la sentencia ROLLBACK las sentencias siguientes no se
ejecutarán pues el trigger descartará la transacción por entero y por tanto, el
contenido íntegro del batch.
Triggers e Inserción condicional.
Los triggers toman la sentencia de modificación como un conjunto completo
que debe ser aceptado o descartado, es decir como una transacción. Por lo
que no es posible aceptar parte de la secuencia de operaciones de
modificación y descartar el resto. Una manera de saltarse este mecanismo
validación es construir en el interior del trigger una subconsulta que examine
las filas modificadas una a una.
Si deseamos insertar un registro en la tabla tbVentas cada vez que se realice
una venta de un libro en una librería, pero para ello es necesario que el
identificador del título del libro esté dado de alta en el almacén (la tabla
tbTitulos) si no es asi, elimina la venta automáticamente.
CREATE TRIGGER TR_InsertCondicional
ON dbo.tbVentas
AFTER INSERT AS
IF
(SELECT COUNT(*) FROM dbo.TbTitulos, inserted
WHERE dbo.TbTitulos.Id_titulo = inserted.Id_titulo) <>
@@ROWCOUNT
BEGIN
DELETE dbo.tbVentas FROM dbo.tbVentas, inserted
WHERE dbo.tbVentas.Id_titulo = inserted.Id_titulo AND
inserted.Id_titulo NOT IN
(SELECT Id_titulo
FROM dbo.TbTitulos)
PRINT 'Sólo ejecuta la venta si existe el título pedido.'
END
Como puede verse, en este trigger se eliminan las filas que no cumplen la
condición enunciada, y sólo éstas. Como vemos, para ello se hace uso de la
tabla inserted, descrita en el apartado anterior. Cada proceso de inserción de
filas en la tabla de ventas (que podría ser de múltiples filas), los registros
insertados se encuentran en la tabla inserted, de manera que el trigger puede
examinarlos y borrar los que no coincidan con los títulos del almacén. De este
modo los triggers sirven para mantener la integridad de datos en una base de
datos.
Ejemplo completo de uso de triggers y procedimientos almacenados.
(enlace a procedimientos almacenados I)
Para definir los procedimientos almacenados la base de datos estará disponible
al público para que pueda consultar por su cuenta, por ejemplo, los libros de un
determinado autor. La manera de hacer posibles estas consultas será mediante
una pequeña aplicación cliente que enviará a SQL Server las peticiones de
datos. Parece evidente que la consulta de libros de un autor será muy
frecuente, de manera que será adecuado definir en la base de datos un
procedimiento almacenado que reciba como argumento el nombre del autor del
que se desea conocer su obra completa.
Este procedimiento se almacenará en SQL Server y su ejecución será
solicitada por las aplicaciones cliente, obteniendo un rendimiento mejor del que
se obtendría con la realización de la consulta. Una posible implementación de
este procedimiento podría ser:
CREATE PROCEDURE PrObraPorAutor @nombre_autor varchar(100)
AS
SELECT titulo, descripcion, cantidad
FROM tbLibros
WHERE nombre_autor = @nombre_autor