1
数据库技术及应用
1.10.4.3 7.4.3 触发器的创建
7.4.3 触发器的创建

创建触发器前,应该注意以下事项:

●创建触发器的权限默认授予定义触发器表的所有者,并且该权限不可以转让。

●触发器不返回任何结果,所以不要在触发器定义中包含SELECT语句或者变量赋值,如果必须在触发器中进行变量赋值,则应该在触发器的开头使用SETNOCOUNT语句以避免返回任何结果集。

●触发器为数据库对象,其名称必须遵循标识符的命名规则。

●只能在当前数据库中创建触发器。

使用T-SQL语句创建触发器的语法格式如下:

参数说明如下:

●WITHENCRYPTION:对CREATETRIGGER语句的文本进行模糊处理。使用WITHENCRYPTION可以防止将触发器作为SQL Server复制的一部分进行发布。

●EXECUTEAS:指定用于执行该触发器的安全上下文。允许控制SQL Server实例用于验证被触发器引用的任意数据库对象的权限的用户账户。

●FOR|AFTER:AFTER指定DML触发器仅在触发SQL语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。如果仅指定FOR关键字,则AFTER为默认值。不能对视图定义AFTER触发器。

●INSTEADOF:指定执行DML触发器而不是触发SQL语句。

●DELETE,INSERT,UPDATE:指定数据修改语句,这些语句可在DML触发器对此表或视图进行尝试时激活该触发器。必须至少指定一个选项。

●WITHAPPEND:指定应该再添加一个现有类型的触发器。

●NOTFORREPLICATION:指定当复制代理修改涉及触发器的表时,不应执行触发器。

【例7-6】在Student数据库的Student_info表中建立触发器sdelete,实现对Student_info表和SC表的级联删除。

一个触发器建立完后,可以使用系统存储过程sp_helptext查看触发器的正文信息,其语法形式如下:

为了方便查询每个学生所学课程的平均分,可以在Student_info表中增加平均分字段AVG_GRADE。

在成绩管理中,经常要增加、修改学生的成绩,也就是需要在SC表中增加或者修改记录。一旦成绩更新了,势必会影响平均分的变化。为了保持数据的完整性和一致性,需要同步修改平均分字段,如果通过手工方式去修改的话,操作起来很复杂,也很容易出错。下面通过在SC表上增加触发器的方法来实现平均分的同步修改。

【例7-7】在SC表上建立触发器t_avg,实现根据成绩的变化自动修改学生的平均分字段的功能。代码如下:

该触发器创建成功后,一旦SC表中记录发生变化,就会自动触发t_avg的执行语句,从而同步修改Student_info中平均分字段,保证了数据的一致性。需要注意的是,由于触发器的自动执行,会影响SC表的修改速度。