【数据库原理】触发器 Trigger

触发器概述.

触发器是一种特殊类型的存储过程。

主要优点.

  • 触发器是在某个事件发生时自动激活而执行的。
  • 触发器可以实现比约束更为复杂的完整性要求。
  • 触发器可以根据表数据修改前后的状态采取相应的措施。
  • 触发器可以防止恶意的或错误的INSERTUPDATEDELETE操作。

种类.

  • 【DML触发器】是在执行数据操纵语言(DML)事件时被激活而自动执行的触发器。
  • 【DDL触发器】是在执行数据定义语言(DDL)事件时被激活而自动执行的触发器。
  • 【登录触发器】是由登录(LOGON)事件而激活的触发器。

工作原理.

SQL Server在工作时为每个触发器在服务器的内存上建立两个特殊的表:插入表Inserted和删除表Deleted
在这里插入图片描述

  • 【INSERT触发器的工作原理】当对表进行INSERT操作时,INSERT触发器被激发,新的数据行被添加到创建触发器的表和Inserted表。
  • 【DELETE触发器的工作原理】对表进行DELETE操作时,DELETE触发器被激发,系统从被影响的表中将删除的行放入Deleted表中。
  • 【UPDATE触发器的工作原理】当执行UPDATE操作时,UPDATE触发器被激活。触发器将原始行移入Deleted表中,把更新行插入到Inserted表中。

创建触发器.

创建DML触发器.

CREATE TRIGGER trigger_name 
ON {
    
    table | view} 
[With Encryption]
{
    
    For | After | Instead Of} 
{
    
     [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE] } 
AS sql_statement [;]
  • 第1行使用CREATE TRIGGER来创建一个触发器;
  • 第2行指明触发器是施加在表Table还是视图View上,注意视图上只能创建Instead of触发器,而不能创建For|After触发器;
  • 第3行说明是否加密;
  • 第4行的ForAfter都表示在第5行的操作过后,执行触发器的动作,而Instead of表示跳过第5行的语句,直接执行触发器动作;
  • 第5行是指出能够激活触发器的条件,必须至少包含一个操作;
  • 第6行就是具体的触发器动作。

【例】设计一个触发器,在学生表S中删除某一个学生时,在选课表SC中该学生的选课记录也全部被删除。

USE Teach
GO
CREATE TRIGGER del_S
ON S
AFTER DELETE
AS 
	DELETE 
	FROM SC
	WHERE SC.SNo IN(SELECT SNo FROM Deleted)
GO

创建DDL触发器.

CREATE TRIGGER trigger_name
ON {
    
    All Server | Database} 
[With Encryption]
{
    
    FOR | AFTER} {
    
    event_type | event_group } [,...n ]
AS sql_statement [; ]
  • 第1行创建触发器;
  • 第2行指明触发器是施加在当前服务器All Server还是当前数据库Database,前者的效果是使得触发器作用域为当前服务器,即整个服务器的任何位置上出现了后面指定的event_type|event_group,就会激活该触发器;后者的效果是使得作用域为当前数据库;
  • 第3行说明是否加密;
  • 第4行的ForAfter都表示在第5行的操作过后,执行触发器的动作,后面的两个参数,event_type是指激活触发器的T-SQL语言事件的名称,例如CREATE_TABLE|DROP_TABLE|ALTER_TABLE等;后者是预定义的T-SQL语言事件分组的名称,执行属于event_group的T-SQL语言事件之后,都将激活该触发器;
  • 第5行就是具体的触发器动作。

【例】创建一个DDL触发器safety,禁止修改和删除当前数据库中的任何表。

USE Teach
GO
CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS PRINT '不能删除或修改数据库表!'
ROLLBACK
GO

禁用触发器.

在有些情况下,用户希望暂停触发器的作用,但并不删除它,这时就可以通过DISABLE TRIGGER语句使触发器无效,语法格式如下:

DISABLE TRIGGER {
    
     [ schema_name.] trigger_name [ ,...n ] | ALL }
ON object_name
  • 【schema_name】触发器所属架构的名称;
  • 【ALL】指明禁用在ON子句作用域中定义的所有触发器;
  • 【object_name】在其上创建的DML触发器的对象名称。

【例】将上面创建在数据库上的触发器safety禁用并进行验证。

//A temporary table TS.
SELECT * INTO TS
FROM S

//Try to delete TS,but fail because of trigger 'safety'.
DROP TABLE TS

//Disable 'safety'.
GO
DISABLE TRIGGER safety 
ON DATABASE

//Success to delete TS.
DROP TABLE TS
GO

解禁触发器.

要使触发器重新有效,可使用ENABLE TRIGGER语句,语法格式如下:

ENABLE TRIGGER {
    
    [schema_name.] trigger_name[ ,...n ] | ALL }
ON object name

删除触发器.

使用DROP TRIGGER语句删除触发器.

DROP TRIGGER trigger_name

猜你喜欢

转载自blog.csdn.net/weixin_44246009/article/details/108135489
今日推荐