数据库1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

触发器

摘要触发器是用户定义在关系表面上的一类由事件驱动的特殊过程.一旦定义

后,任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在DBMS

核心层进行集中的完整性控制.我们将简单的介绍触发器的创建、修改、删除、执

行的方法.

关键词触发器SQL语句创建触发器修改触发器删除触发器

1.触发器

触发器是一种特殊类型的存储过程,它也是用Transact-SQL语言编写的程序.

存储过程是由用户利用命令EXECUTE执行它,而触发器是在用户对某一表内的数据做插入(INSERT)、更新(UPDATE)、删除(DELETE)时被触发器执行.通常我们使用触发器来检查用户对数据库表的更新是否合乎整个应用系统的需要,以及是否合乎商业规则以维持表内数据的完整性和正确性.

2.触发器的作用

2.1 触发器可通过数据库中的相关表实现级联更改.

通过级联参照完整性约束可以更有效地执行这些.

2.2 触发器可以强制比用CHECK约束定义的约束更为复杂的约束.

2.2.1 与CHECK约束不同,触发器可以引用其他表中的列.

例如,触发器可以使用另一个表中的SELECT比较插入或更新的数据,以及执行其他操作,如修改数据或显示用户定义错误信息.

2.2.2 触发器的主要好处在于它们可以包含使用Transact-SQL代码的复杂处理逻辑.因此触发器可以支持约束的所有功能.

2.3 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策.

2.4 一个数据库表中的多个同类触发器(INSERT、UPDATE或DELETE)允许采取多个不同的对策以响应同一个修改语句.

3.触发器类型

3.1 UPDATE.

3.2 INSERT.

3.3 DELETE.

4.创建触发器的SQL语句

CREATE TRIGGER 触发器名

ON{表名|视图名}

{

{{FOR|AFTER|INSTEAD OF}{[INSERT][,UPDATE][,DELETE]

AS

[{IF UPDATE(列名)[{AND|OR} UPDATE(列名)][...n]}]

SQL语句[...n]

}

}

例1 交互式为数据库表S创建一级联更新触发器TRIGGER_S

要求:若修改S表中一学生的学号,则SC表中与该学生相关的学号自动修改.

CREATE TRIGGER TRIGGER_S

ON S FOR UPDATE AS IF UPDATE(SNO)

BEGIN

DECLARE @SNO_NEW CHAR(2),@SNO_OLD CHAR(2)

SELECT @SNO_NEW=SNO FROM INSERTED

SELECT @SNO_OLD=SNO FROM DELETED

UPDATE SC SET SNO=@SNO_NEW WHERE SNO=@SNO_OLD

END

例2 交互式为数据库表SC创建一限制更新触发器TRIGGER_SC

要求:若修改SC表中一记录的学号,则要检查表S中是否存在与该学号相同的记录,若存在则不许修改,若不存在则可修改.

CREATE TRIGGER TRIGGER_SC

ON S FOR UPDATE AS IF UPDATE(SNO)

BEGIN

DECLARE @SNO_NEW CHAR(2),@SNO_OLD CHAR(2),@SNO_CNT INT

SELECT @SNO_OLD=SNO FROM DELETED

SELECT @SNO_CNT=COUNT(*) FROM S WHERE SNO=@SNO_OLD

IF @SNO_CNT<>0

ROLLBACK TRANSACTION

END

例3 用SQL为数据库表SC创建一触发器SCORE_SC_TRI

要求:当插入一个记录或修改成绩时,确保此记录的成绩在0-100分之间.

CREATE TRIGGER SCORE_SC_TRI

ON SC FOR INSERT,UPDATE

AS DECLARE @SCORE_READ TINYINT

SELECT @SCORE_READ=SCORE FROM INSERTED

IF @SCORE_READ>=0 AND @SCORE_READ<=100

BEGIN

PRINT‘操作完成!’

RETURN

END

PRINT‘成绩超出0-100之间!请重新输入!’

ROLLBACK TRANSACTION

例4 用SQL为数据库表C创建一个级联删除触发器TRIGGER_DC

要求:通过课程名从C表中删除某课程信息,同时删除SC表中与此课程相关的选课记录.

CREATE TRIGGER TRIGGER_DC

ON C FOR DELETE

AS DECLARE @CNO_DEL CHAR(2)

SELECT @CNO_DEL=CNO FROM DELETED

DELETE FROM SC WHERE CNO=@CNO_DEL

5.修改触发器的SQL语句

AFTER TRIGGER 触发器名

ON{表名|视图名}

{

{{FOR|AFTER|INSTEAD OF}{[INSERT][,UPDATE][,DELETE]

AS

[{IF UPDATE(列名)[{AND|OR} UPDATE(列名)][...n]}]

SQL语句[...n]

}

}

例5 交互式修改数据库表S的触发器TRIGGER_S

要求:若删除数据库表S中某一个学生的记录信息,则自动删除数据库表SC中与该学生相关的记录信息.

AFTER TRIGGER TRIGGER_S

ON S FOR DELETE

AS

DECLARE @SNO_DEL CHAR(2)

SELECT @SNO_DEL=SNO FROM DELETED

WHERE SNO=@SNO_DEL

例6 用SQL修改数据库表C的触发器TRIGGER_DC

要求:通过课程名从数据库表C中删除某课程信息,同时删除数据库表SC 中与此课程相关的记录.

AFTER TRIGGER TRIGGER_DC

ON C FOR DELETE

AS DECLARE @CNO_DEL CHAR(2)

SELECT @CNO_DEL=CNO FROM DELETED

DELETE FROM SC WHERE CNO=@CNO_DEL

DELETE FROM WHERE CNO=@CNO_DEL

6.删除触发器的SQL语句

DROP TRIGGER {触发器名}[...n]

相关文档
最新文档