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

时间:2013-04-10 19:53:08

标签: sql-server tsql triggers named-pipes

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

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

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

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

1 个答案:

答案 0 :(得分: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. 肯定还有其他我现在想不到的方法......
  6. 由于简单,我个人会选择第三点(job + xp_cmdshell),但这只是因为我对Lucene索引器的工作方式缺乏了解。

    编辑(另一种选择):

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