2016-05-21 14 views
0

Ich versuche, ein Programm auszuführen, wenn anderes Programm einen Wert in eine Tabelle einfügt. Ich habe den After-Trigger auf die Tabelle angewendet, sagen wir "table1", wenn Programm A einen Wert in table1 einfügt, muss es das Programm B ausführen, das die Eingabe aus der gleichen table1 übernimmt.Nach Einfügen Trigger blockiert die gesamte Tabelle und Prozess

USE [capstone] 
GO 
SET ANSI_NULLS ON 
GO 
CREATE trigger [dbo].[api_trig] on [dbo].[search] 
after insert 
AS 
EXEC master..xp_CMDShell 'c:\Python34\python.exe c:\Python34\search_test.py' 

Dieses search_test-Programm nimmt die Eingabe aus der gleichen Tabelle, d. Suche. Aber sobald wir irgendeine Operation an dieser Tabelle einfügen oder ausführen, wird sie für eine Ewigkeit ausgeführt, da sie sich in einer Art Schleife befindet und einen Fehler wegen Zeitüberschreitung gibt.

dies zu stoppen und auf die Tabelle zuzugreifen wieder habe ich mit dieser Methode den Prozess zu töten https://social.msdn.microsoft.com/Forums/sqlserver/en-US/77fc7e09-ed14-481f-89d5-d5e143dab7bd/trying-to-delete-a-table-in-sql-server-management-studio-and-getting-a-strange-error?forum=sqldatabaseengine und Fehler zeigt mir, dass das Programm search_test den Prozess der Abfrageausführung blockiert. Bitte helfen Sie mir mit diesem Ich bin erschöpft, den Grund/Lösung des Fehlers TIA finden

+2

Was ist der Zweck dieses Entwurfs? Im Allgemeinen möchten Sie keine externen (oder irgendwelche) Programme von einem Trigger aufrufen. Wenn Programm B mit den neuen Datensätzen ausgeführt werden soll, lesen Sie in Service-Brokers nach, oder fügen Sie eine Zeitstempel- oder Identitätsspalte hinzu, und schreiben Sie eine geplante Aufgabe, die alle neuen Daten übernimmt und den Prozess für sie ausführt. Auf diese Weise "physisch" trennen Sie die Ausführung von der Einfügung selbst, aber haben Sie die beiden Befehle "logisch" zusammengekoppelt. –

Antwort

0

Der documentation says xp_cmdshell waits for the command to complete, den Prozess verstanden werden, die der Auslöser verursacht wird die Gelegenheit nicht haben zu lösen und Schlösser oder alle Transaktionen verpflichten, bis nach dem Programm läuft.

Ein schneller Hack wäre, dass xp_cmdshell ein Programm ausführt, das dann das Zielprogramm als separaten Prozess startet und dann beendet. Das würde es ermöglichen, dass xp_cmdshell zurückkehrt, der Trigger abgeschlossen wird und der Aufrufer Locks/Commit-Transaktionen freigibt.

Das Problem dabei ist jedoch, dass Ihr zweites Programm veraltete/fehlende Daten sehen kann, wenn der Trigger in einer Transaktion ausgeführt wird. Ihr Programm versucht möglicherweise, auf die Daten zuzugreifen, bevor die Transaktion erfolgreich ausgeführt wurde, oder das übergeordnete Element hat die Transaktion möglicherweise zurückgesetzt.

Sie sollten Ihre Logik neu entwerfen, damit das Programm, das das Einfügen durchführt, auch das zweite Programm startet, nachdem die Einfügetransaktion erfolgreich abgeschlossen wurde.

+0

Danke für die Idee, können Sie mir bitte sagen, wie man die Betriebssystembefehle vom Visual Studio 2012 ausführt. TIA – chaithanya

0

Das Aufrufen eines externen Programms von innerhalb eines Triggers ist wirklich eine schlechte Idee.

Das Verhalten, das Sie beobachten, ist nur eine von vielen möglichen Fallstricken.

Ich empfehle dringend, das Design zu überdenken und nur die notwendigen Vorgänge im AFTER INSERT-Trigger durchzuführen und einen anderen Mechanismus zum Auslösen des externen Prozesses zu verwenden.

Als ein rudimentäres Beispiel haben Sie den Trigger AFTER INSERT eine Zeile in eine Queue-Tabelle einfügen. Und einen separaten externen Daemon, der die Warteschlangentabelle nach neuen Zeilen abfragt.

Verwandte Themen