我是靠谱客的博主 留胡子苗条,最近开发中收集的这篇文章主要介绍触发器,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 触发器是个啥?
    触发器是特殊的存储过程。一般的存储过程通过其名称被直接调用,而触发器主要是通过事件进行触发执行。
    通俗的说:通过一个动作(update,insert,delete)调用一个存储过程(触发器)。打个比方说,在EDUC数据库中,存放学生信息,选课信息,和课程信息。现在有一个学生的信息被修改或删除了,那么该学生的选课信息也必然要做修改或删除。我们可以使用触发器来实现。在学生信息表上设置一个delete或update触发器,当删除或修改一个学生信息时,delete和update触发器自动执行,对学生选课表进行修改。
  • 特点
    (1)触发器是自动的。当表中数据做了任何修改,则触发器自动被激活。
    (2)触发器可通过数据库中的相关表进行层叠更改。
    (3)触发器可强制限制。这些限制比用check约束定义的限制更复杂。
  • 类型
    (1)DML触发器
    在数据库中发生数据操作语言(DML)事件时将启用。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 T-SQL 语句。
    (2)DDL 触发器
    当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。但与DML触发器不同的是,它们不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而激发,相反,它们会为响应多种数据定义语言(DDL)语句而激发。

使用存储过程模板创建触发器
在【对象资源管理器】窗口中,展开“数据库”节点,再展开所选择的具体数据库节点,再展开“表”节点,右击要创建触发器的“表”,选择“新建触发器”命令。在右侧查询编辑器中出现触发器设计模板,用户可以在此基础上编辑触发器,单击“执行”按钮,即可创建该触发器。

使用SQL语句创建表
(1)简写语法格式:
CREATE TRIGGER 触发器
ON 表名 | 视图名
FOR [update,insert,delete ]
AS
SQL语句
(2)完整语法格式:
CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ …n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ …n ]
} ]
sql_statement [ …n ]
}
}
注释:
INSTEAD OF:取代一个操作,如insert等

例:在表borrow中添加借阅信息记录时,得到该书的应还日期
注意:delteted 和inserted表是中间表,用来存放被删除和添加的记录,保留被删除和插入数据的一个副本。空间是从内存分配的,是一个临时表
USE Library
IF EXISTS (SELECT name FROM sysobjects
WHERE name =‘T_return_date’ AND type=‘TR’)
DROP TRIGGER T_return_date
GO
– 如果有同名的触发器,则删除
CREATE TRIGGER T_return_date --创建触发器
ON Borrow --基于表borrow
After INSERT --针对插入操作的触发器
AS
–查询插入记录INSERTED中读者的类型
–dzbh读者编号,tsbh图书编号
DECLARE @type int,@dzbh char(10),@tsbh char(15) --定义了三个变量
SET @dzbh=(SELECT RID FROM inserted)
SET @tsbh=(SELECT BID FROM inserted)
SELECT @type= TypeID
FROM reader
WHERE RID=(SELECT RID FROM inserted)–副本
UPDATE Borrow SET SReturnDate=getdate()+
CASE
WHEN @type=1 THEN 90
WHEN @type=2 THEN 60
WHEN @type=3 THEN 30
END
WHERE RID=@dzbh and BID=@tsbh

例:对Library库中Reader表的 DELETE操作定义触发器
USE Library
GO
–保护,同名触发器删除
IF EXISTS(SELECT name FROM sysobjects
WHERE name=‘reader_d’ AND type=‘TR’)
DROP TRIGGER reader_d
GO
– 创建触发器
CREATE TRIGGER reader_d
ON Reader
FOR DELETE
AS
DECLARE @data_yj int --定义一个整型变量
–以下语句是取该读者所借的书的数量,
SELECT @data_yj=Lendnum
FROM deleted
IF @data_yj>0
BEGIN
PRINT ‘该读者不能删除!还有’+convert(char(2),@data_yj)+'本书没还。
ROLLBACK
END
ELSE
PRINT ‘该读者已被删除!’
GO

例:使用DDL触发器来防止数据库中的任一表被修改或删除
use educ
GO
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT ‘You must disable Trigger “safety” to drop or alter tables!’
ROLLBACK

修改触发器
ALTER TRIGGER 触发器

删除触发器
DROP TRIGGER 触发器

查看触发器
sp_helptext trigger_name
sp_helptrigger table_name

最后

以上就是留胡子苗条为你收集整理的触发器的全部内容,希望文章能够帮你解决触发器所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部