是指触发器在数据库中发出 DML

1.触发器简要介绍

触发器是一种奇特的仓库储存进程,它的施行不是由程序调用,也不是手动推行,而是由事件来触发。触发器是当对某贰个表进行操作。比如:update、insert、delete那一个操作的时候,系统会活动调用试行该表上相应的触发器。

2.触发器类型

澳门太阳集团城网址,1、DML( 数据垄断语言 Data Manipulation
Language)触发器:是指触发器在数据库中产生 DML
事件时将启用。DML事件是指在表或视图中对数据开始展览的 insert、update、delete
操作的话语。

2、DDL(数据定义语言 Data Definition
Language)触发器:是指当服务器或数据库中发出 DDL
事件时将启用。DDL事件是指在表或索引中的 create、alter、drop 操作语句。

3、登录触发器:是指当用户登陆 SQL SE库罗德VE传祺实例创立会话时接触。假使身份验证败北,登入触发器不会接触。

里头 DML 触发器比较常用,根据 DML
触发器触发的秘诀不一致又分为以下二种情景:

after 触发器(之后触发):当中 after 触发器须求独有实践insert、update、delete 某一操作之后触发器才会被触发,且不得不定义在表上。

instead of 触发器 (从前接触):instead of
触发器并不实施其定义的操作(insert、update、delete)而仅是试行触发器自身。能够在表或视图上定义
instead of 触发器。

3.触发器语法结构

AFTERAV4 触发器语法:

CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
AS { sql_statement  [ ; ] [ ,...n ] }  

<dml_trigger_option> ::=  
    [ NATIVE_COMPILATION ]  
    [ SCHEMABINDING ]  
    [ EXECUTE AS Clause ]

INSTEAD OF 触发器语法:

CREATE [ OR ALTER ] 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

DDL 触发器语法:

CREATE [ OR ALTER ] 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 ]

登录触发器语法:

CREATE [ OR ALTER ] 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 ]

 参数介绍:

  • 澳门太陽城集团登录网址,CREATE OR
    ALTE途胜:创制只怕有准绳的改变触发器(即要修改的触发器必须已经存在)
  • schema_name:ML触发器所属的形式的称号(即全部者,比方:dbo)。
  • trigger_name:触发器的名称
  • table | view:实践 DML
    触发器的表或视图,有的时候称为触发器表或触发器视图。钦定表格或视图的一点一滴限定名称是可选的。视图只好由
    INSTEAD OF 触发器援用
  • DATABASE:将 DDL
    触发器的范围使用于当下数据库。假设钦赐,触发器会在脚下数据库中产生event_type 或 event_group 时触发。
  • ALL SERVE智跑:将 DDL
    或登入触发器的功能域应用于近来服务器。借使钦赐,触发器会在日前服务器的其余省方发生event_type 或 event_group 时触发
  • WITH ENCCRUISERYPTION:加密 CREATE T福睿斯IGGE奥迪Q7 语句的文本。使用 WITH
    ENC库罗德YPTION 能够卫戍触发器作为 SQL Server
    复制的一部分开始展览发布。不大概为 CL奥迪Q5 触发器钦定 WITH ENC途睿欧YPTION。
  • EXECUTE AS:内定推行触发器的商洛上下文。以便能够支配 SQL Server
    实例用于表明触发器援用的别的数据库对象的权限的用户帐户。
  • NATIVE_COMPILATION:表示触发器是本土编写翻译的。
  • SCHEMABINDING:钦赐触发器引用的表无法被剔除或改换。
  • FOEvoque | AFTE景逸SUV:AFTE揽胜 钦命仅在触发 SQL
    语句中钦点的装有操作成功实践时触发 DML
    触发器。全体援用级联操作和自律检查在此触发器触发从前也务必成功。当
    FO奥迪Q5 是钦定的举世无双首要字时,AFTELAND 是默许值。视图无法定义AFTE昂Cora触发器。
  • INSTEAD OF:钦命推行 DML 触发器实际不是触发 SQL
    语句,由此覆盖触发语句的操作。不可能为 DDL 或登陆触发器钦赐 INSTEAD
    OF。对于 INSTEAD OF 触发器,在具备钦点级联合浮动作 ON DELETE
    的援引关系的表上不允许使用 DELETE 选项。类似地,在富有钦命级联合浮动作
    ON UPDATE 的援引关系的表上,分歧意 UPDATE 选项。
  • 是指触发器在数据库中发出 DML。{[DELETE]是指触发器在数据库中发出 DML。 [,]是指触发器在数据库中发出 DML。 [INSERT] [,]是指触发器在数据库中发出 DML。 [UPDATE]}
    :钦点在针对此表或视图举行尝试时激活 DML
    触发器的多寡修改语句。必须至少钦赐贰个选取。在触发器定义中允许以别的顺序对那个选择举行随机组合。
  • event_type:是推行后导致 DDL 触发器触发的 Transact-SQL
    语言事件的称呼。
  • event_group:是 Transact-SQL 语言事件的预约义分组的名目。属于其他Transact-SQL 语言事件施行后的 DDL 触发器触发 event_group。
  • sql_statement:是触发条件和动作。触发条件钦命附加条件,以明确尝试的
    DML,DDL 或登入事件是还是不是产生施行触发器操作。
  • method_是指触发器在数据库中发出 DML。是指触发器在数据库中发出 DML。specifier:对于 CLTucson触发器,钦点要与触发器绑定的次序集的诀窍。该格局不得不引用任何参数并回到
    void。class_name 必须是一蹴而就的 SQL Server
    标志符,况兼必须作为具备程序集可知性的次序聚焦的类存在。

DML触发器例子

  1. 创设AFTEENCORE INSERT 触发器:当下单后更新tbOrderTotalPrice 的总计消息

计划一张订单表(tbOrder),包涵订单ID,订单交易金额,订单创造时间,计划订单交易支行时间总额(tbOrderTotalPrice ),用来计算种种月的交易合计金额

澳门太阳集团城网址 1澳门太阳集团城网址 2

USE [TEST]
GO

/****** Object:  Trigger [dbo].[tSumTotalOrderPrice]    Script Date: 2018/5/15 11:10:04 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [dbo].[tSumTotalOrderPrice] on [dbo].[tbOrder]
AFTER INSERT
AS
BEGIN
 DECLARE @DT INT
 SET @DT= CONVERT(varchar(6),GETDATE(),112)

 DECLARE @SUM DECIMAL(18, 2)
 SET @SUM=(SELECT SUM(OPrice) FROM tbOrder WHERE @DT = CONVERT(varchar(6),CreateDT,112))

 IF(EXISTS(SELECT * FROM tbOrderTotalPrice WHERE YearMoth=@DT))
 BEGIN
  UPDATE tbOrderTotalPrice SET TotalPrice=@SUM WHERE YearMoth=@DT
 END
 ELSE
 BEGIN
  INSERT INTO tbOrderTotalPrice VALUES (@DT,@SUM)
 END
END

GO

执行INSERT 行为:INSERT INTO
[dbo].[tbOrder]([OPrice],[CreateDT])VALUES(9,GETDATE())

澳门太阳集团城网址 3

澳门太阳集团城网址 4

 2.创立 instead of  insert
触发器,当增加用户成绩记录时候,验证学号和学科存在工夫张开增多操作

筹算学生表(tbStudent),学科表(tbSubject),战表表(tbStuSubScore)

澳门太阳集团城网址 5 澳门太阳集团城网址 6 

澳门太阳集团城网址 7

在学员表中增多测量试验学生,在课程专门的学业拉长测量试验科目

澳门太阳集团城网址 8 澳门太阳集团城网址 9

新增加instead of insert 触发器,在实行INSERT
语句前验证学号和课程存在本领展开增多操作

USE [TEST]
GO

/****** Object:  Trigger [dbo].[tCheckStuSubScore]    Script Date: 2018/5/17 14:20:53 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:  yangyi
-- Create date: 2018/5/17
-- Description: 新增学科分数
-- =============================================
CREATE TRIGGER [dbo].[tCheckStuSubScore] ON [dbo].[tbStuSubScore]
   INSTEAD OF INSERT
AS 
BEGIN
 --验证学号是否存在
 IF(NOT EXISTS(SELECT * FROM tbStudent WHERE StuID=(SELECT StuID FROM inserted)))
 BEGIN
  PRINT('验证学号不否存在')
  ROLLBACK TRANSACTION
 END
 ELSE
 BEGIN
  --验证学科是否存在
  IF(NOT EXISTS(SELECT * FROM tbSubject WHERE SubID=(SELECT SubID FROM inserted)))
  BEGIN
   PRINT('验证学科不否存在')
   ROLLBACK TRANSACTION
  END
  ELSE
  BEGIN
   --执行INSERT
   INSERT INTO tbStuSubScore SELECT * FROM inserted
  END
 END
END

GO

注意:

在触发器语句中用八个极度的表贰个是deleted表和inserted。它们是透过触发器操作自动创造驻留在内存中的有的时候表。
Deleted表用于存款和储蓄 DELETE和 UPDATE语句所影响的行的别本。在执行DELETE或
UPDATE语句时,行从触发器表中删除,并传导到
deleted表中。Deleted表和触发器表经常没有同样的行。
Inserted 表用于存款和储蓄 INSERT 和 UPDATE
语句所影响的行的别本。在多少个布置或更新事务管理中,新光大银行被同临时间增多到
inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的别本

1.插入操作(Insert) Inserted表有多少,Deleted表无数据
2.去除操作(Delete) Inserted表无数据,Deleted表有多少
3.翻新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)

测试:

1>.实行INSERT 增添一条学科不存不通常在的上学的小孩子成绩记录,推行倒闭

INSERT INTO [dbo].[tbStuSubScore]([StuID],[Score],[SubID],[CreateDT])VALUES('001',100,0,GETDATE())  

2.>实践INSERT 增添一条学号不存不健康在的学习者战表记录,试行倒闭

INSERT INTO [dbo].[tbStuSubScore]([StuID],[Score],[SubID],[CreateDT])VALUES('004',100,1,GETDATE())

澳门太阳集团城网址 10 澳门太阳集团城网址 11

3.>执行一条健康的上学的小孩子成绩记录,施行成功

INSERT INTO [dbo].[tbStuSubScore]([StuID],[Score],[SubID],[CreateDT])VALUES('001',100,1,GETDATE())

澳门太阳集团城网址 12

You may also like...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图