返回列表 发帖

[编程其他] SQLServer的表触发器和定时器

触发器就是当表内数据发生变化时,会自动触发代码。

创建方式为:

在manager studio找到要建触发器的表,在表下面的【触发器】文件夹上点右键,选择新建。如图:


打开后,sqlserver会将大量的代码为你生成,只需要关心自己要修改的部分。

也就是如下部分:
  1. CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>
  2.    ON  <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>
  3.    AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
  4. AS
  5. BEGIN

  6. -- SET NOCOUNT ON added to prevent extra result sets from

  7. -- interfering with SELECT statements.

  8. SET NOCOUNT ON;

  9.     -- Insert statements for trigger here

  10. END
复制代码

CREATE TRIGGER后面是自己定义的触发器名称,ON后面写表名称,AFTER后面填事件,已经给了选项:INSERT,DELETE,UPDATE。

在选择的事件发生后,需要触发的代码写在-- Insert statements for trigger here的下面。

写完后执行,触发器就生成了。
但是有个问题,通常我们不仅需要知道表数据发生了变化,我们还需要知道是哪些数据发生了变化。
触发器是利用了表数据发生变化时,自动生成的两个虚拟表,一个是inserted,一个是deleted,这两个虚拟表从其他地方是检索不到的,只有触发器能读到。

当数据发生变化时,如果是新插入数据,则该数据会在inserted里面暂时保存。而删除一条数据时,则会在deleted里面暂时保存。更新则等于先删除再插入,也就是deleted里面存更新前,inserted里面存更新后。这些数据会在触发器执行完成后消失。

这样我们需要的数据只要从inserted和deleted里面读取到就可以了。

完整的例子如下:
  1. USE [db]
  2. GO
  3. /****** 对象:  Trigger [tgr_aaa]    脚本日期: 07/15/2014 17:31:48 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. -- =============================================
  9. -- Author:
  10. <Author,,Name>
  11. -- Create date: <Create Date,,>
  12. -- Description:
  13. <Description,,>
  14. -- =============================================
  15. CREATE TRIGGER [tgr_aaa_delete]
  16.    ON [dbo].[aaa]
  17.    AFTER DELETE
  18. AS
  19. BEGIN

  20. -- SET NOCOUNT ON added to prevent extra result sets from

  21. -- interfering with SELECT statements.

  22. SET NOCOUNT ON;

  23.     -- Insert statements for trigger here

  24. insert into bbb select 'D',CONVERT(CHAR(23), getdate(), 25),* from Deleted;

  25. END
复制代码

这就是当aaa的某条数据被删除时,触发器自动执行后面代码,将删除的数据从虚拟表中取出,插入bbb表。
触发器可以做很多事情,比如在数据变化时进行统计,再比如对相关数据的自动修改,而且是数据库中自动执行,可以省去很多事儿。

但是对于维护却是噩梦,比如java开发人员会觉得非常的困惑,因为他们在java代码中找不到发生预想结果的代码。

所以触发器的使用一定要慎重,我们这次项目最终决定只用来记录操作日志。

再来说说定时器

这次项目有些数据想在半夜人少的时候批量更新,为了不影响晚上睡觉,决定使用定时器。

网上很多的例子,基本上都会使用SQL Server Agent,不过我最开始真的没找到这东西,因为中文版中叫Sql Server 代理。

后来发现没有那么复杂,那就是使用【管理】下的【维护计划】。如下图:

然后在【维护计划】上点右键,选择【新建维护计划】,画面内容如下:



设定执行间隔和执行时间很简单,没什么可说的,设定好频率和执行的时间点即可,画面显示内容如下:



重点在设定执行内容,可以设定的执行内容在左下角的工具箱,如下图:


这里已经给了很多的任务,只需要将要做的任务拖动到右侧就可以了。

这里重点说的是【执行T-SQL】。它的灵活性非常高,可以执行多行sql语句,甚至可以执行存储过程,而你需要的就是把它拖到任务区域内,并且双击打开,写入需要执行的sql语句。


之后就等待到时间执行了。

这里需要说明的几点是:

1,其实维护计划也用到了sql server代理,只是将需要的设定自动设置好了,所以sql server代理也是要开启的,开启方式是在【sql server代理】上点右键,选择【启动】即可。


2,需要特别注意的是,写入T-SQL的时候,没有任何的选项,所以默认的是sql的master库,如果你使用的是不master就必须要在T-SQL中设定,否则会因为找不到表而执行不成功。设定方法为:在第一行写上USE[数据库名]。
---------------------
作者:待业方知努力
来源:CSDN
原文:https://blog.csdn.net/weightman2008/article/details/37819511
版权声明:本文为博主原创文章,转载请附上博文链接!
欢迎光临:逐梦论坛

返回列表

Powered by Discuz! 7.2   论坛QQ群:逐梦论坛群

© 2001-2021 Comsenz Inc. 本站服务器由0634云主机提供 鲁公网安备 37120302000001号