Exportar datos de consulta sql a archivo(cualquier formato) desde un trigger

08/09/2008 - 14:24 por tulkas_arg | Informe spam
Hola a todos, tengo un pequeño problemita al que no le encuentro
solución, aquí he visto que hay gente que sabe mucho asi que espero
puedan ayudarme. Tengo la necesidad de exportar el resultado de una
consulta simple a un archivo desde un trigger, es esto posible?
Probe exportando a txt y xls con bulk copy y openrowset pero cuando
ejecuto esto desde el trigger, este queda ejecutando eternamente,
curiosamente, fuera del trigger anda bien. Porque me sucede esto? Como
puedo hacer que funcione? Que otras alternativas me sugieren? Necesito
exportar los datos cuando me modifican una tabla, en tiempo real.
Muchas gracias por tomarse el tiempo de leer.
Saludos.

Preguntas similare

Leer las respuestas

#6 Rubén Garrigós
08/09/2008 - 19:16 | Informe spam
Hola de nuevo,

La implementación que comentas tiene el inconveniente de estar utilizando
una tabla que creas con un SELECT INTO lo cual te dará problemas en la
segunda ejecución al existir ya la tabla. Además, no es posible que lo hagas
de esta forma si luego vas a tener un BCP al tener ya una operación bulk como
SELECT INTO.

La solución a esto pasa por crearte una tabla de cambios para cada tabla que
quieras monitorizar previamente (a mano o con un select * into
customers_cambio from customers where 1=2). Esta tabla tendrá las mismas
columnas que la tabla original (en este caso customers). En el cuerpo del
trigger tendrías que sustituir el SELECT INTO por:

DELETE customers_cambios

INSERT customers_cambios
SELECT * FROM inserted

INSISTO, NO me gusta nada esta solución pues además de graves problemas de
rendimiento tiene problemas de concurrencia, de machaque del fichero ante
varios cambios, etc.

Creo que deberías replantearte seriamente lo de insertar en ficheros en el
mismo trigger. Podrías tener una solución mucho más elegante creandote tablas
para auditoria y utilizar el trigger para irlas rellenando con datos.
Periodicamente podrías volcarlas a disco si lo deseas también pero no
directamente en el trigger como pretendes hacer...

Rubén Garrigós
Solid Quality Mentors
"" wrote:

Mostrar la cita
#7 tulkas_arg
08/09/2008 - 19:50 | Informe spam
La verdad a mi tampoco me gusta esta solución, me sería mucho mas
facil operar sobre una aplicación cliente, incluso hacer un job que
recorre la tabla de cambios en forma recurrente y exporte el archivo,
pero yo solamente puedo hacer lo que me piden, y me piden esto. Probé
sustituir el select into por una inserción normal pero el bloqueo
sigue, te muestro:

"create trigger MonitorCustomers
on Customers after update, insert, delete
as

delete tabla_cambios

insert tabla_cambios
select customerid,companyname from inserted

declare @ComandoBCP varchar(100)

set @ComandoBCP = 'bcp "SELECT * FROM Northwind..tabla_cambios"
queryout "c:\authors.txt" -T -c'

exec master..xp_cmdshell @comandoBCP"

Cualquier operacion causa que el trigger quede congelado procesando,
se ve que al referenciar tabla_cambios, esta queda bloqueada. Se te
ocurre otra alternativa para ejecutar el bulk copy desde el trigger?
Alguna forma de mantener sin locks tabla_cambios?

Muchas gracias por la ayuda.
#8 Rubén Garrigós
08/09/2008 - 23:32 | Informe spam
Hola de nuevo,

Añade el hint (nolock) a la consulta del bcp para permitir que lea datos
sucios, con eso debería funcionarte:

SELECT * FROM Northwind.dbo.tabla_cambios (nolock)

Entiendo que en ocasiones uno se encuentre entre la espada y la pared, pero
es importante, al menos, que los responsables sean consciente que hacer esto
es poco recomendable, propenso a problemas, etc.

Rubén Garrigós

Solid Quality Mentors


Mostrar la cita
"" wrote:

Mostrar la cita
#9 tulkas_arg
09/09/2008 - 15:20 | Informe spam
Te agradezco mucho por toda la ayuda, esto ya esta andando, un saludo.
Ads by Google
Search Busqueda sugerida