我有ERP数据库“A”只有读取权限,我无法在表格上创建触发器。 A用于ERP系统(对我来说是Unknown Program)。我有另一个数据库“B”,这是我的应用程序私有这个应用程序在两个数据库上工作。我想立即将A的更改(对于任何插入/更新/删除)反映到B. 在c#中是否有任何功能可以像数据库中的触发器一样工作???
答案 0 :(得分:3)
您的解决方案很少,最好的解决方案取决于您必须支持哪种数据库。
如果您无法更改主数据库,并且这必须适用于所有类型的数据库,那么您只有一个选项:投票。
您不应该经常检查(因此忘记或多或少地立即执行)以节省网络流量,最好以不同的方式进行插入/更新/删除。您可以做什么取决于数据库的结构,例如:
插入: catch 一个插入内容,您只需检查最高行ID(假设您需要监控的内容有一个整数列用作键)。
更新:对于更新,您可以检查时间戳列(如果存在)
删除:这可能更难检测,第一次检查将是计数行数,如果它已更改且未发生插入,则您检测到删除,否则只减去插入次数。
如果您可以更改原始数据库,则可以使用数据库端的触发器减少网络流量(和复杂性),触发触发器时只需将记录放入内部 日志表< / strong>(只有几列:一列用于更改类型,一列用于受影响的表,一列用于受影响的记录)。
您只需要在此表上进行轮询(使用简单查询来检查行数是否增加)。由于操作(插入/更新/删除)存储在表中,您只需要打开该列即可执行正确的操作。
这有一个很大的缺点(在我看来):它将与您的应用程序相关的逻辑放在master数据库中。这可能很糟糕,但这取决于很多因素。
如果您的应用程序与Microsoft SQL Server绑定,则可以使用SqlDependency类来跟踪所做的更改。它仅适用于SS,但我认为可能有其他数据库的实现。缺点是这将始终特定于特定供应商(因此,如果数据库将更改主机...您也必须更改您的代码)。
来自MSDN:
SqlDependency旨在用于ASP.NET或中间层服务,其中存在相对较少数量的服务器,这些服务器具有对数据库的活动依赖性。它不是设计用于客户端应用程序,其中数百或数千台客户端计算机将为单个数据库服务器设置SqlDependency对象。
无论如何,如果你使用SQL Server,你还有其他选择,只需按照MSDN文档中的链接进行操作。
附录:如果您需要更精细的控制,可以查看TraceServer和Object:Altered(和朋友)课程。这更加依赖于Microsoft SQL Server,但它应该可以在更广泛的环境中使用(并且您可能会让您的应用程序不知道这些事情)。
答案 1 :(得分:0)
根据您的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解决方案
答案 2 :(得分:-2)
是有优秀的帖子请到这里查看..
如果这篇文章解决了您的问题,请标记为已回答..
谢谢