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

#1 Rubén Garrigós
08/09/2008 - 16:24 | Informe spam
¿Podrías darnos más datos? Por ejemplo los scripts de las tablas
involucradas, el trigger que diseñaste y la consulta que deseas exportar
cuando tengas cambios. En principio parece un problema de bloqueo de la
consulta que intentas exportar con el propio trigger que está realizando el
update sobre alguna de las tablas que incluyes en la consulta.

Rubén Garrigós
Solid Quality Mentors

"" wrote:

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.

Respuesta Responder a este mensaje
#2 tulkas_arg
08/09/2008 - 16:44 | Informe spam
Los triggers que probe son estos, con ejemplos de northwind.
A TXT:
"create trigger MonitorCustomers
on Customers after update, insert, delete
as

declare @ComandoBCP varchar(100)

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

exec master..xp_cmdshell @comandoBCP, no_output"

A XLS:
"create trigger Prueba on Categories
after update
as

INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel
8.0;Database=c:\contact.xls;',
'SELECT * FROM [Hoja1$]')
SELECT TOP 5 customerid,companyname
FROM Customers
GO"

a XML

"create trigger TriggerXML on Customers
for insert
as

declare @outputfile nvarchar(100),
@query nvarchar(100),
@templatefile nvarchar(100)

exec sp_makewebtask @outputfile = 'c:\myxmlfile.xml',
@query = 'select top 5 * from Customer"


La consulta la hice sobre tablas diferentes a las que disparan los
eventos del trigger, para evitar bloqueos, pero sigue sin andar. Vos
sabes bien si es posible ejecutar este tipo de consultas directamente
desde un trigger? Porque eso es crítico para la aplicación que tengo
que desarrollar.
Muchas gracias por tomarte el tiempo de responder.
Respuesta Responder a este mensaje
#3 Rubén Garrigós
08/09/2008 - 17:31 | Informe spam
Hola de nuevo,

En principio al primer trigger con bcp que comentas no le encuentro ningún
problema como para que no funcione. ¿Has probado de ejecutar las sentencias
del trigger a mano? Debería volcarte la tabla sin problema. Si no lo hace,
puede que sea un tema de permisos en esa carpeta pues en principio lo veo
todo bien. Prueba también a quitar el "no output" para ver si te devuelve
algún error más inteligible el bcp.

En todo caso, ten en cuenta que lanzar una consulta no dispara ningún
trigger. Únicamente cuando realices alguna modificación sobre la tabla
customers obtendrás el volcado de las categorías de northwind.

En el caso que te comentaba que el volcado afectara a alguna de las tablas
sobre las que actúa el trigger el problema de bloqueo que puedas tener lo
puedes aliviar (aunque no me guste mucho) añadiendo lectura sucia a tu
consulta (nolock).

Rubén Garrigós
Solid Quality Mentors

"" wrote:

Los triggers que probe son estos, con ejemplos de northwind.
A TXT:
"create trigger MonitorCustomers
on Customers after update, insert, delete
as

declare @ComandoBCP varchar(100)

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

exec master..xp_cmdshell @comandoBCP, no_output"

A XLS:
"create trigger Prueba on Categories
after update
as

INSERT INTO OPENROWSET ('Microsoft.Jet.OLEDB.4.0', 'Excel
8.0;Database=c:\contact.xls;',
'SELECT * FROM [Hoja1$]')
SELECT TOP 5 customerid,companyname
FROM Customers
GO"

a XML

"create trigger TriggerXML on Customers
for insert
as

declare @outputfile nvarchar(100),
@query nvarchar(100),
@templatefile nvarchar(100)

exec sp_makewebtask @outputfile = 'c:\myxmlfile.xml',
@query = 'select top 5 * from Customer"


La consulta la hice sobre tablas diferentes a las que disparan los
eventos del trigger, para evitar bloqueos, pero sigue sin andar. Vos
sabes bien si es posible ejecutar este tipo de consultas directamente
desde un trigger? Porque eso es crítico para la aplicación que tengo
que desarrollar.
Muchas gracias por tomarte el tiempo de responder.

Respuesta Responder a este mensaje
#4 tulkas_arg
08/09/2008 - 18:02 | Informe spam
Bueno, en realidad había escrito mal la consulta, el bcp me esta
andando bien si no referencio las tablas que usa el trigger...
Entonces asumo que es un problema de bloqueos, te pido disculpas, yo
necesito recuperar las filas modificadas(insertadas, actualizadas o
eliminadas) y enviarlas al archivo txt. Así es la consulta de ejemplo
que uso:

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

select * into tempinserted from inserted
declare @ComandoBCP varchar(100)

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

exec master..xp_cmdshell @comandoBCP"

Si yo ejecuto, por ejemplo:

"insert into Customers (customerid, companyname)
values('pepee','aaaaaaaa')"

Al usar tempinserted en la consulta BCP ejecuta eternamente, si por
ejemplo pongo products, que no la usa el trigger, si me exporta bien
los datos y el trigger finaliza sin errores, será porque el trigger
tiene un bloqueo sobre tempinserted? Como hago para esquivarlo? Leí
sobre el read uncomitted pero no se bien donde aplicarlo.
Muchisimas gracias de nuevo.
Respuesta Responder a este mensaje
#5 tulkas_arg
08/09/2008 - 18:09 | Informe spam
Me olvide de preguntarte, es posible obligar al trigger a que no tenga
ningún bloqueo SOLAMENTE sobre tempinserted? Es decir, que bloquee los
recursos que usa excepto tempinserted.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida