2012-03-15 159 views
0

我們正在使用SQL Server CE數據庫。我知道使用SQL Server CE數據庫的觸發器的類型有限制。例如,SQL Server CE表上的觸發器不能調用存儲過程,但可以更新/插入到另一個表中。爲什麼SQL Server CE不允許觸發此觸發器?

我們所追求的是在表格中存在修改(插入/更新/刪除)時發送電子郵件通知的觸發器。我們知道,如果我們直接在表上設置觸發器來發送電子郵件(EXEC msdb.dbo.sp_send_dbmail),那麼當您嘗試推送到表時,您將遇到錯誤。顯然,SQL Server CE不支持觸發存儲過程的跟蹤表上的觸發器。

爲了解決這個問題,我們在表上設置一個觸發器,將行插入到另一個表(_table_changes)中,該表不作爲CE同步的一部分進行跟蹤。在這個表格(_table_changes)中,我們設置了一個觸發器來發送電子郵件通知,我們希望能夠解決跟蹤的CE表格觸發器無法觸發存儲過程以及電子郵件的問題。

但是,即使該表不是推/拉同步的一部分,但如果我們啓用電子郵件觸發器,同步將無法工作。爲什麼是這樣? CE如何才能意識到一個不屬於同步的表有觸發器,觸發存儲過程發送電子郵件?

回答

2

我認爲這個表是否作爲CE同步的一部分被跟蹤是不重要的。

觸發器沒有在SQL Server精簡版4.0

Differences Between SQL Server Compact and SQL Server

編輯

支撐。根據this MSDN article RDA在SQL Server CE允許對RDA從提取數據SQL Server表觸發器。它還規定,對於跟蹤的表,可以在將更改推送回SQL Server時執行SQL Server觸發器。

觸發器。 SQL Server Compact Edition不支持觸發器。 但是,觸發器可以駐留在RDA從中抽取 數據的SQL Server表上。對於跟蹤表,當更改被推回到SQL Server時,可以執行SQL Server觸發器 。您可能必須在觸發邏輯中指定 SET NOCOUNT ON。這表示不返回 受影響的行數,因爲「無行影響」響應 會導致RDA Push方法發生錯誤。

我會檢查你在觸發器中使用的是SET NOCOUNT ON

說了這麼多,如上所述,不支持在SQL Server CE中使用觸發器。

也許更好的解決方案是創建一個需要發送的郵件隊列表。將這些數據從SQL CE推送回SQL Server時,您可以安排SQL代理作業來檢查隊列表併發送郵件。

+0

儘管更新表的觸發器工作正常,但不影響同步。 如果我們直接在SSMS中編輯表格,而不是在RDA模式下編輯表格,則電子郵件觸發器可以正常工作。這就是爲什麼我很困惑,因爲觸發器不被支持,但仍然在某些情況下工作,甚至直接在SSMS中工作,但不是當我們的應用程序同步時。 – kafka 2012-03-15 10:33:49

+0

@kafka:RDA從桌面上觸發的數據是從哪裏觸發的? SQL CE不支持觸發器,所以我有點困惑。 – codingbadger 2012-03-15 10:44:29

+0

這是事實:我們在RDA推/拉(讓我們稱之爲用戶)的桌子上有觸發器。他們只執行插入/更新/刪除,並且我們得到用戶的觸發器插入另一個表(_table_changes)。儘管RDA顯然不支持觸發器,並且用戶是被跟蹤的表,但這種方式絕對沒問題。 然後,我們在_table_changes上觸發一個在RDA中未跟蹤的觸發器,用於在更新時通過用戶表上的觸發器發送電子郵件。混淆寫作,希望它是有道理的。如果我們手動編輯,這個觸發器在SSMS中工作正常,但是阻止RDA推送給用戶。 – kafka 2012-03-15 11:13:03