sql server 触发器

摘要:
所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。在执行delete或update语句时,行从触发器表中删除,并传输到deleted表中。在插入和更新时,新建行被同时添加到inserted表和触发器表中。Inserted表中的行是触发器表中新行的副本。
触发器是一种特殊类型的存储过程。触发器可包含复杂的T-SQL语句。触发器不能通过名称被直接调用,也不允许设置参数。它是建立在触发事件上的。
触发器可以强制执行一定的业务规则,以保持数据完整性、检查数据有效性、实现数据库管理任务和一些附加功能。
触发器的分类:DML、DDL、登录触发器
创建触发器需要指定的选项:
1.触发器的名称。
2.在其上定义触发器的表。
3.触发器将何时激发。
4.激活触发器的数据修改语句。
5.执行触发操作的编程语句。
CREATE TRIGGER语句基本语法格式如下:

CREATE TRIGGER 触发器名称

ON {表名 | 视图名}

[with encryption]

{

{ {FOR | AFTER | INSTEAD OF}

{[DELETE] [,][INSERT] [,] [UPDATE]}

AS

sql_statement […n ]

}

其中:

AFTER

指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。如果仅指定 FOR 关键字,则 AFTER 是默认设置。

INSTEAD OF

指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。

例如:

1 /*在student表上创建触发器,
2 在用户插入、修改和删除记录时,都会自动显示表中的内容:*/
3 
4 usetest
5 go
6 
7 create trigger trig_1 onstudent
8 after insert,delete,update
9 as 
10 begin
11     set nocount on
12     select * fromstudent
13 end
14 
15 insert student(sno) values(5)
16 
17 delete student where sno=5
18 
19 
20 exec sp_helptext trig_1    --查看触发器内容 
21 exec sp_helptrigger student   --查看表上的触发器的属性
22 select * from sysobjects where xtype='TR'  --查看数据库中已有的触发器
23 
24 
25 drop trigger trig_1

inserted表和deleted表

触发器执行的时候,产生两个临时表:inserted表deleted表。它们的结构和所在的表的结构相同,可使用这两个表测试某些数据修改的效果和设置触发器操作的条件,但不能对表中的数据进行更改。
deleted表用于存储DELETE和UPDATE语句所影响的行的副本。在执行delete或update语句时,行从触发器表中删除,并传输到deleted表中。
inserted表用于存储INSERT和UPDATE语句所影响的行的副本。在插入和更新时,新建行被同时添加到inserted表和触发器表中。Inserted表中的行是触发器表中新行的副本。
在对具有触发器的表(触发器表)进行操作时,有:
执行INSERT操作,插入到触发器表中的新行被插入到inserted表中。
执行DELETE操作,从触发器表中删除的行被插入到deleted表中。
执行UPDATE操作,先从触发器表中删除旧行,然后再插入新行。删除的旧行插入到deleted表中;更改后的新行被插入到inserted 表中。
使用DML触发器
1. INSERT和UPDATE触发器

当向表中插入或者更新记录时,INSERT或者UPDATE触发器被激活。一般情况下,这两种触发器常用来检查插入或者修改后的数据是否满足要求。

INSERT触发器被触发时,新的记录增加到触发器的对应表中,并且同时也添加到一个inserted表中。
修改一个记录等于插入了一个新的记录并且删除一个旧的记录。当在一个有UPDATE触发器的表中修改记录时,表中原来的记录被移动到deleted表中,修改过的记录插入到了插入表中,触发器可以参考deleted表和inserted表以及被修改的表,以确定如何完成数据库操作。
2. DELETE触发器
DELETE触发器通常用于下面的情况:
防止那些确实要删除,但是可能会引起数据一致性问题的情况,一般是用于那些用作其他表的外部键记录。
用于级联删除操作。
例如:
1 /*例:下例说明inserted表和deleted表的作用*/
2 
3 if exists(select name from sysobjects where name='trig_2' and type='TR')
4     drop triggertrig_2
5 go
6 
7 create triggertrig_2 
8 onstudent
9 after update                         --update触发器
10 as 
11     print 'inserted表'
12     select * frominserted
13     print 'deleted表'
14     select * fromdeleted
15 go
16 set nocount on
17 update student set sname='关二' where sno=2
18 --drop trigger trig_2
19 
20 
21 create triggertrig_3 
22 onstudent
23 after insert                         --insert触发器
24 as 
25     print 'inserted表'
26     select * frominserted
27     print 'deleted表'
28     select * fromdeleted
29 go
30 insert student values(100,'刘一百','',25)
31 drop triggertrig_3
32 
33 
34 create triggertrig_4 
35 onstudent
36 after delete                         --delete触发器
37 as 
38     print 'inserted表'
39     select * frominserted
40     print 'deleted表'
41     select * fromdeleted
42 go
43 delete student where sno=100
44 drop trigger trig_4
修改触发器
语法格式:

ALTER TRIGGER trigger_name

ON ( table | view )

{

{ ( FOR | AFTER | INSTEAD OF ) }

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }

AS

sql_statement […n ]

}

DDL触发器使用

例如:

1 /*DDL触发器*/
2 
3 /*在test数据库上创建一个DDL触发器safe,
4 用来防止数据库中的任一表被修改或删除。*/
5 
6 create triggersafetest
7 on database                         --数据库DDL触发器
8 after drop_table,alter_table
9 as
10 begin
11     raiserror('不能修改表结构',16,2)
12     rollback
13 end
14 go
15  
16 --执行以下程序,观察结果
17 alter table student add nation char(10)
18 
19 disable trigger safetest on database
20 drop trigger safetest on database
21 ---------------------------------------------------------
22 
23 
24 /*在服务器上创建一个DDL触发器tablecreat,
25 用来防止在服务器上创建数据库*/
26 
27 create triggertrig_last
28 on allserver
29 after create_database
30 as
31 begin
32     raiserror('不能创建新的数据库',16,2)
33     rollback
34 end
35 go
36 
37 --执行以下程序,观察结果
38 create databasetest_trig
39 
40 disable trigger trig_last on allserver
41 drop trigger trig_last on all server

删除触发器

使用SQL Server Management Studio删除触发器
使用DROP TRIGGER语句来删除触发器。其语法格式如下:

DROP TRIGGER { trigger } [ , …n ]

触发器禁用和启用

例如:

1 /*触发器禁用和启用*/
2 
3 /*禁用sc表上的触发器trig_g。*/
4 alter table sc disable triggertrig_g
5 disable trigger trig_g onsc
6 go
7 
8 /*启用sc表上的触发器trig_g。*/
9 alter table sc enable triggertrig_g
10 enable trigger trig_g onsc
11 go
12 
13 --执行以下程序,观察结果
14 insert into sc values(1,100,1,-50)
15 select * from sc

触发器具体应用

例如:

1 /*具体应用*/
2 
3 /*创建触发器trig3,
4 当删除student表中的学生记录时,
5 应该同时删除sc表中对应的记录*/
6 
7 create triggertrig_5
8 onstudent
9 for delete
10 as 
11  deletesc
12  where sc.sno in(select sno fromdeleted)
13 go
14 
15 select * fromstudent
16 select * fromsc
17 go
18 
19 /*exec sp_help score   --查看其中外键
20 
21 alter table score         --删除外键
22 drop CONSTRAINT FK_score_course
23 
24 alter table score
25 drop CONSTRAINT FK_score_student*/
26 
27 
28 delete student where sno=3
29 go
30 
31 select * fromstudent
32 select * fromsc 
33 -------------------------------------------------------------
34 
35 
36 create triggertrig_g 
37 onsc
38 after insert,update
39 as
40 begin
41     declare @g int
42     select @g=grade frominserted
43     if @g<0
44     begin
45          select '成绩必须>=0'
46          rollback
47     end
48 end
49 go
50 
51 --执行以下程序,观察结果
52 insert into sc values(1,10,1,50)
53 select * fromsc
54 
55 
56 /*例: 建立一个修改触发器trigno,
57 该触发器防止用户修改表student的学号*/
58 
59 create triggertrigno
60 onstudent
61 after update
62 as
63 if update(sno)
64     begin
65         raiserror('不能修改学号',16,2)
66         rollback
67     end
68 go
69 
70 --执行以下程序,观察结果
71 update student set sno='2' where sno='1'
72 select * fromstudent
73 ------------------------------------------------------
74 
75 
76 /*INSTEAD OF触发器*/
77 
78 /*例:在student表上创建一个INSTEAD OF触发器trig_6,
79 当用户插入数据时注意观察触发器的执行。*/
80 
81 create triggertrig_6
82 onstudent
83 instead of insert
84 as
85     select * fromstudent
86 go
87 
88 --执行以下程序,观察结果
89 insert into student(sno,sname) values('300','白扯')

免责声明:文章转载自《sql server 触发器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java实时监听日志写入kafkaSpringBoot文件分片上传下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

图文解释XCode常用快捷键的使用

刚开始用Xcode是不是发现以前熟悉的开发环境的快捷键都不能用了?怎么快捷运行,停止,编辑等等、都不一样了。快速的掌握这些快捷键,能提供开发的效率。 其实快捷键在Xcode的工具栏里都标注有,只是有的符号和你的键盘上的符号对应不起来罢了。下面截图工具栏里的快捷键总结一下常用快捷键的用法。 一、关于运行调试 1、运行,停止,都在工具栏的Product里。 C...

SQL 一对多联表查询最大值

有两个数据表City表和Price表,CIty表的结构如下: Price表的结构如下: 查询每个城市最大的销售价格,并以最大价格进行降序排列,选取前5条记录,SQL语句的代码如下: select top 5 * from (select ROW_NUMBER() over(order by TmpTable.AdultyPrice desc) NID,...

Oracle子查询相关内容(包含TOP-N查询和分页查询)

本节介绍Oracle子查询的相关内容: 实例用到的数据为oracle中scott用户下的emp员工表,dept部门表,数据如下: 一、子查询 1、概念:嵌入在一个查询中的另一个查询语句,也就是说一个查询作为另一个查询的条件,这个查询称为子查询。 那么可以使用子查询的位置有select后面、from后面、where后面以及having后面。 2、分类:(1...

WebRTC学习(三)WebRTC设备管理

一:WebRTC设备管理 (一)重要API,用于获取音视频设备 其中返回的ePromise结果,是一个Promise对象。 Promise对象的结构体:MediaDevicesInfo  deviceID:是设备唯一标识符ID label:是设备的名字(可读的) kind:设备的种类(音频输入/输出两种,视频输入/输出两类) groupID:同一个设备...

数据库表数据如何去重

表结构为: 表数据为: 表中数据可以看到name列中有两行数据是一致的,去重的SQL语句为: 1 delete from user where name in (select name from (select name from user group by name having count(name) > 1) ass1) 2 and id...

使用new实现realloc操作

    本文定义了一个宏来实现使用new代替realloc的操作,代码如下: #include <iostream> #include <malloc.h> using namespace std; // p - 内存指针 // n - 申请内存数量 // T - 申请内存类型 #define...