2013-04-10 103 views
4

我需要爲我的應用程序中的大多數實體添加序列號,因爲我將並行運行一個Lucene搜索索引。在SQL Server中創建和修改的序列號

而不是必須運行一個持續的投票過程,或通過手動我的申請,我想下面的運行我的索引:

  • 添加Created柱,以GETUTCDATE()的默認值。
  • 添加一個Modified列,其默認值爲GETUTCDATE()
  • 添加ON UPDATE觸發,更新ModifiedGETUTCDATE()表(可在此發生執行UPDATE?也就是說,它增加了SET [Modified] = GETUTCDATE()到SQL查詢,而不是更新它單獨算賬?)
  • ON UPDATE觸發器將打電話給我的Lucene索引器來更新它的索引(這可能是一個xp_cmdshell的調用,但是有沒有辦法向進程發送消息而不是啓動一個新的?我聽說我可以使用命名管道,但是你怎麼看使用Sproc或觸發器內的命名管道?(當然,搜索「SQL Server命名管道」給了我無關的結果)

這聽起來好嗎,我該如何解決小的子問題?

+0

我無法想象觸發'xp_cmdshell'的觸發器會特別出色。如果您使用的是SQL Server,那麼FT索引可能更合適?另外,你將如何處理在同一個陳述中更新的多個記錄? – 2013-04-10 19:55:46

+0

爲什麼不能在您的客戶端應用程序中調用Lucene索引器作爲客戶端過程的一部分,該過程調用執行更新的存儲過程? – 2013-04-10 20:02:48

+0

同意@CharlesBretana;我寫了一篇博客文章,如何用NHibernate做到這一點,如果你感興趣的話,它的工作效果很好...... http://aclassicgeek.blogspot.com/2013/03/full-text-searching-in-nhibernate.html – 2013-04-10 20:05:42

回答

1

據我所知,你必須在你現有的表格中引入兩列,並在'運行時'處理它們(在它們的東邊),並由外部組件使用它們。

你的第一個三點沒什麼不尋常的。根據觸發器處理的時間,SQL Server中有兩種類型的觸發器:INSTEAD OF觸發器(實際在插入前進行處理)和AFTER觸發器。但是,在INSTEAD OF觸發器中,您必須提供邏輯確實將數據插入到表中以及您需要的其他自定義處理。如果沒有必要,我通常會避免這種情況。

現在談談你的第四點 - 這很棘手,在SQL Server中有幾種方法可以解決這個問題,但所有這些方法都至少有點難看。基本上你必須執行外部進程或者發送消息給它。我真的沒有任何Lucene索引器的經驗,但我想這些方法之一(執行或發送消息)將適用。

所以,你可以做一個在下面,以直接或間接訪問外部組件,這意味着直接或通過某些代理模塊訪問的Lucene索引:

  1. 實施不安全CLR觸發;基本上你可以在觸發器內執行.NET代碼,從而可以訪問整體(請小心 - 不完全正確)。NET框架
  2. 執行不安全的CLR程序;與CLR觸發器的區別僅在於INSERT後不會將其稱爲imediatelly,但對於定期運行的某些數據庫作業您可以做得很好
  3. 使用xp_cmdshell;你已經知道這個,但你可以結合這個方法與作業包裝技術在最後一點
  4. 呼叫網絡服務;這種技術通常被標記爲實驗性的,你必須自己實現服務(如果Lucene索引器本身沒有安裝某些Web服務)
  5. 當然還有其他方法我現在無法想到......

由於簡單,我個人會選擇第三點(job + xp_cmdshell),但這只是因爲我對Lucene索引器的工作原理缺乏瞭解。

EDIT(另一種選擇):

使用查詢通知; SQL Server Service Broker允許外部應用程序連接並監視有趣的更改。你甚至有幾個選擇如何做到這一點(基本上是同步或異步),只有先決條件是你的服務博客已啓動,運行並可用於你的應用程序。這是更復雜的方法來通知外部組件某些事情已經改變。

+1

我最近發現了有關外部進程可以訂閱的SQL Server Broker服務和查詢通知。現在,我將擱置基於Lucene的搜索功能,因爲我的SELECT WHERE LIKE方法現在可以接受。但謝謝你的見解! – Dai 2013-06-11 23:41:46

+1

我明白了,這是另外一種可能性。但是,您必須知道對sql server broker進行故障排除是一個高級主題,因此您必須非常小心地完成作業,否則最終會停滯不前。不客氣。隨時點擊相應的感謝相關按鈕。 – OzrenTkalcecKrznaric 2013-06-12 04:37:10