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

Posted

技术标签:

【中文标题】序列号,在 SQL Server 中创建和修改【英文标题】:Serial numbers, created and modified in SQL Server 【发布时间】:2013-04-10 19:53:07 【问题描述】:

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

与其运行一个持续的轮询过程,或者通过我的应用程序手动运行我的索引器,我正在考虑以下几点:

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

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

【问题讨论】:

我无法想象对xp_cmdshell 的触发调用会特别高效。如果您使用的是 SQL Server,也许 FT 索引会更合适?另外,您将如何处理在同一语句中更新的多条记录? 为什么不能在客户端应用程序中调用 Lucene 索引器作为调用进行更新的存储过程的客户端进程的一部分? 同意@CharlesBretana;我写了一篇博客文章如何用 NHibernate 做到这一点,如果你有兴趣,它会很好地工作......aclassicgeek.blogspot.com/2013/03/… @CharlesBretana 有多个应用程序接触数据库,其中一些在防火墙之外工作,阻止它们直接与 Lucene 索引器通信 - 这就是我希望 SQL Server 这样做的原因.此外,这还意味着当有新数据可用时,总是会通知索引器。 【参考方案1】:

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

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

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

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

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

由于简单,我个人会选择第三点(job+xp_cmdshell),但这只是因为我对 Lucene 索引器的工作原理一无所知。

编辑(另一种选择):

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

【讨论】:

我最近发现了外部进程可以订阅的 SQL Server Broker 服务和查询通知。现在我将搁置基于 Lucene 的搜索功能,因为我的 SELECT WHERE LIKE 方法目前可以​​接受。但感谢您的洞察力! 我明白了,这是另一种可能性。但是,您必须知道 sql server broker 故障排除是一个高级主题,因此您必须非常仔细地做功课,否则最终会导致生产卡住。不客气。随时单击适当的与感谢相关的按钮。

以上是关于序列号,在 SQL Server 中创建和修改的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中创建和查询链接数据库服务器?

如何在 SQL Server 中创建和查询链接数据库服务器?

在 SQL Server 中创建和管理全局 Procs 和 UDF 的最佳方法是啥?

如何在 SQL Server 2005 中创建和维护最近 7 天的分区视图和存档记录?

是否可以在 SQL Server 中创建一个可以处理序列的函数?

使用 SQL 在现有表中创建和填充主键列