月亮代表我的心

个人博客,跟月亮无关,跟代表无关,无关谁的心

Sql Server 复习笔记(6)

触发器

For、After 触发器(table)
在指定的操作成功执行后,其引用的级联操作和约束检查成功完成后,才执行此触发器

Instead of 触发器(table | view)
不执行指定的操作,而将触发器的内容替代指定的原始数据操作。
每个insert、update、delete 语句最多定义一个INSTEAD OF触发器。
当要对不可更新的视图修改数据时,可使用INSTEAD OF触发器

create TRIGGER Trigger_name
ON table|view [WITH ENCRYPTION]
FOR|INSTEAD OF [delete, insert, update]
AS Sql_statements

触发器可以访问两个逻辑表
操作———-inserted———–deleted
insert——新插入的记录 ——-无记录
update—–修改后的记录 —修改前的记录
delete———无记录———被删除的记录

*对于text,ntext,image列,AFTER触发器不可引用,INSTREAD OF 可以

级联触发器
1.嵌套触发器(32)
2.递归触发器
直接递归(执行自己时导致再次触发自己)
间接递归

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
--***递归触发器***--
USE student_temp
GO
-- 设置触发器可以递归激发
ALTER DATABASE student_temp
SET RECURSIVE_TRIGGERS ON
GO

--建职员表
--drop table emp_mgr
CREATE TABLE emp_mgr (
员工名 CHAR(30) PRIMARY KEY,
上司名 CHAR(30) NULL FOREIGN KEY REFERENCES emp_mgr(员工名),
手下人数 INT DEFAULT 0
)
GO

--创建职员表插入触发器
CREATE TRIGGER emp_mgrins ON emp_mgr
FOR INSERT
AS
--声明变量
DECLARE @emp CHAR(30)
--创建游标,记录
DECLARE c_emp_ins CURSOR FOR
SELECT emp_mgr.员工名
FROM emp_mgr, inserted
WHERE emp_mgr.员工名 = inserted.上司名
--打开游标
OPEN c_emp_ins
FETCH NEXT FROM c_emp_ins INTO @emp
WHILE @@fetch_status = 0
BEGIN
UPDATE emp_mgr
SET emp_mgr.手下人数 = emp_mgr.手下人数 + 1
WHERE emp_mgr.员工名 = @emp

FETCH NEXT FROM c_emp_ins INTO @emp
END
CLOSE c_emp_ins
DEALLOCATE c_emp_ins
GO

--创建职员表更新触发器,
ALTER TRIGGER emp_mgrUpd ON emp_mgr
FOR UPDATE,INSERT
AS
IF UPDATE (上司名) --当mgr字段的值改变时为真
BEGIN
UPDATE emp_mgr -- 新经理手下人数加1(新数据在inserted表中)
SET emp_mgr.手下人数 = emp_mgr.手下人数 + 1
FROM inserted
WHERE emp_mgr.员工名 = inserted.上司名

UPDATE emp_mgr -- 原经理手下人数减1(原数据在deleted表中)
SET emp_mgr.手下人数 = emp_mgr.手下人数 - 1
FROM deleted
WHERE emp_mgr.员工名 = deleted.上司名
END
GO

-- 插入记录
--delete from emp_mgr
INSERT emp_mgr(员工名, 上司名) VALUES ('张总', NULL)
INSERT emp_mgr(员工名, 上司名) VALUES ('李四', '张总')
INSERT emp_mgr(员工名, 上司名) VALUES ('王五', '李四')
INSERT emp_mgr(员工名, 上司名) VALUES ('陈六', '李四')
INSERT emp_mgr(员工名, 上司名) VALUES ('赵七', '陈六')
GO

SELECT * FROM emp_mgr

-- 将王五的经理从 李四 换成 张总
UPDATE emp_mgr SET 上司名 = '张总'
WHERE 员工名 = '王五'
GO

--**** INSTEAD OF 触发器 ****--
USE student_temp
CREATE VIEW v_stud_class AS
SELECT class_name,stud_id,stud_name
FROM class ,student
WHERE class.class_no=student.class_no

SELECT * FROM v_stud_class

DELETE FROM v_stud_class WHERE stud_id=3

--drop trigger t_stud_class
CREATE TRIGGER T_stud_class ON v_stud_class
Instead OF DELETE
AS
DELETE FROM student WHERE stud_id IN (
SELECT stud_id FROM deleted)
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注