SqlServer触发器的原理及案例
- 格式:doc
- 大小:144.00 KB
- 文档页数:24
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.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
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中。
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之间是触发器的逻辑代码。
触发器⏹触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化(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触发器例题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中触发器执行机制一、触发器概述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触发器详解触发器(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触发器(附有实例)触发器:即当发⽣某⼀事件时,如果满⾜给定条件,则执⾏相应的动作。
它的基本架构:触发器创建语法:(1)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASSql_statement[…n](2)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASIFUPDATE(column)[{AND|OR}UPDATE(COLUMN)][…]IF(COLUMNS_UPDATED())Sql_statement[…n]注:(不同数据库⽀持不同的类型触发器,有些还⽀持before类型触发器,像SQL server 就不⽀持before触发器)SQL Server⽀持两种类型的触发器AFTER触发器和INSTEAD OF 触发器,其中、AFTER触发器要求只有执⾏某⼀操作ISERT, UPDATE ,DELETE之后触发器才被触发。
1)INSTEAD OF 触发器表⽰并不执⾏其所定义的操作INSERT,UPDATE ,DELETE,⽽仅是执⾏触发器本⾝,既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器。
2)after 触发器(也叫“FOR”触发器)则会在触发 insert、update 或是delect 动作之后执⾏。
触发事件分为三类:UPDATE、DELETE和INSERT。
另外,定义触发器时,系统都都会⾃动⽣成两张表,我们是可以直接⽤的,如下:如下是实例(都是亲⼿实践过的):1.在表Student中建⽴删除触发器,实现表Student和表SC的级联删除,也就是只要删除表Student中的元组学号为s1,则表SC中SNO为s1的元组也要删除;建⽴完触发器后⽤企业管理器删除Student中学号为30的元组,看看表SC中SNO为30的选课记录是否也⼀起删除;create trigger t_std2 on studentinstead of deleteasbegindeclare @id char(5)select @id=sno from deleteddelete from sc where SNo =@iddelete from student where SNo=@idendgodelete from Student where SNo='00002'/*2. 在表Course中增加⼀个职业规划选修课,为(005,职业规划,4,0014),在表SC中建⽴⼀个触发器,实现规定年龄24岁以上(包括24岁)的学⽣才能选修职业规划这门课程,如果年龄⼩于24岁,则输出’年龄⼩于24,不能选修该门课程’,插⼊失败,⽤SQL语句在SC表中分别插⼊(‘00001’,’005’,null)和(‘00005’,’005’,null)看看结果;**/create trigger t_sc on scfor insertasbegindeclare @id char(5)select @id=sno from insertedif((select cno from inserted)='005' and (select sage from student where SNo= @id )<24)beginprint '年龄⼩于24,不能选修该门课程 'rollback transactionendelseprint 'nice!'endinsert into course values('005','职业规划','4','0014')insert into sc values('00001','005',null)insert into sc values('00005','005',null)select * from scgo3.在表SC中建⽴更改触发器,实现表SC中的修改后的成绩不能低于修改前的成绩,如果修改后的成绩低于修改前的成绩,则输出’修改后的成绩⽐修改前低,不能修改’,修改失败,⽤SQL语句把学号为00001,课程号为001的成绩分别改为90和70,看看结果;createtrigger t2_sc on scafter updateasif(update(score))begindeclare @score1 numeric(3,1),@score2numeric(3,1)select @score1=score from insertedselect @score2=score from deletedif(@score1>@score2 )print 'nice! 'elseupdate scset sc.Score=@score2 from sc,deletedwhere sc.SNo=deleted.SNo o=oprint '失败'endupdate scsetScore=70 where SNo='00001' and CNo='001'4. 在表Teacher中创建触发器,实现如果更新了表Teacher中的年龄和⼯资,则输出’更新了年龄和⼯资’,如果更新了年龄没有更新⼯资,则输出’更新了年龄’,如果更新了⼯资⽽没有更新年龄,则输出’更新了⼯资’,创建完后使⽤SQL语句把tno为001的年龄加1,把tno为002的⼯资加1,把tno为003的年龄和⼯资都加1,看看结果;create trigger t_teacher on teacherafter updateasbegindeclare @age int,@sal floatselect @age=age from deletedselect @sal=sal from deletedif(@age <> (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄和⼯资 'else if(@age <> (select age from inserted )and @sal =(select sal from inserted))print '更新了⼯资 'else if(@age = (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄 'endupdate Teacherset age=age+1 where Tno='0001'**//**5. 在不删除触发器的前提下,使3创建的触发器⽆效;alter table teacher disable trigger t_teacher**//**6. 创建⼀个名为tri_Delete_C的触发器,要求⾸先判断数据库中是否已经存在名为tri_Delete_C的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。
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是默认设置。