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.删除触发器。

  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”,则表示禁用或启用该表的全部触发器。

相关文档
最新文档