sql server触发器


        米老师说:不怕不知道,就怕不知道。现在看来我觉得这句话是对于学习知识的态度最精确的定位,举个例子,之前在学习触发器的时候,我了解的也仅仅就是一些概念的东西,我看过之前自己的总结,自己总结的特别简单只有一句话:如果想在表中自动执行插入或删除数据就可以使用触发器。也仅仅是因为我知道数据库中的触发器,现在在做机房收费系统的时候用到它了,通过查资料,更深入的学习,从而收获了更多的知识。

下面好好的总结一下触发器:

触发器的简介:

        触发器(trigger)是sql server保证数据完整性的一种方法,它使与事件相关的存储过程,它由事件来触发,比如对表进行insert操作时就能激活它。触发器被用于加强数据的完整性约束和业务逻辑。

触发器的分类:

1.DML触发器

用于数据表中的数据发生变化时,约束只能约束同一表中的数据,而触发器可以执行任意的sql命令。

//DML触发器
CREATE TRIGGER [ schema_name . ]trigger_name 
ON { table | view } 
[ WITH <dml_trigger_option> [ ,...n ] ]
{ FOR | AFTER | INSTEAD OF } 
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] } 
[ WITH APPEND ] 
[ NOT FOR REPLICATION ] 
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }
 
<dml_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]
<method_specifier> ::=

   assembly_name.class_name.method_name

参数说明:

参数名

说明

Schema_name

DML 触发器所属架构的名称 

Trigger_name

触发器的名称

Table/view

执行DML触发器的表或视图

FOR/AFTER

触发器在触发sql语句中指定的所有操作都成功执行后才能执行

INSTEAD OF

执行DML触发器而不是执行触发SQL语句

{ [DELETE] [,] [INSERT] [,] [UPDATE] }

指定数据修改语句,这些语句可在 DML 触发器对此表或视图进行尝试时激活该触发器 

WITH APPEND

应该添加现有类型的其他触发器

NOT FOR PEPLICATION

复制触发器涉及的表时,不执行触发器

AS

触发器要做的动作

Sql_statement

触发器条件或操作

n

触发器中多条t_sql语句占位符。

举例:

create trigger tri_update
on student
for update
as
if update(student_id)
begin
raiserror('学号不能修改!',16,8)
rollback tran
end
go

2.DDL触发器

用于约束数据库中表、触发器、视图结构上的操作,例如数据库结构发生变化时,限制对数据库的修改。

CREATE TRIGGER trigger_name 
ON { ALL SERVER | DATABASE } 
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }
 
<ddl_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]
 
<method_specifier> ::=
    assembly_name.class_name.method_name

参数说明:

参数名

说明

Trigger_name

触发器的名称

DATABASE

将 DDL 触发器的作用域应用于当前数据库 

ALL SERVER

将 DDL 或登录触发器的作用域应用于当前服务器

FOR/AFTER

触发器在触发sql语句中指定的所有操作都成功执行后才能执行

Event_type

执行之后将导致激发 DDL 触发器的 Transact-SQL 语言事件的名称

event_group

预定义的 Transact-SQL 语言事件分组的名称  

WITH APPEND

应该添加现有类型的其他触发器

NOT FOR PEPLICATION

复制触发器涉及的表时,不执行触发器

AS

触发器要做的动作

Sql_statement

触发器条件或操作

n

触发器中多条t_sql语句占位符。

举例:

CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You must disable Trigger "safety" to drop or alter tables!' 
   ROLLBACK;

3.登录触发器

    登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。

//登录触发器
CREATE TRIGGER trigger_name 
ON ALL SERVER 
[ WITH <logon_trigger_option> [ ,...n ] ]
{ FOR| AFTER } LOGON  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }
<logon_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]
 
<method_specifier> ::=
assembly_name.class_name.method_name

举例:

CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' AND
    (SELECT COUNT(*) FROM sys.dm_exec_sessions
            WHERE is_user_process = 1 AND
                original_login_name = 'login_test') > 3
    ROLLBACK;
END;


        这就是触发器学习的总结,从一开始的了解知道,到现在能更加深入的去学习运用,在这个整个过程中,让我收获了更多,提高了更多。这也印证了:变是永远不变的!!
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 28
    评论
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值