【问题标题】:Is there a way to automatically insert rows that are updated on a linked server?有没有办法自动插入在链接服务器上更新的行?
【发布时间】:2021-01-28 03:38:24
【问题描述】:

本地服务器(SCADA System)使用SQL Server,链接服务器(ERP System)使用Oracle。

目前情况如下:

ERP 系统在其服务器上有一个表格,所有批次订单都会不断更新到该表格中。我可以访问该表,但我无法从 ERP 端操作/配置任何内容。任何配置/查询都必须在本地服务器上完成。

我尝试直接从 ERP 表中查询行,但由于某种原因导致了大约 30 秒的延迟。然后我创建了一个本地表并插入了 ERP 表中的所有行,以查看如果我从新的本地表中查询是否还会有延迟。那里没有延误。所以我想如果我可以像 ERP 表一样保持本地表的更新,我只需要使用本地表。

所以我的问题是,如果没有配置/操作 ERP 端的能力,有没有办法将 ERP 表上更新的所有新行插入到我们的本地表中?

【问题讨论】:

    标签: sql-server oracle


    【解决方案1】:

    通常,ERP 系统的 DBA 不喜欢更改主 ERP 模型架构,因为它会在应用程序升级期间创建更多要处理的对象 - 通常首选普通应用程序升级。

    他们有时会容忍在 ERP 表上创建触发器到另一个 Oracle 模式中的另一个表(您的设计)中,您可以随意操作。

    从该表中,您可以决定通过链接服务器设置标志随时将数据提取到 MSSQL 中,或者删除旧数据,以便在每次调用时最大限度地减少数据提取。通常在新的 Oracle 架构中调用存储过程来执行表更新或删除似乎效果更好,因为链接服务器在将数据拉到 MSSQL 端处理它们时非常慢。

    另一种选择(比使用linkedServer 快得多)是在Windows 服务器上使用Windows 服务或预定脚本(例如VBS)与Oracle 和MSSQL 对话以实现相同的目标。这可以直接在原始表上完成,也可以在新表上完成。 您可以根据近乎实时的要求计算出轮询间隔。

    【讨论】:

    • 问题是我无法操作Oracle 端。是否可以在 Oracle 端有更新后立即将数据拉到 MSSQL 端(就像触发器一样),而无需操作 Oracle 端?
    • 是的,当然可以,但是链接的服务器非常慢。您可能已经观察到,从链接服务器中的主模式加载非常慢,因为主 ERP 模式有太多的对象和数据。为了最大限度地提高性能,您可能需要将数据放在对象较少的地方。在任何情况下,这意味着一个 sql 代理作业(使用链接服务器)或另一个进程每 x 秒/分钟唤醒一次,将上次下载的内容与表中的内容进行比较并获取新数据。如果实时性不那么重要,也许 30 秒就没有那么重要了。
    • 从数据库的角度来看,我假设您指的是 MSSQL 端的视图。可以在 oracle 端完成物化视图,但您无法访问那里。 TableView 听起来像是在 ORACLE 和 MSSQL 之外的另一个编程接口中使用的东西。就像 VBA 中存在记录集一样。我想说尝试你想到的任何想法,因为这就是你如何在适当的细节上理解事物的方式。根据您对停车的某些决定,您可能能够提高速度。
    • 对于表同步,有时 ERP 系统使用更改跟踪工具(如 GoldenGate)来跟踪数据仓库中缓慢更改维度所需的更改。如果您的 ERP 系统有这样的工具,也许您可​​以使用它,但我怀疑它是否会按照您想要的方式更新。触发器是启用表同步的一种方法,但如果源无法基于事件(行插入/更改/删除)推送,则目标必须像您计划的那样轮询和拉动
    • 最后我在某处读到链接服务器的一些性能问题与权限问题有关,例如运行作业的 ID 在服务器上没有这些角色:sysadmin、db_owner、db_ddladmin。因此,看看拥有这些权利是否有所帮助。这些是许多 DBA 永远不会提供 ID 的高级角色,但会尝试查看速度是否有所提高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多