Professional Documents
Culture Documents
Este pequeño articulo pretende dar una ligera visión sobre el uso de los
triggers para poder controlar errores de clave duplicadas. Muchos os preguntareis
porque vamos a controlar nosotros las claves duplicadas si tenemos Primary Keys e
índices únicos que ya se encargan de esto por nosotros.
Una de las razones que me llevo a realizar esta prueba, que ahora pongo en vuestro
conocimiento, fue la casualidad y la curiosidad (que orden lleva SQL Server cuando se
inserta un registro en una tabla).
Me puse manos a la obra, el mono de trabajo y música....
Los motivos principales para este estudio son 3'5: - saber cuales son las claves que se
están intentando insertar de forma duplicada en una tabla - evitar mensajes de error por
errores 2627 - controlar la inserción masiva de datos desde otras fuentes - y tb el "tapar"
pequeños despistes en nuestras aplicaciones
Adjunto los scripts necesarios para realizar la practica. Creo que en el script están bien
explicados todos los pasos.
La idea es básica, creo un Trigger del tipo INSTEAD OF INSERT que se ejecuta
siempre y en vez de cada INSERT que se lance sobre mi tabla. En este Trigger hago una
comprobación de los datos de la PK que se están intentando insertar en la tabla, si es así
guardo esta información en una tabla temporal POPO (para tener un histórico) en caso
contrario prosigo con la inserción. Una característica de este tipo de Triggers es que
solo se ejecutan una vez por INSERT de manera que no se producen ejecuciones
anidadas de Triggers del tipo INSERT.
Como podréis ver el ejemplo es bastante sencillo, era mi intención, y las aplicaciones
las tendréis que ir buscando vosotros (no lo voy a hacer yo todo :-) )
-- Usamos la BBDD
USE Temporal
GO
AS
GO
-- Ahora utilizamos una sentencia del tipo UNION ALL, para insertar un
conjunto de resultados
INSERT INTO dbo.tabla
SELECT 1,'uno'
UNION ALL
SELECT 2,'dos'
UNION ALL
SELECT 1,'uno'
UNION ALL
SELECT 8,'dos'
-- Para vaciarlas
DELETE FROM dbo.tabla
-- Ejecutamos el SP
EXEC dbo.Inserta
GO