gpt4 book ai didi

sql - 如果插入或更新期间发生更改,如何将数据转发到外部系统?使用触发器?使用扩展存储过程还是 CLR 集成?

转载 作者:行者123 更新时间:2023-12-02 09:01:10 26 4
gpt4 key购买 nike

这是我们今天所采用的系统的基础知识。我们有一个 SQL 2005/2008 表定义为:

CREATE TABLE [dbo].[Profiles] (
[Firm] [char] (4) NULL ,
[Account] [char] (10) NOT NULL ,
[UndSym] [char] (24) NOT NULL ,
[Updated] [timestamp] NOT NULL ,
[Data] [image] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

数据字段是 BLOB。几乎所有的好东西都在这里。 BLOB 中的数据是压缩文本,看起来与 INI 文件非常相似,部分内有键值对。该INI文件的内部布局相当复杂,但有很多相互关联的数据。

我们还有另一个在设计、实现和目标受众方面完全不同的产品系列。但现在我们有一个上线的客户想要在数据库级别集成两个系统。

我的系统是MSSQL。另一个系统是MySQL。两者之间是我们自己设计的自定义中间件解决方案。我不想直接连接到 MySQL,他们也不想直接连接到我,出于各种合理的原因,这些原因超出了本次对话的范围,所以不用担心。

这个概念很简单。当我的 Profiles 表中的一行被触摸时,我需要遍历 BLOB 并查找一些数据。如果这些数据位已更改,我只需将这些数据位(而不是整个 BLOB)发送到中间件。我只能在有我感兴趣的更改时才执行此操作,而我能做到的唯一方法是处理两个 Blob(原始 Blob 和替换 Blob)。

我很快得出结论,使用T-SQL处理BLOB不是我想要走的路。我需要编写自定义代码,并且只能使用非托管 C++、托管 C++ 或 C# 来完成此操作。

这里有几个问题。

FIRST:我应该使用 INSTEAD OF 触发器来触发比较 BLOB 并发送有趣数据的代码吗?我知道关于触发器有一些极端的思想流派:有些人认为它们是纯粹的邪恶,另一些人则认为它们很棒。事实介于两者之间。如果我不使用触发器,如何触发处理 BLOB?

第二:我应该使用:

  1. 用非托管 C++ 编写的扩展存储过程?
  2. 用托管 C++ 或 C# 编写的 CLR 存储过程?
  3. 还有别的事吗?

...对 BLOB 进行实际处理并将数据发送到中间件?

最佳答案

不要在触发器中连接到外部进程,你会让自己陷入困惑。

在表上添加一个触发器,该触发器在插入/更新时使用 SEND将消息排队到本地服务。附上activated过程到服务队列。在 INSERT/UPDATE 提交后,排队的消息将激活该过程,您可以使消息出队并连接到中间件逻辑(例如通过 CLR)。这样您就可以将更新/插入事务与通知分离。这对于性能(在触发期间不再需要等待与中间件的连接完成)和正确性(INSERT/UPDATE 可以安全地回滚,无需在分布式事务中注册中间件和/或 MySQL)都有好处。 .

您可以在触发器或激活的过程中拥有“有趣的数据”检测逻辑。如果是 T-SQL 我会把它放在触发器中。如果你把它放在CLR过程中,我会把它放在激活的部分。

为了使您激活的程序能够进行外部连接,您很可能需要对连接到中间件的部分进行代码签名。请参阅此处 example of how to sign an activated procedure .

关于sql - 如果插入或更新期间发生更改,如何将数据转发到外部系统?使用触发器?使用扩展存储过程还是 CLR 集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1173125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com