宝哥软件园

如何编写MS SQL Server全表搜索的触发器语句?

编辑:宝哥软件园 来源:互联网 时间:2021-08-02

类型:音频处理大小:1M语言:中文评分:5.3标签:立即下载1。触发器按照数据操作语言进行分类,触发器分为DML触发器和DDL触发器,其中DDL触发器是SQL 2005以来新引入的。两者的具体区别如下:DML触发器响应DELETE、UPDATE、INSERT insert语句;DDL触发器用于响应任何修改数据库结构的语句,如CREATE、ALTER、DROP等。今天我们只讨论DML触发器。根据触发器的惩罚时间点,触发器可以分为“后触发器”和“替代触发器”。后触发器是在运行DELETE、UPDATE和INSERT语句后触发的SQL语句。替代触发器是指当发出DELETE、UPDATE或INSERT语句时,数据库不执行DELETE、UPDATE或INSERT语句,而是直接执行触发器中的SQL语句;从性能来看,替代触发器应该是优越的。(因为在任何情况下,后触发触发器都必须执行DELETE、UPDATE或INSERT,而是执行触发器中的SQL,而替代触发器直接执行SQL语句。).根据触发器的惩罚动作,触发器可以分为INSERT触发器和DELETE触发器。UPDATE触发器可以看作是INSERT触发器和DELETE触发器的合成。最近在做项目的时候,遇到了一个问题,就是在查找记录的时候,我输入了关键词来查找符合条件的记录。起初,每个字段都有一个关键字。后来觉得有些搜索会涉及6个或者更多的字段,这就很难找到了。我在网上搜索了很久,试图找到一种不用指定字段就能搜索整个表的方法。可惜一直没找到。最后,我找到了一个折中的办法:在每个表中定义一个字段,它存储所有其他字段的总和,然后在搜索时只需要匹配这个字段。

以下是实现思路:

因为每一条数据都需要插入到这个字段中,或者在插入和修改时进行更新,所以如果由代码来控制,就会非常麻烦:你必须始终记住数据是在哪里插入的,数据是在哪里修改的。最后想到一个触发器,在数据库中直接建立一个触发器。

触发语句如下:

在[dbo]上创建触发器[GECOAssets _ Trigger]。[GeCoasesets]for sert,updateAsupdateGeCoasesets set sum text=is null(SourceID,",)'' isnull(SourceName,",)'' isnull(StateNow,")'' isnull(BuyDepartment "," buy department)" ')'' is null(Factory),'' isnull(SourceType),')'' isnull(BackInfo,')

就这样,我以为就这样了。在最后的测试中,我发现只要插入一条数据或者表中某个字段的值发生变化,SumText的所有值都会被更新或者再次插入。当数据量较大或者数据频繁更新插入时,必然会对数据库造成很大的压力。

这时我突然想起了我在学习Orace的时候老师讲过的行级触发器,于是百度和谷歌搜索了很久,最后得出了MS SQLServer不支持行级触发器的结论。这对我是一个很大的打击。毕竟我觉得还不错的方法结束了,我极度沮丧。但是,不抛弃不放弃是我的座右铭,所以我继续百度和谷歌。最后我发现在插入和更新数据的时候,会有一个表叫做inserted,这个表会在你更新的时候存储数据。就这样,我灵光一现:那么这个记录的ID值肯定会存储在这个表中。只要能得到ID值,就必须指定更新某条记录,才能实现行级触发的效果。

在[dbo]上更改触发器[GeCoassets _ Trigger]。[GeCoassets]for sert,updateAsupdateGeCoassets setsumText=is null(sourceID)、“)”“is null(SourceName)、“”“is null(StateNow)、“””is null(buy department)、“”“is null(Factory)”、“”)”“is null(sourceType)、“”)”“is null(backInfo)”),其中ID in(从插入的中选择ID)

果然完美实现了行级触发的效果,不需要指定字段就可以搜索整个表(当然需要指定SumText字段)。感觉虽然不是完美的解决方案,但还是理想地达到了预期的效果。不知道大家有没有更好的解决方案,或者有没有第三方组件实现全表关键词搜索或者更好的多表联合关键词搜索。

更多资讯
游戏推荐
更多+