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