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]>
