5

我需要为我的应用程序中的大多数实体添加序列号,因为我将并行运行 Lucene 搜索索引。

而不是必须运行正在进行的轮询过程,或者通过我的应用程序手动运行我的索引器,我正在考虑以下内容:

  • 添加Created默认值为 的列GETUTCDATE()
  • 添加Modified默认值为 的列GETUTCDATE()
  • 向更新到ON UPDATE的表添加触发器(这会执行 UPDATE 时发生吗?即它添加到 SQL 查询而不是之后单独更新它?)ModifiedGETUTCDATE()SET [Modified] = GETUTCDATE()
  • 触发器将ON UPDATE调用我的 Lucene 索引器来更新它的索引(这可能是一个xp_cmdshell调用,但是有没有办法向进程发送消息而不是开始一个新的?我听说我可以使用命名管道,但是如何您是否使用 Sproc 或触发器中的命名管道?(当然,搜索“SQL Server 命名管道”会给我不相关的结果)。

这听起来不错,我该如何解决小问题?

4

1 回答 1

1

据我了解,您必须在现有表中引入两列,并让它们在“运行时”中处理(在其中一个东部)并由外部组件使用。

你的前三点并不稀奇。SQL Server 中的触发器根据触发器被处理的时间有两种类型:INSTEAD OF 触发器(实际上是在插入发生之前处理)和 AFTER 触发器。但是,在 INSTEAD OF 触发器中,您必须提供将数据真正插入表中的逻辑,以及您需要的其他自定义处理。如果不是真的必要,我通常会避免这种情况。

现在关于你的第四点 - 这很棘手,在 SQL Server 中有几种方法可以解决这个问题,但它们都至少有点难看。基本上,您必须执行外部进程或向其发送消息。我真的对 Lucene 索引器没有任何经验,但我想其中一种方法(执行或发送消息)会适用。

因此,您可以执行以下操作之一来直接或间接访问外部组件,即直接或通过某些代理模块访问 Lucene 索引器:

  1. 实现不安全的 CLR 触发器;基本上,您在触发器内执行 .NET 代码,从而可以访问整个(小心 - 不完全正确).NET 框架
  2. 执行不安全的 CLR 程序;与 CLR 触发器的唯一区别是您不会在 INSERT 之后立即调用它,但是您可以处理一些定期运行的数据库作业
  3. 使用 xp_cmdshell;您已经知道这一点,但您可以在最后一点将这种方法与工作包装技术结合起来
  4. 调用网络服务;这种技术通常被标记为实验性的,你必须自己实现服务(如果 Lucene 索引器没有自己安装一些 Web 服务)
  5. 肯定还有其他我现在想不到的方法...

由于简单,我个人会选择第三点(job+xp_cmdshell),但这只是因为我对 Lucene 索引器的工作原理缺乏任何了解。

编辑(另一种选择):

使用查询通知;SQL Server Service Broker 允许外部应用程序连接和监视有趣的更改。您甚至有多种选择如何做到这一点(基本上是同步的或异步的),唯一的前提是您的 Service Borker 已启动、运行并可供您的应用程序使用。这是一种更复杂的方法来通知外部组件发生了一些变化。

于 2013-06-11T19:43:12.050 回答