知方可补不足~sqlserver中触发器的使用

php中文网
发布: 2016-06-07 15:18:50
原创
1061人浏览过

回到目录 触发器 在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了,可对于数据库本身来说,这东西还是要说说的,尤其是一些特殊场合,

回到目录

触发器在过去的10年中,即存储过程和ado.net称霸江湖期间是那么的重要,而现在,trigger显得不是那么必要的,我们很少将复杂的业务写在SQL里,当然也会没有机会写到trigger里了,可对于数据库本身来说,这东西还是要说说的,尤其是一些特殊场合,看看下面的触发器使用场合:

知方可补不足~sqlserver中触发器的使用

这种结构很有意思,在SQLSERVER中实现两个数据库实时同步的方法有很多,比较简单的是“发布与订阅”,但说实话,这东西是有风显的,只要一个服务重新启动,它的同步数据就被删除了,即,后台数据库数据被删除,需要重新进行同步,感觉挺危险的,今天主要说的是一种传统的方法实现某些表数据的同步,即使用触发器实现数据的同步。

我们以Category表为例,前台数据库名为[background],后台数据库名为[background_copy],当category表有数据插入时,[background_copy]表的数据自动实现插入,看一下代码部分吧:

<span>USE</span> <span>[</span><span>background</span><span>]</span>
<span>GO</span>
<span>/*</span><span>***** Object:  Trigger [dbo].[Trigger_Categoryinsert]    Script Date: 09/10/2013 15:31:41 *****</span><span>*/</span>
<span>SET</span> ANSI_NULLS <span>ON</span>
<span>GO</span>
<span>SET</span> QUOTED_IDENTIFIER <span>ON</span>
<span>GO</span>
<span>ALTER</span> <span>TRIGGER</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Trigger_Categoryinsert</span><span>]</span> <span>ON</span> <span>[</span><span>background</span><span>]</span>.<span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Category</span><span>]</span><span>
    AFTER </span><span>INSERT</span>
<span>AS</span>
    <span>SET</span> <span>IDENTITY_INSERT</span> background_copy.<span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Category</span><span>]</span> <span>ON</span> 
    <span>INSERT</span>  <span>INTO</span><span> background_copy.dbo.category
            ( </span><span>[</span><span>ID</span><span>]</span><span> ,
              </span><span>[</span><span>ParentID</span><span>]</span><span> ,
              </span><span>[</span><span>Level</span><span>]</span><span> ,
              </span><span>[</span><span>Name</span><span>]</span><span> ,
              </span><span>[</span><span>IsParent</span><span>]</span><span> ,
              </span><span>[</span><span>CreateDate</span><span>]</span><span> ,
              </span><span>[</span><span>Sortable</span><span>]</span><span>
            )
            </span><span>SELECT</span>  <span>[</span><span>ID</span><span>]</span><span> ,
                    </span><span>[</span><span>ParentID</span><span>]</span><span> ,
                    </span><span>[</span><span>Level</span><span>]</span><span> ,
                    </span><span>[</span><span>Name</span><span>]</span><span> ,
                    </span><span>[</span><span>IsParent</span><span>]</span><span> ,
                    </span><span>[</span><span>CreateDate</span><span>]</span><span> ,
                    </span><span>[</span><span>Sortable</span><span>]</span>
            <span>FROM</span><span>    INSERTED
    </span><span>SET</span> <span>IDENTITY_INSERT</span> background_copy.<span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Category</span><span>]</span> <span>OFF</span>
登录后复制

我们可以看到,代码中使用SET IDENTITY_INSERT TableName ON/OFF命令,即,你的数据表主键是自增的,在同步时,需要去掉后台表的自增特性,这样才可以与前台的自增主键保持一致。

下面再看一下触发器的更新,使用场合介绍:当category表的name字段有更新后,自动同步到background_copy.[dbo].[Category] 表的name字段

 

WiseHome家政预约小程序
WiseHome家政预约小程序

家政服务平台系统包含家用电器安装清洗、搬家、家电维修、管道疏通、月嫂保姆、育儿陪护、上门开锁等多种服务项目,用户可以直接通过家政小程序咨询,在线预约服务类型,同时还设置有知识科普,给用户科普一些清洁保养小技巧,让用户能够足不出户就可以直接预约服务,方便又快捷。本项目使用微信小程序平台进行开发。使用腾讯专门的小程序云开发技术,云资源包含云函数,数据库,带宽,存储空间,定时器等,资源配额价格低廉,无需

WiseHome家政预约小程序 0
查看详情 WiseHome家政预约小程序

<span>USE</span> <span>[</span><span>background</span><span>]</span>
<span>GO</span>
<span>/*</span><span>***** Object:  Trigger [dbo].[Trigger_CategoryUpdate]    Script Date: 09/10/2013 16:06:31 *****</span><span>*/</span>
<span>SET</span> ANSI_NULLS <span>ON</span>
<span>GO</span>
<span>SET</span> QUOTED_IDENTIFIER <span>ON</span>
<span>GO</span>
<span>ALTER</span> <span>TRIGGER</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Trigger_CategoryUpdate</span><span>]</span> <span>ON</span> <span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Category</span><span>]</span><span>
    AFTER </span><span>UPDATE</span>
<span>AS</span>
    <span>IF</span> <span>UPDATE</span><span>(Name) 
        </span><span>BEGIN</span>
            <span>UPDATE</span>  <span>[</span><span>background_copy</span><span>]</span>.<span>[</span><span>dbo</span><span>]</span>.<span>[</span><span>Category</span><span>]</span>
            <span>SET</span>     <span>[</span><span>Name</span><span>]</span> <span>=</span> ( <span>SELECT</span><span>   name
                               </span><span>FROM</span><span>     INSERTED
                             )
            </span><span>WHERE</span>   ID <span>=</span> ( <span>SELECT</span><span>   id
                           </span><span>FROM</span><span>     INSERTED
                         )
        </span><span>END</span>
    
登录后复制

 再来看一个更新表所有字段的,事实上就是把原来的记录删除,把新修改的记录插入就可以了,要求你注意的是自增主键的开关问题,看代码:

<span>USE</span> <span>[</span><span>BACKGROUND_COPY</span><span>]</span>
<span>GO</span>
<span>/*</span><span>***** OBJECT:  TRIGGER [DBO].[TRIGGER_CATEGORYUPDATE]    SCRIPT DATE: 09/13/2013 18:01:00 *****</span><span>*/</span>
<span>SET</span> ANSI_NULLS <span>ON</span>
<span>GO</span>
<span>SET</span> QUOTED_IDENTIFIER <span>ON</span>
<span>GO</span>
<span>ALTER</span> <span>TRIGGER</span> <span>[</span><span>DBO</span><span>]</span>.<span>[</span><span>TRIGGER_CATEGORYUPDATE</span><span>]</span> <span>ON</span> <span>[</span><span>DBO</span><span>]</span>.<span>[</span><span>CATEGORY</span><span>]</span><span>
    AFTER </span><span>UPDATE</span>
<span>AS</span>
    <span>DELETE</span><span>  BACKGROUND_COPY2.DBO.CATEGORY
    </span><span>WHERE</span>   ID <span>=</span> ( <span>SELECT</span><span>   ID
                   </span><span>FROM</span><span>     INSERTED
                 ) 

    </span><span>SET</span> <span>IDENTITY_INSERT</span> BACKGROUND_COPY2.DBO.CATEGORY <span>ON</span>
    <span>INSERT</span>  <span>INTO</span><span> BACKGROUND_COPY2.DBO.CATEGORY
            ( ID ,
              PARENTID ,
              </span><span>LEVEL</span><span> ,
              NAME ,
              ISPARENT ,
              CREATEDATE ,
              SORTABLE
            )
            </span><span>SELECT</span>  <span>*</span>
            <span>FROM</span><span>    INSERTED
    </span><span>SET</span> <span>IDENTITY_INSERT</span>  BACKGROUND_COPY2.DBO.CATEGORY <span>OFF</span>
登录后复制

 

 看一下删除功能的触发器

<span>USE</span> <span>[</span><span>BACKGROUND_COPY</span><span>]</span>
<span>GO</span>
<span>/*</span><span>***** OBJECT:  TRIGGER [DBO].[TRIGGER_CATEGORYDELETE]    SCRIPT DATE: 09/13/2013 17:58:27 *****</span><span>*/</span>
<span>SET</span> ANSI_NULLS <span>ON</span>
<span>GO</span>
<span>SET</span> QUOTED_IDENTIFIER <span>ON</span>
<span>GO</span>
<span>ALTER</span> <span>TRIGGER</span> <span>[</span><span>DBO</span><span>]</span>.<span>[</span><span>TRIGGER_CATEGORYDELETE</span><span>]</span> <span>ON</span> <span>[</span><span>DBO</span><span>]</span>.<span>[</span><span>CATEGORY</span><span>]</span><span>
    AFTER </span><span>DELETE</span>
<span>AS</span>
    <span>DELETE</span><span>  BACKGROUND_COPY2.DBO.CATEGORY
    </span><span>WHERE</span>   ID <span>=</span> ( <span>SELECT</span><span>   ID
                   </span><span>FROM</span><span>     DELETED
                 ) 
                 </span>
登录后复制

 

OK,现在我们的category表就可以实现自动同步了,呵呵。

回到目录

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号