本篇文章旨在帮助大家熟练掌握SQL数据库触发器操作,加深大家对SQL数据库触发器的理解.
考察课参考数据库和表格属性
CREATE DATABASE 学生管理系统
USE 学生管理系统
CREATE TABLE C
(
CNO CHAR(4) PRIMARY KEY,
CNAME VARCHAR(10),
CTYPE VARCHAR(10)
)
CREATE TABLE S_C
(
SNO CHAR(4) PRIMARY KEY,
CNO CHAR(4)CONSTRAINT c_n REFERENCES C(CNO),
SCORE CHAR(4)
)
USE 学生管理系统
INSERT C VALUES('A001','网络安全','考查')
INSERT C VALUES('A002','数据库','考试')
INSERT S_C VALUES('0001','A001','60')
INSERT S_C VALUES('0002','A002','87')
检查是否为考察课
当插入或更新学生成绩时,触发器检查该课程是否为考察课,若是,则插入或修改的该课程的成绩只能是60分(代表通过)或40分(代表未通过)。
涉及的表结构:
C(Cno,Cname,Ctype)
S_C(Sno,Cno,Score)
CREATE TRIGGER SCORE_KC
ON S_C FOR INSERT,UPDATE
AS
DECLARE @SCORE INT,@CTYPE CHAR(4)
SELECT @SCORE=SCORE,@CTYPE=CTYPE
FROM C,INSERTED
WHERE INSERTED.CNO=C.CNO
IF(@CTYPE='考查') AND (@SCORE<>60 AND @SCORE<>40)
BEGIN
RAISERROR('该课程为考查课,成绩以60或40计!',16,1)
ROLLBACK TRANSACTION
END
INSERT S_C VALUES('0004','A001','87')
订购单参考数据库和表格属性
CREATE DATABASE 订购单关系
USE 订购单关系
CREATE TABLE 客户
(客户号 char(8) PRIMARY KEY ,
客户名称 Varchar(40),
联系人 Varchar(40),
邮政编码 char(8) ,
电话号码 char(11))
CREATE TABLE 订购单
(客户号 char(8),
订单号 char(8) PRIMARY KEY,
订购日期 datetime
)
INSERT 客户 VALUES ('0001','面包房','李三','266071','85903214')
INSERT 客户 VALUES ('0002','香香食品厂','刘明明','266042','84023569')
INSERT 客户 VALUES ('0003','美味食品厂','王宇','266064','85883214')
INSERT 客户 VALUES ('0004','天天食品厂','马明明','266061','85877413')
INSERT 订购单 VALUES ('0001','D001','2008-04-20')
INSERT 订购单 VALUES ('0001','D002','2008-04-20')
INSERT 订购单 VALUES ('0002','D003','2008-04-05')
INSERT 订购单 VALUES ('0002','D004','2008-04-05')
INSERT 订购单 VALUES ('0002','D005','2008-04-10')
订购单的更新触发器
订购单关系建立一个更新触发器,当修改订购单中的客户号时,首先自动检查参照完整性,拒绝不满足完整性要求的更新,并给出错误信息;如果满足参照完整性要求,则同时将订购日期更改为当前的系统日期。
涉及的表结构:订购单(客户号,定单号,订购日期)
客户(客户号,客户名称,联系人,邮政编码,电话)
★创建完触发器后,执行相关的插入、删除或更新操作,查看触发器的效果和作用。
USE 订购单关系
CREATE TRIGGER 更新触发器
ON 订购单 FOR UPDATE
AS
IF UPDATE(客户号)
IF NOT EXISTS (SELECT * FROM 客户 WHERE 客户号
IN (SELECT 客户号 FROM INSERTED))
BEGIN
RAISERROR('非法客户号!',1,1)
ROLLBACK TRANSACTION
END
ELSE
UPDATE 订购单 SET 订购日期=GETDATE()
WHERE 客户号 IN (SELECT 客户号 FROM INSERTED)
UPDATE 订购单
SET 客户号='0003'
WHERE 客户号='0002'
版权声明:本文为weixin_44108271原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。