Mysql数据库内的触发器能够主动发送通知到服务器吗?
触发器仅是数据库内部的应用,与外部程序无关。所以理论上也不存在什么通知外部程序。
有些数据库产品,在触发器内可以调用一些外部命令,但MYSQL目前的标准版本中没有这种功能。
关键看你想实现什么样的功能。
右键点“我的电脑”选“管理”进入系统管理界面。在左边框里选“服务和应用程序”下的“服务”在其中找到TaskScheduler服务(计划任务服务)把启动类型设置为“禁用”同样在服务中关闭“事件查看器”服务。选中“EventLog”服务改启动类型为“禁用”就可以保证电脑不记录你的开关机记录
1 基本概念
触发器是特殊的存储过程,基于一个表创建,主要作用就是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。
当触发器所保护的数据发生变化(update,insert,delete)后,自动运行以保证数据的完整性和正确性。通俗的说:通过一个动作(update,insert,delete)调用一个存储过程(触发器)。
2 类型
(1)DML触发器
在数据库中发生数据操作语言(DML)事件时将启用。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 T-SQL 语句。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。
(2)DDL 触发器
SQL Server 2005 的新增功能。当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。但与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发,相反,它们会为响应多种数据定义语言(DDL)语句而激发。这些语句主要是以CREATE、ALTER和DROP开头的语句。DDL触发器可用于管理任务,例如审核和控制数据库操作。
创建DML触发器
1 使用存储过程模板创建存储过程
在对象资源管理器窗口中,展开“数据库”节点,再展开所选择的具体数据库节点,再展开“表”节点,右击要创建触发器的“表”,选择“新建触发器”命令,如图所示:
在右侧查询编辑器中出现触发器设计模板,用户可以在此基础上编辑触发器,单击“执行”按钮,即可创建该触发器。
2 使用T-SQL语句创建表
CREATE TRIGGER 触发器
ON 表名
FOR[update,insert,delete ]
AS SQL语句
例9-6:创建基于表reader ,DELETE操作的触发器。
USE Library
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name='reader_d' AND type='TR')
DROP TRIGGER reader_d --如果已经存在触发器reader_d则删除
GO
CREATE TRIGGER reader_d --创建触发器
ON reader --基于表
FOR DELETE --删除事件
AS
PRINT '数据被删除!' --执行显示输出
GO
试试吧!
应用:
USE Library
GO
DELETE reader
where Rname='aaa'
执行结果:
数据被删除!
(所影响的行数为 1 行)
例9-7:在表borrow中添加借阅信息记录时,得到该书的应还日期。
说明:在表borrow中增加一个应还日期SReturnDate。
USE Library
IF EXISTS (SELECT name FROM sysobjects
WHERE name ='T_return_date' AND type='TR')
DROP TRIGGER T_return_date
GO
CREATE TRIGGER T_return_date --创建触发器
ON Borrow --基于表borrow
After INSERT --插入操作
AS
--查询插入记录INSERTED中读者的类型
DECLARE @type int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(SELECT RID FROM inserted)
SET @tsbh=(SELECT BID FROM inserted)
SELECT @type= TypeID
FROM reader
WHERE RID=(SELECT RID FROM inserted)--副本
/把Borrow表中的应还日期改为
当前日期加上各类读者的借阅期限/
UPDATE Borrow SET SReturnDate=getdate()+
CASE
WHEN @type=1 THEN 90
WHEN @type=2 THEN 60
WHEN @type=3 THEN 30
END
WHERE RID=@dzbh and BID=@tsbh
应用:
USE Library
INSERT INTO borrow(RID,BID) values('2000186010','TP85-08')
查看记录:
例9-8:在数据库Library中,当读者还书时,实际上要修改表brorrowinf中相应记录还期列的值,请计算出是否过期。
USE Library
IF EXISTS(SELECT name FROM sysobjects
WHERE name='T_fine_js' AND type='TR')
DROP TRIGGER T_fine_js
GO
CREATE TRIGGER T_fine_js
ON borrow
After UPDATE
AS
DECLARE @days int,@dzbh char(10),@tsbh char(15)
SET @dzbh=(select RID from inserted)
SET @tsbh=(select BID from inserted)
SELECT @days=DATEDIFF(day, ReturnDate, SReturnDate)
--DATEDIFF函数返回两个日期之差,单位为DAY
FROM borrow
WHERE RID=@dzbh and BID=@tsbh
IF @days>0
PRINT '没有过期!'
ELSE
PRINT '过期'+convert(char(6),@days)+'天'
GO
应用:
USE Library
UPDATE borrow SET ReturnDate='2007-12-12'
WHERE RID='2000186010' and BID='TP85-08'
GO
执行结果:
过期-157 天
(1 行受影响)
例9-9:对Library库中Reader表的 DELETE操作定义触发器。
USE Library
GO
IF EXISTS(SELECT name FROM sysobjects
WHERE name='reader_d' AND type='TR')
DROP TRIGGER reader_d
GO
CREATE TRIGGER reader_d
ON Reader
FOR DELETE
AS
DECLARE @data_yj int
SELECT @data_yj=Lendnum
FROM deleted
IF @data_yj>0
BEGIN
PRINT '该读者不能删除!还有'+convert(char(2),@data_yj)+'本书没还。
ROLLBACK
END
ELSE
PRINT '该读者已被删除!'
GO
应用:
USE Library
GO
DELETE Reader WHERE RID='2005216119'
执行结果:
该读者不能删除!还有4 本书没还。
修改触发器
ALTER TRIGGER 触发器
删除触发器
DROP TRIGGER 触发器
查看触发器
sp_helptext trigger_name
sp_helptrigger table_name
一个例子:
create table t_a(id int identity(1,1),username varchar(20))
create table t_b(id int identity(1,1),username varchar(20))
create trigger tr_a on t_a
for update,insert,delete
as
alter table t_b DISABLE TRIGGER tr_b
----------------------------------
if not exists (select from deleted) --插入
insert t_b(username) select username from inserted
else if not exists (select from inserted)--删除
delete t_b where id in (select id from deleted)
else--更新
update a set ausername=iusername from t_b as a,inserted as i where aid=iid
alter table t_b ENABLE TRIGGER tr_b
------------------------------------------
create trigger tr_b on t_b
for update,insert,delete
as
alter table t_a DISABLE TRIGGER tr_a
----------------------------------
if not exists (select from deleted) --插入
insert t_a(username) select username from inserted
else if not exists (select from inserted) --删除
delete t_a where id in (select id from deleted)
else --更新
update a set ausername=iusername from t_a as a,inserted as i where aid=iid
alter table t_a ENABLE TRIGGER tr_a
select from t_a
select from t_b
--测试:
insert t_a(username) values('test')
insert t_b(username) values('test2')
update t_a set username='test1' where id=1
update t_b set username='test3' where id=1
delete from t_a where id=1
delete from t_b where id=2
--------------------------
select from t_a
select from t_b
数据审计是触发器的重要功能,其作用是跟踪数据的变化过程,审核操作的合法性与合理性,如果触发不合法的操作,可依据审计的记录把数据恢复到原来的状态。
数据审计业务一般由两个数据表构成,一个是业务表,普通用户可以拥有此表读写权限;
一个是审计表,普通用户不拥有此表读写权限,只有超级用户才拥有此表读写权限,用于记录数据的变化过程。下面以一个案例的方式来说明数据审计的过程和作用。
有一个存储车辆收费信息表t_car,表结构如图车辆收费信息表结构所示,因业务要求,程序要有对该表的数据修改权限,为此需要审计对该表上数据的记录值修改信息,以备查询、跟踪。
车辆收费信息表结构
有一个审计表t_record,表结构如图审计表结构所示,要记录对车辆收费信息表的修改行为的所有信息,以供事后进行审计,判断操作行为是否合法。
审计表存储的内容有修改前pay字段的值、修改后pay字段的值、记录被修改的时间、登录数据库服务器修改数据的ip地址、登录数据库服务器的账号信息。
审计表结构
((1)用auditsql脚本初始化数据表环境,然后使用触发器记录所有用户对表t_car进行UPDATE操作修改数据的行为。触发器代码如下:DELIMITER//DROPTRIGGERIFEXISTStri_t_car;CREATETRIGGERtri_t_carBEFOREUPDATEONt_carFOREACHROWBEGINIFNEWpayOLDpayTHENINSERTINTOt_record(username
1、说明:创建数据库
CREATE DATABASE database-name
2、说明:删除数据库
drop database dbname
3、说明:备份sql server
--- 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1dat'
--- 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only
5、说明:删除新表drop table tabname
6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。
7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)
8、说明:创建索引:create [unique] index idxname on tabname(col…)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。
9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname
10、说明:几个简单的基本的sql语句
选择:select from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
排序:select from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1
11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。
12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
SQL: select aa, ab, ac, bc, bd, bf from a LEFT OUT JOIN b ON aa = bc
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
其次,大家来看一些不错的sql语句
1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select into b from a where 1 <>1
法二:select top 0 into b from a
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:from b in '"&ServerMapPath("")&"\datamdb" &"' where
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select atitle,ausername,badddate from table a,(select max(adddate) adddate from table where tabletitle=atitle) b
6、说明:外连接查询(表名1:a 表名2:b)
select aa, ab, ac, bc, bd, bf from a LEFT OUT JOIN b ON aa = bc
7、说明:在线视图查询(表名1:a )
select from (SELECT a,b,c FROM a) T where ta > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select from table2 where table1field1=table2field1 )
11、说明:四表联查问题:
select from a left inner join b on aa=bb right inner join c on aa=cc inner join d on aa=dd where
12、说明:日程安排提前五分钟提醒
SQL: select from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b主键字段 = a主键字段 order by a排序字段
14、说明:前10条记录
select top 10 form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tbb=tab)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,)
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 from (select top 15 from table order by id asc) table_别名 order by id desc
作为网络管理员,每天的工作就是要检查系统日志文件来查看服务器系统中发生的重要事情,只有网管主动查看事件日志后才能了解到具体情况,要是系统中突发了什么状况,网管该如何第一时间掌握呢?这时候我们就可以巧妙地运用windows2008系统下的触发器功能来解决这个问题。一起看下这个触发器功能的运用吧。
一、创建新的触发任务
Windows Server 2008系统的触发任务是基于特定事件创建的,我们首先需要让系统能对某个故障现象进行记录并生成一个事件,然后通过该系统新增加的附加任务功能,将指定的触发任务附加到目标事件中,日后一旦相同的事件发生时,指定的触发任务就能自动运行,来通知网络管理员当前服务器系统中发生了哪些重要的事情。
在默认状态下,Windows Server 2008系统不会对某个故障现象进行自动记录,我们必须对具体的故障现象进行审核,那样一来Windows Server 2008系统的事件查看器才能对具体的故障现象进行跟踪记录。例如,要想让Windows Server 2008系统的事件查看器自动记忆用户账号被恶意删除事件时,我们就应该依次单击“开始”/“设置”/“控制面板”命令,在弹出的系统控制面板窗口中双击“管理工具”图标,再在管理工具列表中双击“本地安全策略”选项,打开本地安全策略列表窗口;
在该列表窗口的左侧显示区域,依次展开“安全策略”/“审核策略”分支选项,在“审核策略”分支下面双击“审核账户管理”选项,打开选项设置对话框,选中“本地安全设置”标签,在对应的标签页面中选中“成功”或“失败”选项,再单击“确定”按钮,如此一来Windows Server 2008系统就会自动跟踪并记录添加或删除用户帐号事件了。
一旦对指定操作启用了审核功能后,Windows Server 2008系统就会在对应的日志文件中自动记录下相关的操作事件,例如以后只有有用户帐号被偷偷删除操作发生时,Windows Server 2008系统的日志文件中就会自动出现相应的记录文件。在查看这个具体的记录内容时,我们可以先打开Windows Server 2008系统的“开始”菜单,从中依次点选“设置”、“控制面板”、“系统和维护”、“管理工具”选项,在弹出的管理工具列表窗口中单击“事件查看器”图标,打开事件查看器控制台窗口,在该窗口的左侧显示区域展开“Windows日志”节点选项,我们从该选项下面会看到“系统”、“安全”、“应用程序”、“转发事件”、“安装程序”等不同类别的事件内容,用鼠标双击
某一类别下面的具体事件记录,就能打开对应事件记录的详细信息界面,在这里我们便可以了解到指定事件的来源、事件ID以及其他说明信息了。
不过,每次采用手工方法查看事件记录内容往往比较烦琐,而且网络管理员也很难在第一时间知道服务器系统中究竟发生了哪些重要的事件。为此,我们可以对某一特定的事件附加触发任务,当以后有相同的事件记录再次生成时,Windows Server 2008系统的触发器就能自动工作,来执行指定的任务计划,通过这个任务计划我们可以把当前发生的事件内容自动通知给网络管理员,网络管理员得到通知信息后,就能及时采取措施来解决服务器系统中存在的安全隐患了。
在创建新的触发任务时,我们先要从事件查看器窗口中找到具体的某一事件记录,例如用户帐号被删除的事件记录,然后用鼠标右键单击该记录选项,从弹出的快捷菜单中单击“将任务附加到此事件”命令,打开触发任务创建向导对话框,依照向导提示设置好新任务的名称信息,之后选中一个合适的触发方式,Windows Server 2008系统的触发器为用户提供了三种触发方式,它们分别为显示消息、发送电子邮件、启动应用程序,选择好某种触发方式后,再设置好具体的触发内容,最后单击“完成”按钮结束新触发任务的创建工作。
二、管理已有触发任务
创建成功的各个触发任务会自动出现在Windows Server 2008系统的任务计划列表中,进入任务计划列表窗口,我们就可以对已有触发任务进行随心所欲地管理、设置了。在管理已有触发任务时,我们可以按照如下步骤进行操作:
首先以系统管理员权限登录进入Windows Server 2008系统,依次单击该系统桌面中的“开始”/“程序”/“附件”/“系统工具”/“任务计划程序”命令,打开对应系统的任务计划列表窗口;
其次在该列表窗口的'左侧显示区域,用鼠标逐一展开“任务计划程序库”/“Microsoft”/“事件查看器任务”分支选项,在对应“事件查看器任务”分支选项的中间显示区域,我们会看到Windows Server 2008系统中所有已经创建成功的触发任务。
在这里我们可以对每一个触发任务的各种参数进行修改,例如要修改某个任务计划的触发方式时,我们只要用鼠标右键单击具体的触发任务,从弹出的右键菜单中执行“属性”命令,打开目标触发任务的属性设置窗口。
在该设置窗口的“常规”标签页面中,我们可以指定目标都要触发任务的运行选项,例如是否在登录系统时运行目标触发任务,还是不管用户是否登录运行等,对于一些特殊的触发任务,我们有时需要在这里选中“使用最高权限运行”选项,确保目标触发任务中既定的操作能够顺利地在Windows Server 2008系统中被成功执行。
在“触发器”标签页面中,我们可以通过单击“新建”按钮,来重新创建一个新的触发器任务,通过单击“编辑”按钮来对当前选定的触发器进行一些高级设置,例如可以指定目标触发任务的延迟任务时间、重复任务间隔、过期日期等参数,通过单击“删除”按钮来将一些不需要的触发任务从Windows Server 2008系统中删除掉。
在“操作”标签页面中,我们可以查看到目标触发任务正在使用的触发方式是什么,如果需要调整使用新的触发方式时,可以先选中当前正在使用的触发方式,并单击“删除”按钮将目标触发方式删除掉,之后单击“新建”按钮来创建一个新的触发方式。此外,我们还能单击这里的“编辑”按钮,来修改当前正在使用的触发方式的一些触发参数,例如修改触发标题、触发内容,选用不同的触发程序等。
在“条件”标签页面中,我们可以指定用于与触发器一起判断是否应运行该任务的条件,要是在这里设置的条件不是真,那么目标触发任务将不会被自动执行。例如,我们可以设置在本地计算机处于空闲状态多长时间后就能自动运行当前触发任务,也可以设置只有本地计算机在使用交流电源时才启动运行当前触发任务,甚至还能设置在指定网络连接有效时才能启动运行目标触发任务。
在“设置”标签页面中,我们可以指定影响目标触发任务的一些其他设置参数。例如,我们可以设置在目标任务触发失败后,过多长时间重新启动运行目标触发任务;也可以指定目标触发任务运行时间超过多长时间时,自动停止运行任务
三、触发器的实战应用
巧妙利用触发器功能,我们可以对Windows Server 2008服务器系统的运行状态进行即时监控,一旦服务器系统发生意外事件时,触发器能够自动把发生的事件通知给服务器管理员,以便管理员在第一时间采取措施保护服务器运行状态不受影响。
例如,我们可以对Windows Server 2008系统账号的创建行为进行跟踪,一旦有非法账号创建时,网络管理员能够及时收到报警信息。要实现这样的监控目的,我们可以先打开Windows Server 2008系统的本地安全策略列表窗口,依次点选其中的“安全策略”/“审核策略”/“审核账户管理”选项,并用鼠标双击该选项,之后选中“成功”或“失败”选项,再单击“确定”按钮,这样的话Windows Server 2008系统就能自动跟踪并记录添加或删除用户帐号事件了。
接着用鼠标右键单击“计算机”图标,从弹出的快捷菜单中执行“管理”命令,打开对应系统的计算机管理窗口,在该管理窗口的左侧显示区域依次选中“配置”/“本地用户和组”/“用户”选项,并用鼠标右键单击该选项,再执行右键菜单中的“新用户”命令,在其后弹出的用户账号创建对话框中,随意创建一个新的用户账号,这时Windows Server 2008系统的事件查看器窗口中就会自动生成一个创建新用户账号的事件了。
下面,依次单击Windows Server 2008系统“开始”菜单中的“设置”/“控制面板”/“系统和维护”/“管理工具”选项,再双击“事件查看器”图标,打开事件查看器控制台窗口,在该窗口的左侧显示区域展开“Windows日志”节点选项,然后从该选项下面的“系统”分支下面找到刚刚创建好的创建新用户账号事件,再用鼠标右键单击该事件选项,从弹出的快捷菜单中点选“将任务附加到此事件”命令,打开触发任务创建向导对话框,依照向导提示设置好新任务的名称为“监控非法创建账号”,选中触发方式为“显示消息”,将触发内容设置为“服务器系统中有账号可能被非法创建”,最后单击“完成”按钮,如此一来“监控非法创建账号”的触发任务就算创建成功了。
在windows2008系统内全新应用触发器功能,只要有非法操作,会是系统遭到攻击等操作,服务器系统屏幕上都会自动弹出报警提示信息,这样一来,网络管理员就可以在第一时间内掌握服务器系统的运行情况了。
0条评论