2016-05-21 7 views
0

他のプログラムが値をテーブルに挿入するときにプログラムを実行しようとしています。プログラムAがtable1に値を挿入するときに、同じtable1から入力を受け取るプログラムBを実行する必要がある場合、テーブルのAfterトリガーを適用しました。挿入トリガーがテーブルとプロセス全体をブロックした後

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' 

この検索プログラムは同じテーブルから入力を受け取ります。サーチ。しかし、いったん挿入または実行すると、そのテーブルは何らかのループに陥り、タイムアウトエラーが発生するため、そのテーブルで何年も実行されます。私はこの方法 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 とエラーでプロセスを強制終了する必要があり、これを停止し、再びテーブルにアクセスするために

は、プログラムsearch_testは、クエリの実行のプロセスをブロックしていることを私に示しています。 私はトリガーがあなたのプログラムが終了するまですべてのトランザクションを解放し、ロックやコミットする機会がありません原因となったプロセスを意味し、エラー の理由/ソリューションTIA

+2

このデザインの目的は何ですか?一般的に、外部(または任意の)プログラムをトリガから呼び出すことは望ましくありません。全体のポイントは、新しいレコードを持つプログラムBの実行を持つことがある場合は、サービス・ブローカーをよく読んで、またはタイムスタンプまたはID列を追加し、新しいデータのすべてを取り、それらにプロセスを実行するスケジュールされたタスクを作成します。この方法では、インサート自体から実行を「物理的に」切り離しますが、2つのコマンドを論理的に結合させます。 –

答えて

0

documentation says xp_cmdshell waits for the command to completeを見つける使い果たしていますこれで私を助けてください走る

xp_cmdshellでプログラムを実行すると、ターゲットプログラムが別のプロセスとして起動され、終了します。これにより、xp_cmdshellが返され、トリガーが完了し、呼び出し元がロック/コミットトランザクションを解放できるようになります。

しかし、トランザクションでトランザクションが実行されると、2番目のプログラムで失効/欠損データが表示されることがあります。プログラムは、トランザクションが正常にコミットされる前にデータにアクセスしたり、親がトランザクションをロールバックしたりする可能性があります。

ロジックを再設計して、挿入を実行するプログラムが挿入トランザクションを正常に完了した後に2番目のプログラムを起動するようにする必要があります。

+0

ビジュアルスタジオ2012からオペレーティングシステムコマンドを実行する方法を教えていただけますか?TIA – chaithanya

0

トリガーの内部から外部プログラムを呼び出すことは、本当に悪い考えです。

この現象は、潜在的な落とし穴の1つに過ぎません。

デザインを再考し、AFTER INSERTトリガーで必要な操作だけを実行し、外部プロセスをトリガーするために別のメカニズムを使用することを強くお勧めします。初歩的な例として

、AFTERのINSERTトリガがキュー・テーブルに行を挿入有します。また、別の外部デーモンがキュー表をポーリングして新しい行を作成するようにしてください。

関連する問題