SQL触发器基本教程

合集下载

SQL菜鸟入门级教程之触发器

SQL菜鸟入门级教程之触发器

SQL菜鸟入门级教程之触发器本人水平有限,写此博客只为给那些像我一样的菜鸟一点小小的帮助,还请各位大牛不要见笑。

数据库的重要性就不用我多说了吧,我们做的大多数项目都要跟数据库打交道。

因此,熟练掌握数据库的各种操作,就成了一个程序员必备的技能。

今天我们就来简单说一下触发器。

触发器简介:触发器(trigger)是种特殊的存储过程,它的执行不是由程序调用,也不需要手动操作,它是由事件来触发,事件大家应该非常熟悉吧,比如按钮的Click事件、网页的Load事件等。

按钮的Click事件是通过鼠标单击按钮触发的,而触发器的事件,是由对表进行增删改操作所触发的。

当对一个数据库或表进行增删改(Insert,Delete,Update)的时就会激活触发器。

从SQL2005开始,根据SQL语句的不同将触发器分成了两类,一类是DML触发器,一类是DLL触发器。

其中DML触发器又分为两类:After触发器和Instead Of触发器。

触发器的分类:DML触发器:DML(Data Manipulation Language)触发器是当数据库服务器中发生数据操作语言事件时执行的存储过程。

DML触发器又分为两类:After触发器和Instead Of触发器DDL触发器:DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。

DDL触发器一般用于执行数据库中管理任务。

如审核和规范数据库操作、防止数据库表结构被修改等。

DML触发器:今天我们我们主要介绍DML触发器,DML触发器分为After触发器和Instead Of触发器。

After触发器:这类触发器是在记录已经改变完之后(after),才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用Rollback Transaction语句来回滚本次的操作。

Instead Of触发器:这类触发器一般是用来取代原本的操作,在记录变更之前发生的,它并不去执行原来SQL语句里的操作(Insert、Update、Delete),而去执行触发器本身所定义的操作。

简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法

简单使用触发器SQL触发器的使用及语法SQL触发器是一种特殊类型的存储过程,它是在数据库中一些特定的操作发生时自动执行的。

触发器可以用于在数据被插入、更新或删除时执行一系列的操作。

本文将详细介绍SQL触发器的使用和语法。

1.触发器的类型:SQL触发器可以分为三种类型:插入触发器(INSERT trigger)、更新触发器(UPDATE trigger)和删除触发器(DELETE trigger)。

根据业务需求选择相应的触发器类型。

2.创建触发器:创建触发器需要使用CREATETRIGGER语句。

语法如下:CREATE TRIGGER <trigger_name>{BEFORE,AFTER,INSTEADOF}{INSERT,UPDATE,DELETE}[ON <table_name>][FOREACHROW][WHEN (<condition>)]BEGIN--触发器执行的操作END;其中,trigger_name是触发器的名称;BEFORE / AFTER / INSTEAD OF表示触发器在所指定操作之前、之后或者代替进行;INSERT / UPDATE/ DELETE表示触发器响应的操作类型;table_name是触发器所绑定的表名;FOR EACH ROW表示该触发器对每一行数据都执行;condition是触发器的条件。

3.触发器执行的操作:在触发器的BEGIN和END之间,可以进行一系列的操作,如执行SQL 语句、调用存储过程等。

可以根据业务需求在触发器中编写逻辑代码来满足需求。

4.触发器的应用场景:-数据完整性:可以使用触发器在插入、更新或删除数据时进行一些验证,确保数据的完整性。

例如,在插入新用户之前,可以在触发器中检查用户的必填字段是否为空。

-数据同步:可以使用触发器在数据更新时自动更新其他相关表中的数据,确保数据的同步。

例如,在更新订单信息时,可以在触发器中更新库存表中的相应数据。

SQLServer的触发器介绍和创建使用教程

SQLServer的触发器介绍和创建使用教程

SQLServer的触发器介绍和创建使用教程SQL Server 触发器触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。

触发器主要是通过事件进行触发被自动调用执行的。

而存储过程可以通过存储过程的名称被调用。

什么是触发器触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。

触发器一般用在check约束更加复杂的约束上面。

触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。

诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。

SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。

DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。

而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。

既可以在表上定义instead of触发器,也可以在视图上定义。

触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。

这两张是逻辑表也是虚表。

有系统在内存中创建者两张表,不会存储在数据库中。

而且两张表的都是只读的,只能读取数据而不能修改数据。

这两张表的结果总是与被改触发器应用的表的结构相同。

当触发器完成工作后,这两张表就会被删除。

Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

对表的操作Inserted逻辑表Deleted逻辑表增加记录(insert)存放增加的记录无删除记录(delete)无存放被删除的记录修改记录(update)存放更新后的记录存放更新前的记录Update数据的时候就是先删除表记录,然后增加一条记录。

SQL中触发器的使用

SQL中触发器的使用

SQL中触发器的使⽤创建触发器是特殊的存储过程,⾃动执⾏,⼀般不要有返回值类型: 1.后触发器(AFTER,FOR)先执⾏对应语句,后执⾏触发器中的语句 2.前触发器并没有真正的执⾏触发语句(insert,update,delete),⽽是执⾏触发后的语句 3.⾏级触发器(FOR EACH ROW)在SQL server 中不存在商品号为1的库存量:1.后触发器(实现不同表之间的约束)--实现在销售量不⼤于库存量时,每卖出n件商品,对应商品的库存要减n,若销售量⼤于库存量,则回滚此次操作IF EXISTS (SELECT *FROM sysobjects WHERE name='tr_SaleCommodity')DROP TRIGGER tr_SaleCommodityGOCREATE TRIGGER tr_SaleCommodityON OrderInfo FOR INSERT --FOR/AFTER为后触发器ASBEGINIF EXISTS (SELECT * FROM inserted I INNER JOIN CommodityInfo C ON modityId=modityIdWHERE I.Amount>C.Amount)BEGINROLLBACK --后触发器PRINT '商品的销售量⼤于商品的库存量'ENDELSEBEGINUPDATE CommodityInfoSET Amount=Amount-(SELECT Amount FROM inserted)WHERE CommodityId IN(SELECT CommodityId FROM inserted)ENDENDGO执⾏:INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)VALUES('YOUYOU',1,10,600,'⽹上银⾏','2014-11-11 00:00:00.000',1,1)结果: 注意:1.上⼀⾏为销售记录,下⼀⾏为商品1的信息 2.卖出10个,库存量由48变为38  3.可以看出以上的销售记录中的Paymoney是不正确的,它的值应该是Amount*OutPrice=10*300,所以需要前触发器来约束2.前触发器(可以实现⾏级触发器功能)--实现了⽇期校验和⽀付⾦额的计算IF EXISTS(SELECT* FROM sysobjects WHERE name='tr_DateConfim')DROP TRIGGER tr_DateConfimGOCREATE TRIGGER tr_DateConfimON OrderInfo INSTEAD OF INSERT ,UPDATEASBEGINDECLARE @date datetimeSELECT @date=OrderTime FROM insertedIF @date BETWEEN '2012-1-1' AND '2015-1-1'BEGINDECLARE @UserId varchar(20) ,@CommodityId int,@Amount int,@PayMoney money,@PayWay varchar(20),@OrderTime datetime,@Confirm int,@SendGoods intSELECT @UserId=UserId,@CommodityId=CommodityId,@Amount=Amount,@PayWay=PayWay,@OrderTime=OrderTime,@Confirm=Confirm,@SendGoods=SendGoods FROM insertedDECLARE @outPrice moneySELECT @outPrice=OutPrice FROM CommodityInfo WHERE CommodityId=@CommodityIdSET @PayMoney=@outPrice*@AmountPRINT 'inserted 中的数据:'+CONVERT(varchar(20),@UserId)+''+CONVERT(varchar(20),@CommodityId)+''+CONVERT(varchar(20),@Amount)+''+CONVERT(varchar(20),@PayMoney)+''+CONVERT(varchar(20),@PayWay)+ INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayMoney,PayWay,OrderTime,Confirm,SendGoods)SELECT UserId,CommodityId,Amount,@PayMoney,PayWay,OrderTime,Confirm,SendGoods FROM insertedENDELSEPRINT '你插⼊的数据中的时间只能在 2012-1-1 到 2015-1-1 中间'ENDGO执⾏:INSERT INTO OrderInfo(UserId,CommodityId,Amount,PayWay,OrderTime,Confirm,SendGoods)VALUES('YOUYOU',1,5,'⽹上银⾏','2013-1-11',1,1) 注意:这⾥插⼊时我并没有定义PayMoney,PayMoney是通过触发器来⾃动计算的结果:⽇期不正确:⽇期正确:打印信息对应:@UserId+' '+@CommodityId+' '+@Amount+' '+@PayMoney+' '+@PayWay+' '@OrderTime+' '@Confirm+' '+@SendGoods+' '@outPrice3.⾏级触发器(错误)执⾏结果:可以看出在SQL server中并不⽀持⾏级触发器。

sql触发器实例

sql触发器实例

sql触发器实例触发器(Trigger)是数据库管理系统(DBMS)中的一种规则,它会在指定的数据库表发生特定事件(如插入、更新或删除)时自动执行。

下面我将为你展示一个简单的SQL 触发器示例。

示例场景假设我们有一个名为employees的表,用于存储员工信息,包括id, name, 和salary。

我们想创建一个触发器,确保每当有新员工添加时,他们的工资不能超过某个特定的值。

1.创建employees 表sqlCREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),salary DECIMAL(10, 2));2.创建触发器我们创建一个名为check_salary的触发器,当在employees表中插入新记录时,它会检查工资是否超过了5000。

如果超过了,触发器将中止插入操作。

sqlDELIMITER //CREATE TRIGGER check_salary BEFORE INSERT ON employeesFOR EACH ROWBEGINIF NEW.salary > 5000THENSIGNAL SQLSTATE'45000'SET MESSAGE_TEXT = 'Salary exceeds maximum limit';END IF;END;//DELIMITER ;在这个触发器中:•BEFORE INSERT ON employees指定了触发器是在向employees表插入新记录之前触发。

•FOR EACH ROW表示这个触发器会对插入操作中的每一行单独触发。

•IF NEW.salary > 5000检查即将插入的新记录的工资是否超过5000。

•SIGNAL SQLSTATE '45000'在工资超过限制时发出一个错误信号,中止插入操作。

3.测试触发器现在我们尝试插入一些记录来测试触发器的功能。

SQL Server 2014触发器手把手实战

SQL Server 2014触发器手把手实战

原创内容,下载后删除举行图,内容可见
如何创建触发器(如何禁止递归)
• 多说几句:心细的人这里可能会问了。如果是Update触发 器引发新的Update,那岂不是一直循环下去了? • 确实有这种情况,称之为递归(recursion )。
触发器有两种递归方式: 1. 直接递归 A表上的触发器更改(插入/删除/更新)A表数据,导致A表的触发器再次触 发,这种状况称之为直接递归; 2. 间接递归 A表上的触发器更新B表数据,导致触发B表触发器;而B表触发器又更改A表 数据,导致A表触发器再次触发,这种状况称之为间接递归
如何创建触发器(4)
④ 编译并执行触发器,如下图按钮dentifier ”*****“ could not be bound.”诸如此类的,那肯定还是SQL语句的语法 有毛病,您再检查检查。
⑤ 如果触发器执行成功,则 会出现下面的画面:
若要禁用间接递归,请使用 sp_configure 将 nested triggers 服务器选项设置为 0
原创内容,下载后删除举行图,内容可见
exec sp_configure 'nested triggers', 0 --第二个参数为 1 则为允许
管理触发器
1,修改:修改触发器则是将创建它的语法中的create改成 alter就可以了。 2,删除:drop trigger 3,启用和禁用:alter table语句用于启用和禁用触发器,语 法:alter table table {enable|disable}trigger,其中enable为启 用,disable为禁用 4,列出所有触发器:我不知道别人是怎么做的。我只知道 脚本执行的方式,呵呵: select * from sysobjects where xtype='TR'

数据库课件SQL-触发器

数据库课件SQL-触发器

CREATE TRIGGER trigger_name ON { table | view } { {{FOR|AFTER|INSTEADOF}{[INSERT][,][UPDATE][,][ DELETE] } AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] }] sql_statement [ ...n ] } }
触发器(TRIGGER) 触发器(TRIGGER)
触发器是一种特殊类型的存储过程, 触发器是一种特殊类型的存储过程,一种与 存储过程 数据表紧密关联的特殊的存储过程, 数据表紧密关联的特殊的存储过程,当该数 据表有插入( )、更改 据表有插入(INSERT)、更改(UPDATE) )、更改( ) 或删除(DELETE)事件发生时,所设置的 或删除( )事件发生时, 触发器就会自动被执行。 与一般意义上的存储过程不同, 与一般意义上的存储过程不同,触发器可以 说是当触发器表内容被更改时自动执行的存 储过也不能传递或接 受参数 帮助我们更好的维护数据库中数据的完整性
Deleted逻辑表 Deleted逻辑表
在学生表中建立删除触发器tr_deleteS,该触发器 , 在学生表中建立删除触发器 在删除学生表中的记录时触发, 在删除学生表中的记录时触发,将从与选课表中相 应学生记录删除。 应学生记录删除。 create trigger tr_deleteS on student after delete as delete from sc where sno in (select sno from deleted)

SQL触发器的创建和使用

SQL触发器的创建和使用

SQL触发器的创建和使用SQL触发器(trigger)是用来更改或响应数据库系统中的特定动作或事件的数据库对象,可以定义它们在表中特定数据发生一定的变化时自动地执行的SQL语句,一旦被触发,触发器就会自动地执行被定义的SQL语句。

在SQL Server 2005中,可以创建触发器来实现数据库的安全性和完整性。

触发器的定义可以放置在视图之外,以便于管理,可以动态地添加,修改和删除触发器,也可以创建多种不同的触发器。

一.创建触发器在SQL Server 2005中,可以使用CREATE TRIGGER语句来创建触发器。

如下所示:SQLCREATE TRIGGER trg_Customer_InsertON Customer FOR INSERTASBEGIN-- Trigger logic goes hereEND上面的语句创建一个名为 trg_Customer_Insert 的触发器,作用在Customer 表上,当 INSERT 操作发生时,则自动执行 Trigger logic。

二.使用触发器一旦触发器被创建,有两种方法可以使其起作用,即:对表的INSERT操作对表的UPDATE操作在使用触发器之前,有必要检查它的权限问题,因为只有拥有ALTER 权限的用户才能执行CREATETRIGGER或ALTERTRIGGER的操作。

1.对表的INSERT操作当插入一条记录到表中时,触发器将会自动执行:SQLINSERT INTO Customers( CustomerID, CustomerName, Address, City, State, ZipCode )2.对表的UPDATE操作当更新表中的记录时,触发器将会自动执行:SQLUPDATE CustomersSET Address = '456 Main Street'三.其他常用语句1.删除触发器。

SQL 第12章 触发器.ppt

SQL 第12章 触发器.ppt
7
▪ 2. 创建INSERT触发器 ▪ 下面以为表student建立一个插入触发器为例,介绍创建
INSERT触发器的方法。 ▪ 当某个班级增加一名学生,即向表student中插入一行数据时,
需要更改该学生所在班级的记录,以增加该班级的学生总人数。 下例使用INSERT触发器自动完成这个工作。 【例12-1】为student表建立INSERT触发器以自动更新class表学 生人数。
12
• ② 执行插入触发器中的语句。首先定义了一个变量 @NumOfStudent来检查class表中对应班级的学生人数, 如果学生人数为0(这种情况可能发生在新添加一个班级 等)则重新统计该班级的学生人数,否则直接把该班级 的学生人数加1(当然也可以不用判断,而在每次触发时 都重新统计学生人数)。
• ③ 如果整个过程中某个环节出现错误,或执行到 ROLLBACK语句,系统将回滚整个操作,包括对student 表学生记录的插入和对class表student_num的修改。
▪ 从事务角度来说,触发器与触发它的语句(如:INSERT语 句)可看作同一个事务的不同部分。在执行了插入操作后我 们看到结果显示了两次“(所影响的行数为 1 行)”的提示。 第一次表示插入操作成功,第二次表示由插入数据操作引发 的执行INSERT触发器操作对student_num列修改成功。
▪ sql_statement :指定触发器执行的SQL语句。
▪ 触发器只能在当前数据库中创建,并且一个触发器只能作用在 一个表上。在同一条 CREATE TRIGGER 语句中,可以为多种 用户操作(如 INSERT 和 UPDATE)定义相同的触发器操作。 值得注意的是,在SQL Server 2000中也可以对视图建立触发 器,只要将视图名称作为table_name用在创建语法中就可以了。 但是,对视图建立触发器有一些限制,详细信息请参考SQL Server 2000联机丛书。

SQL 触发器的创建和使用(SQL2005)

SQL 触发器的创建和使用(SQL2005)
2013年8月4日 第17页



DML 触发器使用 deleted 和 inserted 逻辑表。 它们在结构上和触发器所在的表的结构相同, SQL Server会自动创建和管理这些表。可以使用 这两个临时的驻留内存的表测试某些数据修改的 效果及设置触发器操作的条件。 Deleted表用于存储delete,update语句所影响 的行的副本。在执行delete或update语句时,行 从触发器表中删除,并传输到deleted表中。 Inserted表用于存储Insert或update语句所影响 的行的副本,在一个插入或更新事务处理中,新 建的行被同时添加到Inserted表和触发器表中。 Inserted表中的行是触发器表中新行的副本。
10.2 DML触发器的创建和应用
♦ 如果一个表的外键包含对定义的 DELETE或UPDATE 操作 的级联,则不能定义INSTEAD OF 和INSTEAD OF UPDATE触发器 ♦ 虽然TRUNCATE TABLE 语句类似于没有WHERE子句(用 于删除行)的DELETE语句,但它并不会引发DELETE触发 器,因为TRUNCATE TABLE 语句没有记录。 ♦ 如果指定了触发器架构名称来限定触发器,则将以相同的方 式限定表名称。 ♦ 在触发器内可以指定任意的 SET 语句。选择的 SET 选项在 触发器执行期间保持有效,然后恢复为原来的设置。 ♦ 在 DML 触发器中不允许使用下列 Transact-SQL 语句: ALTER DATABASE、CREATE DATABASE、DROP DATABASE、RECONFIGURE、LOAD LOG、LOAD DATABASE、RESTORE LOG、RESTORE DATABASE
第5页
10.1.1 触发器的概念 当创建数据库对象或在数据表中插入记录、修改 记录或者删除记录时,SQL Server就会自动 执行触发器所定义的SQL语句,从而确保对数 据的处理必须符合由这些SQL语句所定义的规 则。触发器和引起触发器执行的SQL语句被当 作一次事务处理,如果这次事务未获得成功, SQL Server会自动返回该事务执行前的状态 例 如 , 当 对 某 一 个 表 进 行 诸 如 UPDATE 、 INSERT、DELETE这些操作时,SQL Server 就会自动执行触发器所定义的T-SQL语句,从 而确保对数据的处理必须符合由这些T-SQL语 句所定义的规则。

sql触发器的使用及语法

sql触发器的使用及语法

sql触发器的使用及语法
数据库触发器(Database Trigger)是指在特定条件出发时,自
动执行由用户定义的sql语句或存储过程的数据库功能。

它和视图、
存储过程、函数、索引一样,都是数据库对象,也是定制数据库应用
系统优化的重要工具。

触发器是在特定事件(通常是在表上发生操作的时候)发生时,
自动触发执行的一系列sqldml语句,可以在预定的约束条件下实现完
整的逻辑校验功能,从而保证数据的有效性。

一个触发器的语法格式:`CREATE TRIGGER trigger_name` `ON table_name` `[AFTER|BEFORE]` `[INSERT|UPDATE|DELETE]` `AS`
`[FOR EACH ROW]` `BEGIN -- trigger body END`
它的各个部分的含义依次为:
创建触发器:`CREATE TRIGGER` 是触发器首部,用于声明开始
和结束触发器定义,并定义触发器的名称;
触发表:`ON table_name` 是触发器触发条件,即表上发生变动
时触发器才会被触发;
触发事件:`[AFTER|BEFORE] [INSERT|UPDATE|DELETE]` 是定义
触发器触发时间及操作,也就是定义在什么时候要触发(`AFTER` 或
`BEFORE`),用什么操作触发(`INSERT`、`UPDATE` 或 `DELETE`);
`AS`:用来标识触发器的有效范围,`FOR EACH ROW` 是指每笔
资料发生变化时都会触发;
触发体:`BEGIN -- trigger body END` 是定义具体要触发的操作。

flinksql trigger用法

flinksql trigger用法

flinksql trigger用法1. 引言1.1 概述在大数据时代,实时数据处理变得日益重要。

为了满足对实时数据处理的需求,Apache Flink成为了一个流行的流处理框架。

FlinkSQL作为Flink框架的一个模块,提供了一种以SQL语言来描述和操作流式和批式数据的方式。

本文将重点介绍FlinkSQL中触发器(trigger)的用法。

通过触发器,我们可以基于时间或数据量等条件来控制流式数据处理中的事件触发和状态管理。

通过深入理解和使用FlinkSQL中的触发器功能,我们能够更好地把握实时流处理任务的执行逻辑,并根据需要对其进行灵活配置和优化。

1.2 文章结构本文将按照以下结构来介绍FlinkSQL中触发器的用法:2. FlinkSQL 简介:首先介绍FlinkSQL概念、用途和优势,以及与传统SQL语法的区别。

3. Trigger 的基本概念:接着详细讲解触发器(trigger)在数据处理中的基本概念,包括其功能、分类以及应用场景等内容。

4. FlinkSQL 中的Trigger 用法:然后具体介绍FlinkSQL中如何使用触发器。

分别从基于时间、基于数据量以及自定义触发逻辑和状态管理等角度,给出触发器的使用示例。

5. 结论与展望:最后对触发器在FlinkSQL中的作用和用法进行总结,并展望未来触发器在实时数据处理中的应用前景和优化方向。

通过以上结构,读者将能够逐步了解FlinkSQL中触发器的基本概念、用法以及其在实时数据处理中的重要性。

这将有助于读者更深入地理解和应用FlinkSQL 框架,在实际场景中灵活运用触发器来实现高效的数据处理和分析。

2. FlinkSQL 简介2.1 FlinkSQL 概述FlinkSQL是基于Apache Flink的一个模块,用于实现对流式和批处理数据的分析和处理。

它提供了一种使用标准SQL语句来进行实时数据处理的方式,使得开发人员可以利用自己熟悉的SQL语法快速地编写、调试和优化数据处理逻辑。

SQL Server数据库教程-触发器

SQL Server数据库教程-触发器


2.2 使用T-SQL语言创建DML触发器
【例2】 在stsc 数据库的student表上创建一个触发器trig_stu,在 student表插入、修改、删除数据时,显示该表所有记录。
USE stsc GO/* CREATE TRIGGER必须是批处理的第一条语句,此处GO不能缺少 */ CREATE TRIGGER trig_stu /*创建触发器trig_stu */
ON { table | view }
/*指定操作对象*/
[ WITH ENCRYPTION ] /*说明是否采用加密方式*/
{ FOR |AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }/*指定激活触发器的动作*/

3.2 使用UPDATE触发器
当执行UPDATE操作时,UPDATE触发器将被激活。当在一个有 UPDATE触发器的表中修改记录时,表中原来的记录被移动到deleted表中 ,修改过的记录插入到inserted表中。
【例4】 在stsc 数据库的student表上创建一个UPDATE触发器 trig_update,防止用户修改student表的总学分。
触发器与存储过程的差别如下: ●触发器是自动执行,而存储过程需要显式调用才能 执行。 ● 触发器是建立在表或视图之上的,而存储过程是建 立在数据库之上的。

1 触发器概述
触发器作用如下: ● SQL Server 提供约束和触发器两种主要机制来 强制使用业务规则和数据完整性,触发器实现比 CHECK 约束更为复杂的限制。 ● 可对数据库中的相关表实现级联更改。 ● 可以防止恶意或错误的 INSERT、UPDATE 和 DELETE 操作, ●可以评估数据修改前后表的状态,并根据该差 异采取措施。 ● 强制表的修改要合乎业务规则。

sql触发器实例

sql触发器实例

sql触发器实例摘要:1.SQL 触发器的概念2.SQL 触发器的分类3.SQL 触发器的实例4.SQL 触发器的作用5.SQL 触发器的使用注意事项正文:1.SQL 触发器的概念SQL 触发器是一种在对数据库中的表执行某些操作(如插入、更新或删除数据)时自动执行的存储过程。

它可以在数据表发生变更时,自动地更新其他相关表的数据,或者执行一些特定的操作,如日志记录、数据验证等。

2.SQL 触发器的分类SQL 触发器主要分为两类:(1)INSERT 触发器:在向表中插入数据时自动执行的触发器。

(2)UPDATE/DELETE 触发器:在更新或删除表中数据时自动执行的触发器。

3.SQL 触发器的实例假设有一个名为“订单”的表(order),包含以下字段:订单号(order_id)、客户名(customer_name)、订单日期(order_date)和订单状态(order_status)。

当更新订单状态时,希望将订单日期更新为当前日期。

可以使用以下方法创建一个UPDATE 触发器:```sqlCREATE TRIGGER update_order_dateAFTER UPDATE ON orderFOR EACH ROWBEGINSET NEW.order_date = NOW();END;```在这个实例中,当更新订单表中的数据时,触发器将自动更新订单日期为当前日期。

4.SQL 触发器的作用SQL 触发器的主要作用有以下几点:(1)数据一致性:确保数据库中数据的一致性,如在更新订单表时自动更新其他相关表的数据。

(2)数据验证:在数据插入、更新或删除之前进行数据验证,确保数据的合法性。

(3)日志记录:记录数据库操作日志,便于追踪和审计。

(4)性能优化:减少应用程序中的重复代码,提高执行效率。

5.SQL 触发器的使用注意事项(1)避免循环引用:在使用触发器时,需要注意避免触发器之间的循环引用,否则可能导致数据库无限循环执行。

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析数据库开发-sql server触发器如何使用实例解析在数据库开发中,触发器是一种特殊的存储过程,它会在数据库表发生特定事件时自动执行。

触发器可以帮助我们实现数据的自动化处理和一些复杂的业务逻辑。

在本文中,我将详细介绍SQL Server触发器的使用实例,以帮助您更好理解和应用这一重要的数据库开发技术。

1. 触发器的基本概念在开始之前,让我们先来了解一下触发器的基本概念。

触发器是一种特殊的存储过程,它与数据库表相关联,并在表发生特定事件时自动执行。

这些特定事件包括INSERT、UPDATE和DELETE操作。

触发器可以在数据被修改之前或之后执行,这取决于触发器的类型,分为BEFORE和AFTER两种。

2. SQL Server触发器的创建在SQL Server中,我们可以使用CREATE TRIGGER语句来创建触发器。

以下是一个简单的创建触发器的示例:```sqlCREATE TRIGGER [触发器名称]ON [表名]FOR INSERT, UPDATE, DELETEASBEGIN-- 触发器的逻辑代码END```在上面的示例中,[触发器名称]表示触发器的名称,[表名]表示要关联的数据库表,FOR子句指定了触发器要响应的事件类型,AS子句中包含了触发器的逻辑代码。

3. 触发器的使用实例现在让我们来看一个实际的使用实例,假设我们有一个名为Student的表,其中包含了学生的尊称和芳龄信息。

我们想要在插入新的学生信息时,自动向另外一个名为StudentLog的表中插入一条日志信息,以便记录学生信息的变更历史。

我们可以通过触发器来实现这一功能。

```sqlCREATE TRIGGER trgAfterInsertON StudentAFTER INSERTASBEGININSERT INTO StudentLog (操作类型, 学生尊称, 操作时间)SELECT '新增', inserted.尊称, GETDATE()FROM insertedEND```在上面的示例中,我们创建了一个AFTER INSERT类型的触发器,当向Student表中插入新记录时,触发器会自动执行并向StudentLog 表中插入一条日志信息。

SQL数据库之触发器

SQL数据库之触发器

8.1.1、存储过程的概念
3、使用存储过程的优点 l 执行速度快:存储过程在创建时已经通过语法检查和编译,调用 时则直接执行,程序的运行效率高,其执行速度要比标准SQL语句快 得多。含有大量SQL语句的批处理需要重复多次执行时,定义为存储 过程可大大提高运行效率。 l 有利于模块化程序设计:存储过程创建后,即可以无数次随时任 意繁荣调用。可根据不同的功能模式设计不同的存储过程以供调用。 l 便于程序的维护管理:当用户对数据库使用的功能改变时,只需 对相应的存储过程进行修改而不用修改应用程序。 l 减少网络通信量:存储过程可包含大量对数据库进行复杂操作的 SQL语句,它的存储执行都在SQL Server服务器(数据库)端,网络 用户使用时只需发送一个调用语句就可以实现,大大减少了网络上 SQL语句的传输。 l 保证系统的安全性:可以在存储过程中设置用户对数据的访问权 限,只允许用户调用存储过程而不允许直接对数据进行访问,充分 发挥安全机制的作用。
【实例练习8-1】
建立一个名为“商品_pro1”的存储过程,带有一个参数接收指定的 商品名称,在“进货表2006”“供货商表”“商品一览表”中查询该产 品的供货商及进货信息。 USE diannaoxs IF exists( SELECT name FROM sysobjects WHERE name='商品_pro1' AND type='p') DROP procedure 商品_pro1 GO CREATE procedure 商品_pro1 @商品名 nvarchar(8) AS SELECT 进货日期, 供货商, j.货号, 货名, 数量, 进价 FROM 进货表2006 j join 供货商表 g ON j.供货商ID=g.供货商ID join 商品一览表 s ON j.货号=s.货号 WHERE s.货名=@商品名 GO EXECUTE 商品_pro1 '计算机' -- 运行结果与图8-1相同 再输入代码:EXEC 商品_pro1 '显示器' --结果如图8-2
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、创建一个简单的触发器
触发器是一种特殊的存储过程,类似于事件函数,SQL Server™ 允许为INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列T-SQL语句。

触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。

创建触发器用CREATE TRIGGER
CREATE TRIGGER 触发器名称
ON 表名
FOR I NSERT、UPDATE 或DELETE
AS
T-SQL 语句
注意:触发器名称是不加引号的。

如下是联机丛书上的一个示例,当在titles 表上更改记录时,发送邮件通知MaryM。

CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE
AS
EXEC master..xp_sendmail 'MaryM',
'Don''t forget to print a report for the distributors.'
二、删除触发器
用查询分析器删除
在查询分析器中使用drop trigger 触发器名称来删除触发器。

也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称...
注意:触发器名称是不加引号的。

在删除触发器之前可以先看一下触发器是否存在:
if Exists(select name from sysobjects where name=触发器名称and xtype='TR') 用企业管理器删除
在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。

三、重命名触发器
用查询分析器重命名
exec sp_rename 原名称, 新名称
sp_rename 是SQL Server™ 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

用企业管理器重命名
在表上点右键->“所有任务”->“管理触发器”,选中所要重命名的触发器,修改触发器语句中的触发器名称,点击“确定”。

四、more....
INSTEAD OF
执行触发器语句,但不执行触发触发器的SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行delete 语句。

例:
create trigger f
on tbl
instead of delete
as
insert into Logs...
IF UPDATE(列名)
检查是否更新了某一列,用于insert 或update,不能用于delete。

例:
create trigger f
on tbl
for update
as
if update(status) or update(title)
sql_statement --更新了status 或title 列
inserted、deleted
这是两个虚拟表,inserted 保存的是insert 或update 之后所影响的记录形成的表,delet ed 保存的是delete 或update 之前所影响的记录形成的表。

例:
create trigger tbl_delete
on tbl
for delete
as
declare @title varchar(200)
select @title=title from deleted
insert into Logs(logContent) values('删除了title 为:' + title + '的记录')
说明:如果向inserted 或deleted 虚拟表中取字段类型为text、image 的字段值时,所取得的值将会是 null。

五、查看数据库中所有的触发器
在查询分析器中运行:
use数据库名
go
select * from sysobjects where xtype='TR'
sysobjects保存着数据库的对象,其中xtype 为TR 的记录即为触发器对象。

在name 一列,我们可以看到触发器名称。

六、sp_helptext查看触发器内容
用查询分析器查看
use数据库名
go
exec sp_helptext '触发器名称'
将会以表的样式显示触发器内容。

除了触发器外,sp_helptext 还可以显示规则、默认值、未加密的存储过程、用户定义函数、视图的文本
用企业管理器查看
在表上点右键->“所有任务”->“管理触发器”,选择所要查看的触发器存储过程
七、sp_helptrigger 用于查看触发器的属性
sp_helptrigger 有两个参数:第一个参数为表名;第二个为触发器类型,为char(6) 类型,可以是INSERT、UPDATE、DELETE,如果省略则显示指定表中所有类型触发器的属性。

例:
use数据库名
go
exec sp_helptrigger tbl
八、递归、嵌套触发器
递归分两种,间接递归和直接递归。

我们举例解释如下,假如有表1、表2名称分别为T1、T 2,在T1、T2 上分别有触发器G1、G2。

•间接递归:对T1 操作从而触发G1,G1 对T2 操作从而触发G2,G2 对T1 操作从而再次触发G1...
•直接递归:对T1 操作从而触发G1,G1 对T1 操作从而再次触发G1...
嵌套触发器
类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以T1 ->T2->T3...这样一直触发下去,最多允许嵌套32 层。

设置直接递归
默认情况下是禁止直接递归的,要设置为允许有两种方法:
•T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true
•EM:数据库上点右键->属性->选项。

设置间接递归、嵌套
默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法:
•T-SQL:exec sp_configure 'nested triggers', 0 --第二个参数为1 则为允许•EM:注册上点右键->属性->服务器设置。

九、触发器回滚
我们看到许多注册系统在注册后都不能更改用户名,但这多半是由应用程序决定的,如果直接打开数据库表进行更改,同样可以更改其用户名,在触发器中利用回滚就可以巧妙地实现无法更改用户名。

关键在最后两句,其解释为:如果更新了userName 列,就回滚事务。

十、禁用、启用触发器
禁用:alter table 表名disable trigger 触发器名称
启用:alter table 表名enable trigger 触发器名称
如果有多个触发器,则各个触发器名称之间用英文逗号隔开。

如果把“触发器名称”换成“ALL”,则表示禁用或启用该表的全部触发器。

相关文档
最新文档