sql-server - 在 SQL Server 中创建和修改的序列号

标签 sql-server tsql triggers named-pipes

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

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

  • 添加一个 Created 列,默认值为 GETUTCDATE()
  • 添加一个 Modified 列,默认值为 GETUTCDATE()
  • 向表中添加一个 ON UPDATE 触发器,将 Modified 更新为 GETUTCDATE()(这种情况是否会发生 UPDATE 被执行?也就是说,它将 SET [Modified] = GETUTCDATE() 添加到 SQL 查询中,而不是随后单独更新?)
  • ON UPDATE 触发器将调用我的 Lucene 索引器来更新其索引(这可能必须是 xp_cmdshell 调用,但是有没有办法发送消息我听说我可以使用命名管道,但是如何在存储过程或触发器中使用命名管道?(搜索“SQL Server 命名管道”当然会得到不相关的结果)。

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

最佳答案

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

你的前三点并不奇怪。根据触发器处理的时间,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 已启动、正在运行并且可供您的应用程序使用。这是更复杂的方法,用于通知外部组件某些内容已发生更改。

关于sql-server - 在 SQL Server 中创建和修改的序列号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15935157/

相关文章:

javascript - 如何使用 Jquery 在前端使用新记录验证现有记录

c# - 在 WebMatrix 中由 C# 生成选择查询后,在带有空格的列上使用 row.ColumnName

unity-game-engine - Unity可以触发碰撞器激活OnCollisionEnter

postgresql - 将用户 ID 传递给 PostgreSQL 触发器

postgresql - Postgres 数据库中的触发器

sql-server - SQL Server - 上次访问行上的时间戳

sql-server - 如何通过VB.NET在sql server数据库中存储和检索图像

sql-server - SQL Server : how to remove leading 'A' s from base64 string

sql - 如何将查询的 CTE 输出保存到临时表或表变量中

sql - 是否可以在不使用游标的情况下对集合执行存储过程?