Sql Server 2005でDDLトリガーからDOSバッチファイルを非同期的に呼び出すにはどうすればよいですか?
-
03-07-2019 - |
質問
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つの点に関するアドバイスを探しています:
- この作業を行います。何らかの理由で、トリガー内にある場合は常に失敗し、トリガー内にない場合は失敗しません。どちらの場合もLocalSystemとして実行されるため、セキュリティに関連するようには見えません。
- これを非同期に実行して、SqlMetalのエラーとタイムアウトがDDL更新エラーを引き起こさないようにします。バッチファイルを別の" start cmd.exe / c otherbatch.bat"でラップしようとしましたが、SQLサーバーを介して実行すると、開始が無視されるようです(DOSで正常に動作します)。確かに、いくつかのテーブルとピックアップイベントを調べるポーリングプロセスを書くことはできますが、これをトリガーベースにして、複雑さを軽減することをお勧めします(または反対のことをします:))。
解決
作成中のテーブルに関するデータをクエリしようとするため、おそらくあなたのバッチはブロックされていますが、それらはまだトランザクション内でロックされています(トリガーはSQL ServerがDDL / DMLステートメントに対して開始する暗黙的なトランザクションの一部です)トリガーが終了した後にのみ完了します。 唯一の「ほぼ」」私が知っているSQL Server 2005以降での非同期実行の実用的な方法はService Brokerです。 「Service Broker Internal Activation」を探します。 実際には、適切にセットアップするのは少し複雑なので、プーリングオプションを選択することをお勧めします。
所属していません StackOverflow