Buenas tardes, como acotación:

A parte de todo esto tene en cuenta que si el trigger que está insertando, está 
dentro de una transacción y la misma hace rollback por lo que sea, por  lógica 
o deadlock, ese insert vuelve atrás todos los cambios, si lo que queres es 
monitorear si accedió o no, entonces el único insert que puede funcionar sin 
verse afectado por transacción es contra un servidor linqueado, insertando en 
una tabla en otro servidor ya que estas conexiones no son afectadas por la 
transacción.

Saludos


Martín Gamazo
Analista Programador
Gerencia de Sistemas y Desarrollo Tecnológico
La Rioja 301 (1214) – Buenos Aires
Teléfonos:  4956-9622  Int. 1461
Directo: 4956-9761
e-mail: [email protected]</mailnew/[email protected]>
Web:  www.oca.com.ar<javascript:void(0);>

De: [email protected] [mailto:[email protected]] En nombre de Alejandro Paciotti
Enviado el: lunes, 28 de abril de 2014 10:57 a.m.
Para: GUFA List Member
Asunto: [GUFA] OFF-TOPIC: Eventos en SQL SERVER.

Pancho: si te entendí, solo que no me gusta esa solución.

Ponete en el lugar del desarrollador del sistema: Desarrollaste una aplicación, 
la tenes en funcionamiento y viene otro programador y te dice: Por cada INSERT 
que hagas en tal, tal y tal tabla voy  a disparar un TRIGGER que a) inserte un 
registro en otra tabla, o b) inserte un registro en otra tabla en otra base de 
datos, o bien c) inserte un registro en otra tabla en otro motor, que puede ser 
mysql, firebird o postgresql, que la voy a tener funcionando en este linux.

Las mínimas preguntas que vos te vas a hacer son: ¿cómo va a ser la tabla donde 
vas a insertar? ¿qué pasa si a esa tabla luego la lockea otro proceso? ¿ y si 
está en otro motor, qué pasa si el motor perece, o se indispone ? ¿si está en 
otro motor en otra pc?

¿Todo mi sistema va a depender de un mysql que está en un linux en un cacharro 
ahí tirado ? Sostiene el programador del sistema, creo que con justa causa.


Por eso, creo que lo mas sano es ver el tema de los catcheos de eventos, que 
son o deberían ser muy livianos siempre.

Ya me pongo a leer sobre el Profiler. Gracias de todas formas.



[email protected]<mailto:[email protected]>

El 28 de abril de 2014, 8:07, francisco prieto 
<[email protected]<mailto:[email protected]>> escribió:
No no no...

No me entendiste...

Si tenes acceso a la base de datos podes crear un trigger en la tabla que 
quieras interceptar y por lo tanto en ese trigger podes disparar un 
procedimiento almacenado o bien insertar los datos en otra tabla que no tiene 
porque esta en la misma base de datos... es mas podes si queres insertar datos 
en una tabla de un motor libre...

Claro que el acceso a la base de datos que tenes que tener no es un acceso de 
usuario final, tenes que poseer ciertos privilegios para poder crear SP.

En Sql Server hay eventos....  estudia el tema SQL Profiler, pero dichos 
eventos estan orientados a la optimizacion del motor y no a la interacción con 
sus datos.

Lo otro que podes hacer es armarte un esquema en Firebird o en MySql pero que 
apunte a cualquier base de datos externa, el tema es que los eventos que puedas 
generar en ellos van a apuntar a tu base y no a la externa, salvo que en la 
extena tengas propiedades privilegiadas.

En fin esa es mi experiencia... en el caso Firebird podes realizale esta misma 
pregunta a Walter Ojeda Valiente que es un maestro en Firebird... te paso su 
blog... http://firebird21.wordpress.com/

Saludos,

Pancho
Córdoba

El 27 de abril de 2014, 10:47, Alejandro Paciotti 
<[email protected]<mailto:[email protected]>> escribió:
Supongamos que hay un sistema, y que ese sistema inserta registros en una tabla.
Yo no tengo los fuentes de ese sistema pero tengo acceso a la base de datos y 
quiero que cada vez que se inserta un registro en alguna tabla específica se 
ejecute un programa.

Podría hacer lo que dice Pancho y hacer que ese programa observe cada n 
segundos una tabla en la base de datos y cuando se insertó un registro ejecute 
lo que tenía que hacer originalmente.

La verdad, esta solución no me gusta. En C# existe algo así como el "system 
watcher " (no recuerdo exactamente) para una carpeta, que interactua con el 
sistema operativo tal que determinados procedimientos se ejecutan cuando se 
crea o altera algún archivo en esa carpeta.

El mismo Windows también lo hace, si uno abre el explorador de windows dos 
veces en la misma carpeta y crea un archivo en alguna de esas dos ventanas la 
otra lo muestra casi inmediatamente. No creo que windows use "timers"... debe 
tener algún sistema de eventos y notificaciones.

De hecho, MSSQLSERVER también lo tiene!  el Service 
Broker<http://msdn.microsoft.com/en-us/library/ms166100.aspx> , pero los 
eventos no salen de la instancia de SQL SERVER, o bien, si salen pero a otra 
instancia de SQL SERVER. Lo que yo quiero es que dispare un evento en algún 
puerto, como lo hace FIREBIRD, o MYSQL.. ¿ para qué? Para desligarme de tener 
que usar C# o bien para desligarme de tener que usar una instancia de SQLSERVER 
y programar en lo que se me antoja, sea PYTHON, JAVA, RUBY O JAVASCRIPT...

Otros ejemplos de uso, y quizá muchísimo mas útil que mi necesidad es para 
auditar la performance  del motor y de cualquier aplicación, como por ejemplo 
lo que trae SQL SERVER (creo que a partir de 2012) que son los eventos 
extendidos que sirven para:



·         Encontrar las consultas más caras

·         Encontrar las causas principales de la contención de bloqueos 
temporales

·         Encontrar una consulta que esté bloqueando otras consultas

·         Solucionar problemas de uso excesivo de la CPU producido por la 
recompilación de consultas

·         Solucionar problemas de interbloqueos
Sobre este tema pueden leer mucho 
aquí.<http://technet.microsoft.com/es-es/library/bb630282.aspx> Esto no lo 
conocía cuando hice la pregunta, lo leí recién ayer (ayer... no se si fue ayer 
o el Viernes, ya estoy perdiendo la noción de los días).

En resumen, lo que yo quiero hacer es un sistema que escuche cuando en una base 
de datos se produzca un evento sin tener la necesidad de alterar nada de las 
instrucciones que se utilizan para insertar, borrar y/o modificar.

Para mi, es sumamente importante, ya que de poder hacer esto podría integrar 
cualquier sistema hecho con BDD en SQLSERVER solamente pidiendo al 
administrador de la base de datos que inserte esos TRIGGERS, (o lo que fuese). 
Cuando me refiero a integrar quiero decir por ejemplo, integrar un sistema con 
una herramienta de inteligencia de negocios, o con un CRM. (Ejemplo: cuando se 
modifica el saldo de la tabla clientes y ese saldo supera un monto determinado 
por una regla determinada por el gerente comercial notificarlo vía email y 
generar un caso en el CRM).

Espero haber sido claro!

Saludos for everyone and everyone! (todos y todas en inglés...)






[email protected]<mailto:[email protected]>

El 27 de abril de 2014, 9:03, francisco prieto 
<[email protected]<mailto:[email protected]>> escribió:
Alejandro...

No hace falta que lo escuches... con que el trigger inserte el elemento en una 
tabla y vos mires constantemente dicha tabla sería suficiente.

Saludos,

Pancho
Córdoba

El 26 de abril de 2014, 23:51, César Pistiner 
<[email protected]<mailto:[email protected]>> escribió:

Buenas noches...

Cual es la necesidad de capturar ese evento? No te alcanza con controlarlo 
antes o después de la llamada en tu código?

Solo para comprender mas el problema.

Saludos,
César
El abr 26, 2014 9:51 AM, "Alejandro Paciotti" 
<[email protected]<mailto:[email protected]>> escribió:
Un trigger en la tabla que vos quieras... pero como haces para "escuchar" o 
catchear el evento desde afuera, y con que?

Gracias!

[email protected]<mailto:[email protected]>

El 26 de abril de 2014, 9:41, francisco prieto 
<[email protected]<mailto:[email protected]>> escribió:
Ale,

Eso es simplemente un Trigger... y en Sql podes crearlo sin problemas... 
gracias a ellos hice mi propia aplicacion de sincronozación entre servidores...

Saludos,

Pancho
Córdoba

El 25 de abril de 2014, 12:25, Alejandro Paciotti 
<[email protected]<mailto:[email protected]>> escribió:
Hola muchachos:

Alguien conoce algún generador de eventos chatcheables en SQL SERVER?

¿Qué quiero decir?

En este  ejemplo muestran como Catch un Firebird 
events<http://www.king-foo.be/2011/07/catch-firebird-events-with-node-js/>, que 
básicamente lo hace a traves de un disparador luego de la inserción / borrado / 
update de un registro de una tabla.


SQL> SET TERM !! ; SQL> CREATE TRIGGER NEW_MONKEY_EVENT FOR monkeys CON> ACTIVE 
CON> AFTER INSERT CON> AS CON> BEGIN CON> POST_EVENT 'new_monkey_created'; CON> 
END!! SQL> SET TERM ; !!

Todavía no lo probé, porque no quiero enroscarme con FIREBIRD siendo que lo 
necesito primeramente en SQLSERVER.

Si a alguien leyó, vio, o escuchó algo... agradeceré comentarios...


Abrazos.


[email protected]<mailto:[email protected]>






Responder a