SqlServer触发器的原理及案例

合集下载

SQLServer-触发器使用实例

SQLServer-触发器使用实例

SQLServer 触发器使用实例触发器是一个特殊的存储过程。

常见的有三种:分别使用于Insert , Update , Delete 事件。

一、Trigger语法:create trigger tr_nameon table/view{for | after | instead of } [update][,][insert][,][delete][with encryption]as {batch | if update (col_name) [{and|or} update (col_name)] }说明:1 tr_name :名称2 on table/view :触发器所作用的表。

一个触发器只能作用于一个表3 for 和after :同义4 after 和instead of :sql 2000新增项目afrer 和instead of 的区别After在触发事件发生以后才被激活,只可以建立在表上Instead of代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。

此外,因为delete 操作只对行有影响,所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。

7 触发器执行时用到的两个特殊表:deleted ,inserteddeleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构和触发器作用的表结构是一样的,只是存放的数据有差异。

二、实例:实例1(注意这里的关联,条件是如何关联,update中set的值是和谁关联。

这些都可以从【触发器的两个临时表:inserted、deleted】中得到答案)比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号StudentName varchar(50),姓名)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然和这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

sqlserver中数据增删改 触发器写法

sqlserver中数据增删改 触发器写法

SQL Server是一种关系型数据库管理系统,用于在计算机和服务器上存储和检索数据。

在SQL Server中,数据的增删改操作是非常常见的,而触发器则是一种在数据库中定义的特殊的存储过程,它可以在数据被修改时自动执行。

本文将介绍SQL Server中数据增删改触发器的写法并提供实例演示。

一、触发器的基本概念1.1 触发器定义触发器是一种与表相关的数据库对象,它会在表上插入、更新或删除数据时自动执行。

1.2 触发器分类在SQL Server中,触发器分为INSERT触发器、UPDATE触发器和DELETE触发器,分别表示在数据插入、更新和删除操作时触发执行。

二、触发器的创建与使用2.1 创建触发器在SQL Server中,可以使用CREATE TRIGGER语句创建一个触发器,语法如下:```sqlCREATE TRIGGER trigger_nameON table_nameAFTER INSERT, UPDATE, DELETEASBEGIN-- 触发器执行的逻辑END```2.2 触发器的执行时机在创建触发器时,需要指定触发器执行的时机,包括AFTER和INSTEAD OF两种选项。

AFTER表示在数据操作之后执行触发器逻辑,而INSTEAD OF表示在数据操作之前执行触发器逻辑。

2.3 触发器的使用一旦创建了触发器,它会在指定的操作发生时自动执行,无需手动调用触发器。

三、触发器的编写实例下面我们以一个实际的案例,演示如何在SQL Server中编写数据增删改触发器。

3.1 创建测试表我们创建一个测试表TestTable,用于存储测试数据,表结构如下:```sqlCREATE TABLE TestTable(ID INT PRIMARY KEY,Name NVARCHAR(50))```3.2 创建INSERT触发器接下来,我们创建一个INSERT触发器,当往TestTable表中插入数据时,自动将数据插入到另一个备份表BackupTable中。

sqlserver数据库触发器的工作原理

sqlserver数据库触发器的工作原理

SQL Server数据库触发器是一种特殊类型的存储过程,它可以在数据库中的特定事件发生时自动执行。

触发器可以用于监视数据的变化并采取相应的操作,例如插入、更新或删除数据时触发某些业务逻辑。

本文将深入探讨SQL Server数据库触发器的工作原理,包括触发器的类型、创建和使用方法,以及一些最佳实践。

一、触发器的类型SQL Server中有两种类型的触发器:DML触发器和DDL触发器。

1. DML触发器DML触发器(Data Manipulation Language Trigger)是针对数据操作事件的触发器,包括INSERT、UPDATE和DELETE。

当这些事件发生时,DML触发器可以在受影响的表上自动执行相应的逻辑。

DML 触发器可以分为AFTER触发器和INSTEAD OF触发器。

- AFTER触发器:AFTER触发器在数据操作事件完成后触发,可以用于记录日志、更新其他相关表等操作。

- INSTEAD OF触发器:INSTEAD OF触发器可以代替原始的数据操作事件,允许用户在数据操作前执行自定义的逻辑,常用于数据验证和转换。

2. DDL触发器DDL触发器(Data Definition Language Trigger)用于监视数据库结构的变化,包括CREATE、ALTER和DROP等DDL语句的执行。

DDL触发器可以在这些数据库结构变化发生时执行相应的逻辑,如记录变更、阻止某些操作等。

二、触发器的创建和使用要创建触发器,首先需要使用CREATE TRIGGER语句定义并命名一个新触发器,然后指定触发器在哪些事件上触发,以及触发时执行的逻辑。

触发器逻辑通常是一段T-SQL代码,可以包含查询、条件判断、事务控制等操作。

1. 创建DML触发器要创建DML触发器,可以使用如下语法:```CREATE TRIGGER trigger_nameON table_nameAFTER/INSTEAD OF INSERT/UPDATE/DELETEASBEGIN-- trigger logicEND```在这个语法中,trigger_name是触发器的名称,table_name是触发器所在的表,AFTER/INSTEAD OF INSERT/UPDATE/DELETE指定触发的事件,BEGIN和END之间是触发器的逻辑代码。

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例

触发器⏹触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化(INSERT、UPDATE 或DELETE)时自动执行⏹触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句⏹主要用于强制复杂的业务规则或要求优点⏹自动执行⏹实现相关表层叠修改,实现多个表之间数据的一致性和完整性⏹实现比check约束更复杂的限制,可以引用其他表中的列触发器的类型⏹AFTER触发器:在数据变动(INSERT、UPDATE、DELETE操作)完成后激发,只能在表上定义,同一个表中可以有多个AFTER触发器⏹INSTEAD OF触发器:在数据变动以前被激发,并取代变动数据(INSERT、UPDATE、DELETE操作),转而去执行触发器定义的操作,可以定义在表或视图上,每个update、insert和delete语句最多可以定义一个INSTEAD OF触发器。

创建触发器⏹CREATE TRIGGER trigger_nameON { table | view } [ WITH ENCRYPTION ]{{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ UPDATE ] [, ][DELETE]}ASsql_statement [...n ]}触发器示例:⏹CREATE TRIGGER reminder ON titles FOR INSERT, UPDATEASRAISERROR (50009, 16, 10)指定触发器何时激发⏹AFTER 触发器在触发操作(INSERT、UPDATE 或DELETE)后和处理完任何约束后激发。

可通过指定AFTER 或FOR 关键字来请求AFTER 触发器。

⏹INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。

⏹对于每个触发操作(UPDATE、DELETE 和INSERT),每个表或视图只能有一个INSTEAD OF 触发器。

sqlserver触发器例题

sqlserver触发器例题

sqlserver触发器例题SQL Server 触发器是一种数据库对象,它可以在特定表上的数据发生更改时自动执行一系列操作。

触发器可以用于实现业务规则和数据完整性约束,以及跟踪数据变化等功能。

在本文中,我们将介绍两个 SQL Server 触发器的例题及其解决方案。

例题一:在一张名为"Employee"的表上创建一个触发器,以便在插入新员工记录时自动将当前日期作为"hire_date"字段的默认值。

解决方案:首先,我们需要使用下面的 SQL 命令创建一个名为"Employee"的表,并在该表中添加一个"hire_date"字段:```sql CREATE TABLE Employee ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), hire_date DATE ) ```接下来,我们可以使用下面的 SQL 命令创建一个名为"trg_Employee_Insert"的触发器:```sql CREATE TRIGGER trg_Employee_Insert ON Employee FOR INSERT AS BEGIN UPDATE Employee SET hire_date = GETDATE() WHERE employee_id IN (SELECT employee_id FROM inserted) END ```在这个触发器中,我们使用了"FOR INSERT"来指定触发器在插入操作之后执行。

然后,我们使用了"GETDATE()"函数来获取当前日期,并将其更新到"hire_date"字段中。

现在,当我们向"Employee"表中插入一条新的员工记录时,触发器将自动将当前日期作为"hire_date"字段的默认值:```sql INSERT INTO Employee (employee_id, employee_name) VALUES (1, 'John') ```例题二:在一张名为"Orders"的表上创建一个触发器,以便在删除订单记录时自动将相应的产品库存加回去。

sql server中触发器执行机制

sql server中触发器执行机制

SQL Server中触发器执行机制一、触发器概述1. 触发器是SQL Server数据库中一种特殊的存储过程,它在满足特定条件时自动执行。

触发器通常用于在数据库表上执行特定的业务逻辑或限制性操作。

二、触发器的分类2. 根据触发器的执行时间,可以分为AFTER触发器和INSTEAD OF触发器两种。

1) AFTER触发器:在触发事件完成之后自动执行。

2) INSTEAD OF触发器:在触发事件之前执行,可以替代原始操作。

三、触发器的执行顺序3. 当多个触发器同时应用于同一数据库表时,SQL Server将按照以下顺序执行触发器:1) INSTEAD OF触发器先于AFTER触发器执行。

2) 按照创建触发器的顺序执行。

四、触发器的创建和激活4. 创建触发器时,需要指定触发器的事件类型(INSERT、UPDATE或DELETE)及执行时机(BEFORE或AFTER)。

5. 触发器可在数据库表上激活或禁用,通过修改系统表sys.triggers的is_disabled字段实现。

五、触发器的执行条件6. 触发器的执行条件由触发事件、触发时机以及WHERE子句约束决定。

7. 触发器执行时,如果WHERE子句约束不满足,触发器将不会执行。

六、触发器的数据访问8. 触发器中可以通过INSERTED和DELETED临时表访问触发事件导致的数据变化。

1) INSERTED表包含插入、更新操作后的数据。

2) DELETED表包含删除、更新操作前的数据。

七、触发器的执行效率和性能9. 触发器的使用可能影响数据库的性能,在编写触发器时需要注意避免对数据库表进行过多的操作。

10. 在开发过程中,需要对触发器的执行效率进行评估和优化,以确保数据库的高性能。

八、触发器的安全性和可维护性11. 触发器可用于业务逻辑的强制执行和数据的保护,但过度使用触发器可能导致数据库的复杂性增加,降低数据库的可维护性。

12. 在设计数据库时,需要权衡触发器的使用和数据库的安全性、可维护性之间的关系,并尽量避免过度使用触发器。

SqlServer触发器详解

SqlServer触发器详解

SqlServer触发器详解触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,⽐如当对⼀个表进⾏操作( insert,delete,update)时就会激活它执⾏。

触发器经常⽤于加强数据的完整性约束和业务规则等。

触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

SQL3的触发器是⼀个能由系统⾃动执⾏对数据库修改的语句。

触发器可以查询其他表,⽽且可以包含复杂的SQL语句。

它们主要⽤于强制服从复杂的业务规则或要求。

例如:您可以根据客户当前的帐户状态,控制是否允许插⼊新订单。

触发器也可⽤于强制引⽤完整性,以便在多个表中添加、更新或删除⾏时,保留在这些表之间所定义的关系。

然⽽,强制引⽤完整性的最好⽅法是在相关表中定义主键和外键约束。

如果使⽤数据库关系图,则可以在表之间创建关系以⾃动创建外键约束。

触发器与存储过程的唯⼀区别是触发器不能执⾏EXECUTE语句调⽤,⽽是在⽤户执⾏Transact-SQL语句时⾃动触发执⾏。

查询数据库中所有触发器:select * from sysobjects where xtype='TR'1、语法create trigger [shema_name . ] trg_nameon { table | view }[ with encryption ]{ for | after | instead of }{ insert , update , delete }assql_statementinsert触发器实例create trigger teston alfor insertasdeclare @id int,@uid int,@lid int,@result charselect @id=id,@uid=uid,@lid=lid,@result=result from insertedif(@lid=4)beginupdate al set uid=99 where id=@idprint 'lid=4时⾃动修改⽤户id为99'endupdate触发器实例create trigger test_updateon alfor updateasdeclare @oldid int,@olduid int,@oldlid int,@newid int,@newuid int,@newlid intselect @oldid=id,@olduid=uid,@oldlid=lid from deleted;select @newid=id,@newuid=uid,@newlid=lid from insertedif(@newlid>@oldlid)beginprint 'newlid>oldid'rollback tran;endelseprint '修改成功'delete触发器实例create trigger test_deleteon alfor deleteasdeclare @did int,@duid int,@dlid intselect @did=id,@duid=uid,@dlid=lid from deletedif(exists(select * from list where @dlid=id))beginprint '⽆法删除'rollback tran;endelseprint '删除成功'图⽂介绍触发器数据库运⾏环境SqlServer2005触发器(trigger)是个特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,当对⼀个表进⾏操作( insert,delete, update)时就会激活它执⾏,触发器经常⽤于加强数据的完整性约束和业务规则等。

sqlserver编程之触发器

sqlserver编程之触发器

和表
修改操作 增加()记录 删除()记录 修改()记录
表 存放新增的记 录
存放更新后的 记录

存放被删除的 记录 存放更新前的 记录
表和表存放的信息
二、创建触发器
创建触发器的语法:
[] [, , ]
语句
表示加密触发器定义的文本 , , 指定触发器的类型
创建触发器
§ 和 是完全相等的,创建相同类型的触发器,在、 或 语句执行后触发
息表()中插入一条交易信息时,我们应
自动更新对应帐户的余额。
帐户信息表
张三开户1000元, 李四开户1元
交易信息表
张三取钱200 问题:
没有自动修改张三的余额
§分析: §在交易信息表上创建触发器 §从临时表中获取插入的数据行 §根据交易类型()字段的值是存入/支取, § 增加/减少对应帐户的余额。
§不像普通的存储过程,触发器不能被直接调用,也 不传递或接受参数
§当使用约束、规则、默认值就可以实现预定的数据 完整性时,应该优先使用前3种措施。
4.触发器的类型
§ 触发器 § 触发器 § 触发器
5和
触发器触发时: 系统自动在内存中创建表或表 只读,不允许修改;触发器执行完成后,自动删除 表 临时保存了插入或更新后的记录行 可以从表中检查插入的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚操作 表 临时保存了删除或更新前的记录行 可以从表中检查被删除的数据是否满足业务需求 如果不满足,则向用户报告错误消息,并回滚操作
触发器示例关键பைடு நூலகம்码
从表中获取交易类型、 交易金额等
(4) (10) ,
('支取')
=+ …..
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SqlServer触发器的原理及案例合理的选用触发器会让你的系统更高效2010Ssc目录第1章何为触发器 (3)1.1 触发器的'本质' (3)1.2 这样做带来的'功能': (3)1.3 触发器的作用 (3)1.4 说明: (3)第2章对触发器3种操作的分析 (4)2.1 创建触发器 (4)2.2 学习案例 (5)2.2.1 建立表 (5)2.2.2 触发器练习1 (5)2.2.3 触发器练习2: (6)第3章图形化操作触发器 (7)3.1 查看触发器情况 (7)第4章触发器中的变量操作 (11)第5章SQL触发器语法参考 (11)第1章何为触发器1.1触发器的'本质'触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录、更改记录或者删除记录时,当事件发生时,才被自动地激活。

1.2这样做带来的'功能':触发器可以用来对表实施复杂的完整性约束,保持数据的一致性,当触发器所保护的数据发生改变时,触发器会自动被激活,响应同时执行一定的操作(对其它相关表的操作),从而保证对数据的不完整性约束或不正确的修改。

触发器可以查询其它表,同时也可以执行复杂的T-SQL语句。

触发器和引发触发器执行的命令被当作一次事务处理,因此就具备了事务的所有特征。

注意:'事务具备什么特征?在触发器中的作用?'如果发现引起触发器执行的T-SQL语句执行了一个非法操作,比如关于其它表的相关性操作,发现数据丢失或需调用的数据不存在,那么就回滚到该事件执行前的SQL SERVER数据库状态。

1.3触发器的作用触发器可以对数据库进行级联修改,这一点刚才已经说过了。

需要说明的是:'触发器和约束的关系和区别'(1)一般来说,使用约束比使用触发器效率更高。

(2)同时,触发器可以完成比CHECK约束更复杂的限制。

1.4说明:1.与CHECK约束不同,在触发器中可以引用其它的表。

2.触发器可以发现改变前后表中数据的不一致,并根据这些不同来进行相应的操作。

3.2对于一个表不同的操作(INSERT、UPDATE、DELETE)可以采用不同的触发器,即使是对相同的语句也可以调用不同的触发器来完成不同的操作。

举例1:在签订一份订单时,货物的库存量应减少。

问?这应用了触发器的什么特征?CHECK约束能解决吗?举例2:正在进行整理的货物不能下订单。

问?这应用了触发器的什么特征?CHECK约束能解决吗第2章对触发器3种操作的分析在SQL SERVER为每个触发器都创建了两个专用表:inserted表和deleted表。

这是两个逻辑表,由系统来维护,在触发执行时存在,在触发结束时消失。

这样有什么用途?带着问题看,具体操作步骤和过程:(1)deleted表存放由于执行delete或update语句而要从表中删除的所有行。

在执行delete或update操作时,被删除的行从激活触发器的表中被移动(move)到deleted 表,这两个表不会有共同的行。

(2)inserted表存放由于执行insert或update语句而要向表中插入的所有行。

在执行insert或update事物时,新的行同时添加到激活触发器的表中和inserted表中,inserted表的内容是激活触发器的表中新行的拷贝。

说明:update事务可以看作是先执行一个delete操作,再执行一个insert操作,旧的行首先被移动到deleted表,让后新行同时添加到激活触发器的表中和inserted表中。

11.1.3 instead of 和after 触发器主要包括定义和应用范围条件,操作执行时机;2.1创建触发器1、考虑为什么要设计出发器,为解决什么问题而设计?2、应制定的内容:为什么,大家思考一下?不知道,看下面的例子,全看完!T-SQL语句创建触发器语法结构:/****************************/create trigger 触发器名on 表或视图for|after|instead of --操作时机insert,update,deleteassql语句/****************************/2.2学习案例2.2.1建立表在northwind表中建立2个表:cust_test和order_testcust_test: CustomerID char(5) PK order_test:CustomerID char(5)--对应关系Custcity Orderid PKCustname OrderNamesCStatus int OStatus int --状态Cstorage int Orders int --定购量和库存量Cdate date Odate date--日期2.2.2触发器练习1在cust_test表中建立删除触发器,实现上述2表的级联删除。

答案1:/****************************/use northwindgocreate trigger cust_orders_del1on Cust_testafter deleteasdelete from order_testwhere CustomerID in(select CustomerID from deleted)Go/****************************/2.2.3触发器练习2:在order_test表建立insert触发器,当向order_test表插入一行,如果cust_test表中对应记录status值为1,说明处于准备状态不能写入该数据。

/****************************/use northwindgocreate trigger cust_orders_ins2on order_testafter insertasif (select cstatus from cust_test,inserted wherecust_test.customerid=inserted.customerid)=1beginprint 'The Goods is being processed'rollback transactionendgo/****************************/第3章图形化操作触发器3.1查看触发器情况查看触发器的名称,拥有者和五个布尔值(2)sp_helptext 触发器名查看文本信息(3)设置某一触发器的无效和重新有效(4)删除触发器作业3:在order_test表上建立一个插入触发器,在添加一个订单时,减少cust_test表的相应货物的记录的库存量。

作业4:在order_test表上建立一个插入触发器,规定订单日期(Odate)不能手工修改。

作业5:要求订购的物品一定要在仓库中有的,并且数量足够。

例6:在order_test表上建立一个插入触发器,同时插入多行数据时,要求订购的物品一定要在仓库中有的。

答案3:答案4:答案5:答案6:Transact-SQL 参考SET ROWCOUNT使 Microsoft? SQL Server? 在返回指定的行数之后停止处理查询。

语法参数是在停止给定查询之前要处理的行数(整数)。

注释建议将当前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 语句重新编写为使用TOP 语法。

有关更多信息,请参见 DELETE、INSERT 或 UPDATE。

对于在远程表和本地及远程分区视图上执行的 INSERT、UPDATE 和 DELETE 语句,忽略 SET ROWCOUNT 选项设置。

若要关闭该选项(以便返回所有的行),请将 SET ROWCOUNT 指定为 0。

说明设置 SET ROWCOUNT 选项将使大多数 Transact-SQL 语句在已受指定数目的行影响后停止处理。

这包括触发器和 INSERT、UPDATE 及 DELETE 等数据修改语句。

ROWCOUNT 选项对动态游标无效,但限制键集的行集和不感知游标。

使用该选项时应谨慎,它主要与SELECT 语句一起使用。

如果行数的值较小,则 SET ROWCOUNT 替代 SELECT 语句 TOP 关键字。

SET ROWCOUNT 的设置是在执行或运行时设置,而不是在分析时设置。

权限SET ROWCOUNT 权限默认授予所有用户。

示例SET ROWCOUNT 在指定的行数后停止处理。

在下例中,注意有 x 行满足预付款少于或等于 $5,000 的条件;但是,从更新所返回的行数中可以看出并非所有的行都得到处理。

ROWCOUNT 影响所有的 Transact-SQL 语句。

下面是结果集:第4章触发器中的变量操作declare @djbhselect @djbh = 字段名from table_name第5章SQL触发器语法参考CreateTRIGGER trigger_nameON { table | view }[ WITH ENCRYPTION ]{{ { FOR |AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }[ WITH APPEND ][ NOT FOR REPLICATION ]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_name是触发器的名称。

触发器名称必须符合标识符规则,并且在数据库中必须唯一。

可以选择是否指定触发器所有者名称。

Table | view是在其上执行触发器的表或视图,有时称为触发器表或触发器视图。

可以选择是否指定表或视图的所有者名称。

WITH ENCRYPTION加密syscomments 表中包含Create TRIGGER语句文本的条目。

使用WITH ENCRYPTION 可防止将触发器作为SQL Server复制的一部分发布。

AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。

所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

如果仅指定FOR 关键字,则AFTER是默认设置。

相关文档
最新文档