我有 ERP 数据库“A”只有读取权限,我无法在表上创建触发器。A 是为 ERP 系统(对我来说是未知程序)制作的。我有另一个数据库“B”,它是我的应用程序私有的,这个应用程序在两个数据库上都可以工作。我想立即将 A 的更改(对于任何插入/更新/删除)反映给 B。c# 中是否有任何功能可以与数据库中的触发器完全一样工作???
3 回答
您的解决方案很少,最好的解决方案取决于您必须支持哪种数据库。
通用解决方案,不允许更改 A 数据库
如果您无法更改master数据库并且这必须适用于每种数据库,那么您只有一个选择:polling。
您不应该经常检查(所以忘记或多或少地立即检查)以节省网络流量,最好以不同的方式进行插入/更新/删除。您可以做什么取决于数据库的结构,例如:
插入:要捕获插入,您可以简单地检查最高行 ID(假设您需要监控的内容有一个用作键的整数列)。
更新:对于更新,您可以检查时间戳列(如果存在)。
删除:这可能更难以检测,第一次检查将计算行数,如果它已更改并且没有发生插入,那么您检测到删除,否则只需减去插入数。
通用解决方案,允许更改 A 数据库
如果您可以更改原始数据库,则可以在数据库端使用触发器来减少网络流量(和复杂性),当触发触发器时,只需在内部 日志表中放置一条记录(只有几列:一列用于更改类型,一列用于受影响表,一张用于受影响的记录)。
您将只需要在此表上进行轮询(使用简单的查询来检查行数是否增加)。因为操作(插入/更新/删除)存储在表中,您只需打开该列即可执行正确的操作。
这有一个很大的缺点(在我看来):它将与您的应用程序相关的逻辑放在主数据库中。这可能很糟糕,但它取决于许多因素。
SQL Server/供应商特定
如果您的应用程序绑定到 Microsoft SQL Server,您可以使用SqlDependency类来跟踪所做的更改。它仅适用于 SS,但我认为可能有其他数据库的实现。缺点是这将始终特定于特定供应商(因此,如果数据库将更改主机...您也必须更改代码)。
来自 MSDN:
SqlDependency 设计用于 ASP.NET 或中间层服务,在这些服务中,相对少量的服务器对数据库具有活动的依赖项。它不是为在客户端应用程序中使用而设计的,在客户端应用程序中,成百上千的客户端计算机将为单个数据库服务器设置 SqlDependency 对象。
无论如何,如果您使用的是 SQL Server,您还有其他选择,只需按照 MSDN 文档中的链接。
附录:如果您需要更精细的控制,您可以检查TraceServer和Object:Altered(和朋友)类。这甚至更依赖于 Microsoft SQL Server,但它应该可以在更广泛的上下文中使用(并且您可能会让您的应用程序不知道这些事情)。
您可能会发现有用,具体取决于您的 DBMS:
更改数据捕获 (MS SQL)
http://msdn.microsoft.com/en-us/library/bb522489%28v=SQL.100%29.aspx
数据库更改通知 (Oracle)
http://docs.oracle.com/cd/B19306_01/appdev.102/b14251/adfns_dcn.htm http://www.oracle.com/technetwork/issue-archive/2006/06-mar/o26odpnet-093584.html
不幸的是,没有关于数据更改通知的 SQL92 解决方案
是的,这里有很棒的帖子,请检查一下..
如果这篇文章解决了您的问题,请标记为已回答..
谢谢