概述
上次弄了定时器,没有把方法记下来,结果今天又折腾了好几个小时,赶快把方法记下来,别再忘了。
表触发器就是当表内数据发生变化时,会自动触发代码。
创建方式为:
在manager studio找到要建触发器的表,在表下面的【触发器】文件夹上点右键,选择新建。如图:
打开后,sqlserver会将大量的代码为你生成,只需要关心自己要修改的部分。
也就是如下部分:
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>
ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>
AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
END
CREATE TRIGGER后面是自己定义的触发器名称,ON后面写表名称,AFTER后面填事件,已经给了选项:INSERT,DELETE,UPDATE。
在选择的事件发生后,需要触发的代码写在-- Insert statements for trigger here的下面。
写完后执行,触发器就生成了。
但是有个问题,通常我们不仅需要知道表数据发生了变化,我们还需要知道是哪些数据发生了变化。
触发器是利用了表数据发生变化时,自动生成的两个虚拟表,一个是inserted,一个是deleted,这两个虚拟表从其他地方是检索不到的,只有触发器能读到。
当数据发生变化时,如果是新插入数据,则该数据会在inserted里面暂时保存。而删除一条数据时,则会在deleted里面暂时保存。更新则等于先删除再插入,也就是deleted里面存更新前,inserted里面存更新后。这些数据会在触发器执行完成后消失。
这样我们需要的数据只要从inserted和deleted里面读取到就可以了。
完整的例子如下:
USE [db]
GO
/****** 对象: Trigger [tgr_aaa] 脚本日期: 07/15/2014 17:31:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE TRIGGER [tgr_aaa_delete]
ON [dbo].[aaa]
AFTER DELETE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
insert into bbb select 'D',CONVERT(CHAR(23), getdate(), 25),* from Deleted;
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[数据库名]。
最后
以上就是爱笑大象为你收集整理的sqlserver的表触发器和定时器的全部内容,希望文章能够帮你解决sqlserver的表触发器和定时器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复