文档库 最新最全的文档下载
当前位置:文档库 › 触发器

触发器

表结构
XSB(学号,姓名,性别,出生时间,专业,总学分,备注)
KCB(课程号,课程名,开课学期,学时,学分)
CJB(学号,课程号,成绩)

建表代码
CREATE TABLE XSB
(
学号 char(6) NOT NULL PRIMARY KEY,
姓名 char(8) NOT NULL,
性别 char(2) NULL DEFAULT 男,
出生时间 datetime NULL,
专业 char(12) NULL,
总学分 int NULL,
备注 varchar(500) NULL
)

create table KCB
(
课程号 char(3) primary key,
课程名 char(10) not null,
开课学期 tinyint check(开课学期 in (1,2,3,4,5,6,7,8)) default 1,
学时 tinyint default 0,
学分 tinyint default 0
)

create table CJB
(
学号 char(6),
课程号 char(3),
成绩 int null default 0,
PRIMARY KEY (学号,课程号),
foreign key (学号) references xsb(学号),
foreign key (课程号) references kcb(课程号)
)

1、创建一个表table1,其中只有一列a。在表上创建一个触发器,每次插入操作时,将变量@str的值设为“TRIGGER IS WORKING”并显示。
USE PXSCJ
GO
CREATE TABLE table1(a int)
GO
CREATE TRIGGER table1_insert
ON table1 AFTER INSERT
AS
BEGIN
DECLARE @str char(50)
SET @str='TRIGGER IS WORKING'
PRINT @str
END
向table1中插入一行数据:
INSERT INTO table1 VALUES(10)

2、创建触发器,当向CJB表中插入一个学生的成绩时,将XSB表中该学生的总学分加上添加的课程的学分。
CREATE TRIGGER cjb_insert
ON CJB AFTER INSERT
AS
BEGIN
DECLARE @num char(6), kc_num char(3)
DECLARE @xf int
SELECT @num=学号, @kc_num=课程号 from inserted
SELECT @xf=学分 FROM KCB WHERE 课程号=@kc_num
UPDATE XSB SET 总学分=总学分+@xf WHERE 学号=@num
PRINT '修改成功'
END

3、创建触发器,当修改XSB表中的学号时,同时也要将CJB表中的学号修改成相应的学号(假设XSB表和CJB表之间没有定义外键约束)。
CREATE TRIGGER xsb_update
ON XSB AFTER UPDATE
AS
BEGIN
DECLARE @old_num char(6), @new_num char(6)
SELECT @old_num=学号 FROM deleted
SELECT @new_num=学号 FROM inserted
UPDATE CJB SET 学号=@new_num WHERE 学号=@old_num
END
接着修改XSB表中的一行数据,并查看触发器执行结果:
UPDATE XSB SET 学号='081120' WHERE 学号='081101'
GO
SELECT * FROM CJB WHERE 学号='081120'

4、在删除XSB表中的一条学生记录时将CJB表中该学生的相应记录也删除。
CREATE TRIGGER xsb_delete
ON XSB AFTER DELETE
AS
BEGIN
DELETE FROM CJB
WHERE 学号IN(SELECT 学号FROM deleted)
END

5、在KCB表中创建UPDATE和DELETE触发器,当修改或删除KCB表中的课程号字段时,同时修改或删除CJB表中的该课程号。
CREATE TRIGGER kcb_trig
ON KCB AFTER UPDATE, DELETE
AS
BEGIN
IF (UPDATE(课程号))
UPDATE CJB SET 课程号=(SELECT 课程号 FROM inserted)
WHERE 课程号=(SELECT 课程号 FROM deleted)
ELSE
DELETE FROM CJB
WHERE 课程号 IN(SELECT 课程号

FROM deleted)
END

6、创建表table2,值包含一列a,在表中创建INSTEAD OF INSERT触发器,当向表中插入记录时显示相应消息。
USE PXSCJ
GO
CREATE TABLE table2(a int)
GO
CREATE TRIGGER table2_insert
ON table2 INSTEAD OF INSERT
AS
PRINT 'INSTEAD OF TRIGGER IS WORKING'
向表中插入一行数据:
INSERT INTO table2 VALUES(10)

7、在PXSCJ数据库中创建视图stu_view,包含学生学号、专业、课程号、成绩。该视图依赖于表XSB和CJB,是不可更新视图。可以在视图上创建INSTEAD OF触发器,当向视图中插入数据时分别向表XSB和CJB插入数据,从而实现向视图插入数据的功能。
首先创建视图:
CREATE VIEW stu_view
AS
SELECT XSB.学号, 专业, 课程号, 成绩
FROM XSB, CJB
WHERE XSB.学号=CJB.学号

创建INSTEAD OF触发器:
CREATE TRIGGER InsteadTrig
ON stu_view
INSTEAD OF INSERT
AS
BEGIN
DECLARE @XH char(6), @XM char(8),
@ZY char(12), @KCH char(3), @CJ int
SET @XM='佚名'
SELECT @XH=学号, @ZY=专业, @KCH=课程号, @CJ=成绩
FROM inserted
INSERT INTO XSB(学号, 姓名, 专业)
VALUES(@XH, @XM, @ZY)
INSERT INTO CJB VALUES(@XH, @KCH, @CJ)
END
GO
向视图插入一行数据:
INSERT INTO stu_view VALUES('091102', '计算机', '101', 85 )
查看数据是否插入:
SELECT * FROM stu_view WHERE 学号= '091102'





相关文档