Sql Server 2005でDDLトリガーからDOSバッチファイルを非同期的に呼び出すにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/802398

質問

SqlMetalを実行してLinq2Sqlデータクラスを生成し、ビルドをトリガーするソース管理にチェックインするバッチファイルを作成しました。 / p>

xp_cmdshellを介してバッチファイルを実行すると、トリガーの外では次のように正常に動作します。

exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

ただし、トリガーとして実行すると、常にデータベースへの接続がタイムアウトし、すべてのDDLが失敗します。これが私のトリガーです:

CREATE TRIGGER [Trig_SqlMetal]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
exec master..xp_cmdshell 'd:\dev\db_triggers\generatedataclasses.bat', no_output

2つの点に関するアドバイスを探しています:

  1. この作業を行います。何らかの理由で、トリガー内にある場合は常に失敗し、トリガー内にない場合は失敗しません。どちらの場合もLocalSystemとして実行されるため、セキュリティに関連するようには見えません。
  2. これを非同期に実行して、SqlMetalのエラーとタイムアウトがDDL更新エラーを引き起こさないようにします。バッチファイルを別の" start cmd.exe / c otherbatch.bat"でラップしようとしましたが、SQLサーバーを介して実行すると、開始が無視されるようです(DOSで正常に動作します)。確かに、いくつかのテーブルとピックアップイベントを調べるポーリングプロセスを書くことはできますが、これをトリガーベースにして、複雑さを軽減することをお勧めします(または反対のことをします:))。
役に立ちましたか?

解決

作成中のテーブルに関するデータをクエリしようとするため、おそらくあなたのバッチはブロックされていますが、それらはまだトランザクション内でロックされています(トリガーはSQL ServerがDDL / DMLステートメントに対して開始する暗黙的なトランザクションの一部です)トリガーが終了した後にのみ完了します。   唯一の「ほぼ」」私が知っているSQL Server 2005以降での非同期実行の実用的な方法はService Brokerです。 「Service Broker Internal Activation」を探します。   実際には、適切にセットアップするのは少し複雑なので、プーリングオプションを選択することをお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top