2009-04-29 9 views
1

我創建了一個批處理文件來運行SqlMetal並生成Linq2Sql數據類,檢查觸發構建的源代碼控制等等......我希望這個腳本隨時可以在Sql Server 2005中進行DDL更改。如何讓Sql Server 2005從DDL觸發器異步調用DOS批處理文件?

通過運行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 

我要找的建議兩點:

  1. 使這項工作。出於某種原因,它在觸發器中總是失敗,而不是在觸發器中失敗。由於它在兩種情況下均作爲LocalSystem運行,因此似乎不是安全相關的。
  2. 使其發生異步,以便SqlMetal中的失敗和超時不會導致DDL更新失敗。我已經嘗試用另一個包裝批處理文件和「啓動cmd.exe/c otherbatch.bat」,但是當通過sql server運行它似乎忽略開始(從DOS正常工作)。我當然可以寫一個輪詢過程來查看一些表和拾取事件,但我更喜歡這是基於觸發器,使其不那麼複雜(或者我正在做相反的事情:))。

回答

3

你的批次可能被阻塞,因爲它試圖查詢創建對錶中的數據,但他們仍然被鎖定在一個事務中(觸發器是隱性交易SQL Server的一部分開始進行任何DDL/DML語句),只有在觸發器結束後纔會完成。 我知道SQL Server 2005或更高版本中唯一的「幾乎」實用的異步執行方式是Service Broker。尋找「Service Broker內部激活」。 實際上,設置正確的話有點複雜,所以你可以選擇使用pooling選項。

+0

優秀點 - 這當然是爲什麼他們被鎖定。任何想法爲什麼做一個「啓動cmd.exe/c bartc.bat」不工作得到異步? – TheSoftwareJedi 2009-04-29 13:51:26