为什么SQL Server CE不允许触发此触发器?

时间:2012-03-15 10:15:57

标签: sql 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怎么能意识到一个表不是同步的一部分,它有一个触发器,它触发存储过程来发送电子邮件?

1 个答案:

答案 0 :(得分:2)

我认为将表作为CE同步的一部分进行跟踪并不重要。

SQL Server Compact Edition 4.0不支持触发器

Differences Between SQL Server Compact and SQL Server

修改

根据this MSDN article SQL Server中的RDA允许RDA从中提取数据的SQL Server表上的触发器。它还指出,对于跟踪的表,可以在将更改推送回SQL Server时执行SQL Server触发器。

  

触发器。 SQL Server Compact Edition不支持触发器。   但是,触发器可以驻留在RDA提取的SQL Server表上   来自的数据。对于跟踪表,可以执行SQL Server触发器   何时将更改推送回SQL Server。您可能需要指定   在触发逻辑中设置NOCOUNT ON。这表明不返回   受影响的行数,因为“没有行影响”的响应   导致RDA Push方法出错。

我会检查您是否在触发器中使用SET NOCOUNT ON

说完这一切之后,如上所述,不支持在SQL Server CE中使用触发器。

也许更好的解决方案是创建一个需要发送的电子邮件队列表。当此数据从SQL CE推送回SQL Server时,您可以安排SQL代理作业来检查队列表并以这种方式发送邮件。