sqlserver SQL触发器的使用及语法
- 格式:docx
- 大小:23.42 KB
- 文档页数:9
sql server触发器的基本语法和使用方法一、引言SQL Server触发器是一种数据库对象,它在数据库表上定义在特定事件发生时自动执行的操作。
触发器基于定义的事件和条件进行触发,并执行一系列预定的操作。
本文将介绍SQL Server触发器的基本语法和使用方法,帮助您更好地理解和应用触发器。
二、触发器的语法触发器的语法主要由以下几个部分组成:1. 触发器名称:指定触发器的名称,以便在创建触发器时进行命名和识别。
2. 触发器事件:指定触发器应何时触发,常见的触发器事件包括INSERT、UPDATE和DELETE等。
3. 触发器模式:指定触发器在事件发生时执行的操作,包括对表数据的插入、更新和删除等操作。
4. 触发器所在的架构:指定触发器所在的架构,以便在创建触发器时指定正确的架构。
基本语法示例:CREATE TRIGGER trigger_name ON table_name FOR INSERT, UPDATE, DELETE AS BEGIN -- 触发器操作代码 END;三、触发器的使用方法1. 创建触发器:使用CREATE TRIGGER语句创建触发器,指定触发器的名称、事件、模式和所在的架构。
2. 禁用和启用触发器:使用ALTER TRIGGER语句来禁用和启用触发器,以满足特定需求或临时更改触发器的行为。
3. 修改触发器:使用ALTER TRIGGER语句修改现有触发器的名称、事件、模式和位置等属性。
4. 删除触发器:使用DROP TRIGGER语句删除不再需要的触发器。
5. 触发器的嵌套:在触发器内部可以定义其他触发器,形成嵌套结构,实现更复杂的逻辑。
6. 触发器的权限:确保创建、修改和删除触发器的用户具有足够的权限。
7. 异常处理:在触发器操作代码中添加适当的异常处理机制,以应对可能出现的错误和异常情况。
四、示例以下是一个简单的示例,展示如何使用SQL Server触发器在表上定义一个插入操作时自动添加日志:1. 创建表:首先创建一个包含要记录的字段的表。
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触发器的使用及语法:.创建触发器:CREATE TRIGGER trigger_name{AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE} ON table_name[WITH ENCRYPTION][FOR | AFTER] {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器执行的代码END.删除触发器:DROP TRIGGER [schema_name.]trigger_name.触发器的类型:•AFTER触发器:在数据操作之后触发执行。
•INSTEAD OF触发器:在数据操作之前触发执行,可以替代原始操作。
.触发器的事件:•INSERT:在向表中插入数据时触发。
•UPDATE:在更新表中的数据时触发。
•DELETE:在从表中删除数据时触发。
.触发器的执行时间:•FOR:在数据操作之前或之后触发执行。
•AFTER:在数据操作之后触发执行。
触发器的代码:触发器的代码可以包含SQL语句、存储过程、函数等。
可以使用INSERTED和DELETED临时表来访问触发器操作的数据。
INSERTED表包含已插入或已更新的数据,DELETED表包含已删除或已更新的数据。
触发器的加密:使用WITH ENCRYPTION选项可以对触发器的定义进行加密,防止他人查看触发器的代码。
需要注意的是,触发器的使用应该谨慎,过多或复杂的触发器可能会影响数据库的性能。
在设计和使用触发器时,要考虑到对数据库性能的影响,并经过充分测试和优化。
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中的触发器基本语法与作⽤什么是触发器?触发器是在对表进⾏插⼊、更新或删除操作时⾃动执⾏的存储过程。
触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。
触发器⼀般⽤在check约束更加复杂的约束上⾯。
触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。
诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。
SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。
SQL Server为每个触发器都创建了两个专⽤表﹕Inserted表和Deleted表。
触发器通常⽤于强制业务规则触发器是⼀种⾼级约束,可以定义⽐⽤CHECK 约束更为复杂的约束:可执⾏复杂的SQL语句(if/while/case)、可引⽤其它表中的列触发器定义在特定的表上,与表相关。
⾃动触发执⾏不能直接调⽤是⼀个事务(可回滚)使⽤触发器的好处触发器可通过数据库中的相关表实现级联更改,不过,通过级联引⽤完整性约束可以更有效地执⾏这些更改。
触发器可以强制⽐⽤CHECK约束定义的约束更为复杂的约束。
与 CHECK 约束不同,触发器可以引⽤其它表中的列。
例如,触发器可以使⽤另⼀个表中的 SELECT ⽐较插⼊或更新的数据,以及执⾏其它操作,如修改数据或显⽰⽤户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
⼀个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同⼀个修改语句。
DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器UPDATE 触发器创建触发的语法CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR [DELETE, INSERT, UPDATE]AST-SQL语句GO注意:WITH ENCRYPTION表⽰加密触发器定义的SQL⽂本 DELETE, INSERT, UPDATE指定触发器的类型 insert 触发器⽰例/*创建insert触发器,在上⽹记录表recordInfo上创建插⼊触发器*/create trigger tr_insert_recordInfoon recordInfofor insertas/*定义变量,⽤于临时存储插⼊的会员号、电脑编号和卡的编号*/declare @cardId char()declare @PCId intdeclare @CardNumber char()/*从inserted临时表中获取插⼊的记录⾏的信息,包括电脑的编号、卡的编号*/select @PCId=PCId,@cardId=CardId from inserted/*根据电脑编号修改电脑的使⽤状态*/update PCInfo set PCUse= where PCId=@PCId/*根据卡的编号查询会员号*/select @CardNumber=CardNumber from cardinfo where CardId=@cardid/*显⽰上机成功的信息*/print '上机成功!会员号是:'+@CardNumber+'机器号是:'+convert(char(),@PCId)go----插⼊测试数据,会员号为的上机set nocount on --不显⽰sql语句影响的记录⾏数declare @CardId int ---声明⼀个存储卡的编号的变量---根据会员号查处卡的编号select @cardId=cardid from cardinfo where cardNumber='c'---向recordInfo表中插⼊⼀条记录信息,卡的编号、电脑编号和上机时间insert into recordInfo(cardId,PCId,beginTime) values(@cardId,,getDate())----查看结果select * from recordInfoselect * from PCInfoupdate触发器⽰例---创建delete触发器,在上⽹记录表RecordInfo上创建删除触发器create trigger tr_delete_recordInfoon recordInfofor deleteasif exists(select * from sysobjects where name='backRecordInfo')----如果backrecordInfo表存在,就添加记录即可insert into backRecordInfo select * from deletedelse----创建backRecordInfo表,从deleted中获取被删除的数据select * into backRecordInfo from deletedprint'backRecordInfo表备份数据成功,备份表中的数据为:'select * from backRecordInfogo-------关键代码----------测试delete触发器,删除数据set nocount ondelete from recordInfo---查看结果print'记录表中的数据为:'select * from recordInfodelete触发器⽰例-------关键代码------create trigger tr_update_recordInfoon recordInfofor updateasdeclare @beforePCId intdeclare @afterPCId intselect @beforePCId =PCId from deletedselect @afterPCId=PCID from inserted---根据电脑编号修改使⽤状态--------根据以前使⽤的电脑编号把电脑的使⽤状态改为:update PCInfo set PCUse= where PCId=@beforePCId---根据现在使⽤的电脑编号把电脑的使⽤状态改为:update PCInfo set PCUse= where PCId=@afterPCId----显⽰电脑换机成功print'换机成功!从'+convert(varchar(),@beforePCId)+'号电脑换到'+convert(varchar(),@afterPCId)+'号电脑'go/*测试update触发器,修改电脑编号*/--显⽰更改前,记录表中的数据print'更改前,记录表中的数据'select * from recordInfo--显⽰更改前,电脑表中的数据print'更改前,电脑表中的数据'select * from PCInfoset nocount on---把电脑号为的改为update recordInfo set PCId= where PCId=---查看结果print'更改后,记录表中的数据'select * from recordInfoprint'更改后,电脑表中的数据'select * from PCInfoinstead of触发器的使⽤ instead of触发器的使⽤范围,instead of 触发器可以同时在数据表和视图中使⽤。
SQLServer触发器触发器可以做很多事情,但也会带来很多问题。
使⽤它的技巧在于在适当的时候使⽤,⽽不要在不适当的时候使⽤它们。
触发器的⼀些常见⽤途如下:弹性参照完整性:实现很多DRI不能实现的操作(例如,跨数据库或服务器的参照完整性以及很多复杂的关系类型)。
创建神级跟踪:这意味写出的记录不仅跟踪⼤多数当前的数据,还包括对每个记录进⾏实际修改的历史数据。
随着SQL Server2008中的更改数据跟踪功能的出现,创建审计跟踪不再那么流⾏,但以前使⽤的就是触发器。
执⾏与CHECK约束类似的功能,但是跨表,跨数据库甚⾄是跨服务器使⽤。
⽤⾃⼰的语句代替⽤户的操作语句。
⼀、触发器的概念 触发器是⼀种特殊类型的存储过程,对特定事件作出相应。
触发器有两种类型:数据定义语⾔(DDL)触发器和数据操纵语⾔(DML)触发器。
DDL触发器在⽤户以某些⽅式(CREATE、ALTER、DROP或相似的语句)对数据库结构进⾏修改时激活作出响应。
⼀般来说,只会在对数据库结构的改变或历史进⾏极为严格的审计时才会⽤到DDL触发器。
DML触发器是⼀些附加在特定表或视图上的代码⽚段。
与需要显式调⽤代码的存储过程不同,只要有附加触发器的时间在表中发⽣,触发器中的代码就会⾃动运⾏。
实际上也不能显式地调⽤触发器-唯⼀的做法是在指定的表中执⾏所需的操作。
除了不能够显式地调⽤触发器,还可在存储过程中发现另外两个触发器所没有的内容:参数和返回码。
可将触发器附加到什么事件呢?因为在SQL中可以使⽤3类动作查询,所以就有3种类型的触发器,另外加上混合搭配这些时间并对时间定时激活的混合触发器类型。
INSERT触发器DELETE触发器UPDATE触发器以后任意类型的混合 注意: 值得注意的是,有时即使执⾏的动作是前⾯这些类型中的⼀种,触发器也不会激活。
问题在于进⾏的操作是否在记录的活动中。
例如,DELETE语句是⼀个正常的记录活动,它会激活任何删除触发器,⽽TRUNCATE TABLE也有删除⾏的作⽤,但只是把表使⽤的空间释放⽽已-没有记录单个⾏删除操作,所以没有激活任何触发器。
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 触发器if else语句SQL Server 触发器是一个使 SQL Server 数据库自动执行某些操作的特殊程序。
在执行特定的 SQL Server 数据库操作时,SQL Server 总是先运行触发器,然后再执行所请求的操作。
触发器可以执行各种操作,例如插入、更新或删除数据。
在编写一个 SQL Server 触发器时,可以使用 if else 语句来控制不同的操作。
If else 语句是 SQL Server 中常用的控制语句,可以根据指定的条件执行不同的操作。
在 SQL Server 触发器中,if else 语句可以用来控制触发器在满足特定条件时执行特定的 SQL 代码。
一个简单的 if else 语句可以如下所示:IF conditionBEGIN--执行操作AENDELSEBEGIN--执行操作BEND在 SQL Server 触发器中,if else 语句可以用于控制触发器执行特定的操作。
例如,可以在触发器中使用 if else 语句来检查特定的条件,然后基于该条件对目标表进行插入、更新或删除操作。
以下是一个在 SQL Server 触发器中使用 if else 语句的示例: CREATE TRIGGER trigger_nameON table_nameAFTER INSERT --触发器会在插入操作之后执行,其他操作类似ASBEGINDECLARE @var1 INT; --定义变量SET @var1 = (SELECT COUNT(*) FROM table_name); --将表中的行数赋给变量IF (@var1 > 10) --检查条件BEGIN--执行操作AUPDATE table_name SET column1='new_value' WHEREcolumn2='value2';ENDELSEBEGIN--执行操作BDELETE FROM table_name WHERE column3='value3';ENDEND;以上触发器将在插入操作之后执行,如果表中行数大于10,则更新列1,否则删除特定列的值。
定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。
触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
我为什么要使用触发器?比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号....)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。
这时候可以用到触发器。
对于1,创建一个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。
注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:虚拟表Inserted 虚拟表Deleted在表记录新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted 表,然后删除Student记录并写入新纪录。
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触发器触发INSERT,UPDATE,DELETE三种状态SQLSERVER触发器触发INSERT,UPDATE,DELETE三种状态来源:⼀个触发器内三种INSERT,UPDATE,DELETE状态CREATE TRIGGER tr_T_A ON T_A for INSERT,UPDATE,DELETE如IF exists (select * from inserted) and not exists (select * from deleted) 则为 INSERT如IF exists(select * from inserted ) and exists (select * from deleted) 则为 UPDATE如IF exists (select * from deleted) and not exists (select * from inserted)则为 DELETE插⼊操作(Insert):Inserted表有数据,Deleted表⽆数据删除操作(Delete):Inserted表⽆数据,Deleted表有数据更新操作(Update):Inserted表有数据(新数据),Deleted表有数据(旧数据)---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------SQL中触发器的使⽤原⽂地址:https:///feiquan/archive/2018/04/01/8685722.html创建触发器是特殊的存储过程,⾃动执⾏,⼀般不要有返回值类型: 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)+' '+CON 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中并不⽀持⾏级触发器。
sqlserver sql 语法SQL Server SQL语法详解一、引言SQL Server是微软公司开发的关系型数据库管理系统(RDBMS),它支持使用SQL(Structured Query Language)进行数据库操作。
本文将详细介绍SQL Server SQL语法的相关知识,帮助读者更好地理解和使用SQL Server数据库。
二、SQL Server基本语法1. 创建数据库:CREATE DATABASE database_name;2. 创建表:CREATE TABLE table_name (column1 datatype constraint,column2 datatype constraint,...);3. 插入数据:INSERT INTO table_name (column1, column2, ...)VALUES (value1, value2, ...);4. 更新数据:UPDATE table_nameSET column1 = value1, column2 = value2, ... WHERE condition;5. 删除数据:DELETE FROM table_nameWHERE condition;6. 查询数据:SELECT column1, column2, ...FROM table_nameWHERE condition;7. 排序:SELECT column1, column2, ...FROM table_nameORDER BY column_name [ASC|DESC];8. 分组:SELECT column1, aggregate_function(column2) FROM table_nameWHERE conditionGROUP BY column1;9. 连接表:SELECT column1, column2, ...FROM table_name1INNER JOIN table_name2ON table_name1.column_name = table_name2.column_name;10. 子查询:SELECT column1, column2, ...FROM table_nameWHERE column_name IN (SELECT column_name FROM table_name WHERE condition);三、SQL Server高级语法1. 索引:CREATE INDEX index_nameON table_name (column1, column2, ...);2. 视图:CREATE VIEW view_name ASSELECT column1, column2, ...FROM table_nameWHERE condition;3. 存储过程:CREATE PROCEDURE procedure_nameASBEGINSQL statements;END;4. 触发器:CREATE TRIGGER trigger_nameON table_nameFOR [INSERT|UPDATE|DELETE]ASBEGINSQL statements;END;5. 事务:BEGIN TRANSACTION;SQL statements;COMMIT;四、SQL Server常用函数1. COUNT():计算满足条件的行数;2. SUM():求和;3. AVG():平均值;4. MAX():最大值;5. MIN():最小值;6. LEN():字符串长度;7. SUBSTRING():截取字符串;8. GETDATE():获取当前日期和时间;9. CONVERT():数据类型转换;10. ISNULL():判断是否为空值。
SQL触发器语法参考CreateTRIGGER trigger_nameON{table|view}[WITH ENCRYPTION]{{{FOR|AFTER|INSTEAD OF}{[Insert][,][Updat e]}[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是默认设置。
不能在视图上定义AFTER触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。
在表或视图上,每个Insert、Update或Delete语句最多可以定义一个INSTEAD OF触发器。
然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。
INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。
sqlserver触发器的简单⽤法
触发器 -- ⼀下写的都是我对触发器的理解
当在执⾏insert 、 delete 、等操作的时候随便要做⼀些额外的操作,
⽐如在添加的时候就会将新添加的数据存到inserted表中
写个实例
Insert into userinfo(Name) output inserted.Id value(‘赵六’)
他会返回当前插⼊数据的id
再例如:insert into A(Name,Info) output inserted.ID values('陈智','⼭西的')
介绍⼀下触发器的语法:
create trigger 触发器名 on 表名
for(after) | instead of [insert,update,delete]
as
begin
sql脚本
end
说明⼀点,如果⽤for或者after表⽰在[insert,update,delete]的操作完成之后或之前执⾏触发器中的sql脚本,⽽instead of 表⽰将操作替换成触发器中的sql脚本。
具体⽤法:
create trigger Gettable on A
instead of insert
as
begin
select * from A
end
还有就是:
create trigger Gettable on A
for insert
as
begin
select * from A
end。
SqlServer基础之(触发器)阅读⽬录概念: 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,当对⼀个表进⾏操作( insert,delete, update)时就会激活它执⾏。
触发器经常⽤于加强数据的完整性约束和业务规则等。
触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
触发器和存储过程的区别: 触发器与存储过程的区别是运⾏⽅式的不同,触发器不能执⾏EXECUTE语句调⽤,⽽是在⽤户执⾏Transact-SQL语句时⾃动触发执⾏⽽存储过程需要⽤户,应⽤程序或者触发器来显⽰地调⽤并执⾏。
⼀:触发器的优点 1.触发器是⾃动的。
当对表中的数据做了任何修改之后⽴即被激活。
2.触发器可以通过数据库中的相关表进⾏层叠修改。
3.触发器可以强制限制。
这些限制⽐⽤CHECK约束所定义的更复杂。
与CHECK约束不同的是,触发器可以引⽤其他表中的列。
⼆:触发器的作⽤ 触发器的主要作⽤就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的⼀致性,它能够对数据库中的相关表进⾏级联修改,提⾼⽐CHECK约束更复杂的的数据完整性,并⾃定义错误消息。
触发器的主要作⽤主要有以下接个⽅⾯:1. 强制数据库间的引⽤完整性2. 级联修改数据库中所有相关的表,⾃动触发其它与之相关的操作3. 跟踪变化,撤销或回滚违法操作,防⽌⾮法修改数据4. 返回⾃定义的错误消息,约束⽆法返回信息,⽽触发器可以5. 触发器可以调⽤更多的存储过程三:触发器的分类 SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。
1.DML(数据操作语⾔,Data Manipulation Language)触发器 DML触发器是⼀些附加在特定表或视图上的操作代码,当数据库服务器中发⽣数据操作语⾔事件时执⾏这些操作。
sql server触发器的使用及语法SQL Server触发器是一种数据库对象,它可以在指定的表上自动执行程序,以响应特定的数据库事件或操作。
通过使用触发器,可以在不直接修改应用程序代码的情况下,实现对数据库的自动化操作和控制。
本文将介绍SQL Server触发器的使用及其语法。
一、触发器的基本概念触发器是与表相关联的特殊类型的存储过程。
当插入、更新或删除表中的数据时,触发器可以自动执行一系列的操作。
触发器可以用于实现数据的验证、约束和业务逻辑的处理。
它们可以在数据被更改之前或之后触发,以及在每一行被更改之前或之后触发。
二、触发器的创建和使用在SQL Server中,可以使用CREATE TRIGGER语句来创建触发器。
语法如下:```CREATE TRIGGER trigger_nameON table_name{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}ASBEGIN-- 触发器的逻辑代码END```其中,trigger_name是触发器的名称,table_name是触发器所属的表名,{FOR | AFTER | INSTEAD OF} {INSERT | UPDATE | DELETE}是触发器的触发事件,BEGIN和END之间是触发器的逻辑代码。
三、触发器的类型SQL Server中的触发器可以分为三种类型:INSERT触发器、UPDATE触发器和DELETE触发器。
1. INSERT触发器INSERT触发器在向表中插入新记录之前或之后触发。
可以在INSERT触发器中执行一些额外的逻辑操作,例如记录日志、更新其他表等。
2. UPDATE触发器UPDATE触发器在更新表中的记录之前或之后触发。
可以在UPDATE触发器中进行一些数据验证、约束或业务逻辑处理。
3. DELETE触发器DELETE触发器在从表中删除记录之前或之后触发。
sql server 触发器的写法SQL Server触发器是一种特殊类型的存储过程,其可以在指定的表上定义并绑定到表的INSERT、UPDATE或DELETE语句操作上。
当这些操作被执行时,触发器将会自动触发,并按照事先定义的逻辑执行相应的操作。
触发器可以用于实现数据完整性约束、数据审计、数据同步等应用场景。
下面,我将介绍SQL Server触发器的写法,包括触发器的创建、绑定和编写触发逻辑等。
1.创建触发器在SQL Server中,可以使用CREATE TRIGGER语句来创建触发器。
触发器的创建包括触发器的名称、关联的表以及触发事件(INSERT、UPDATE或DELETE)。
创建触发器的语法如下:CREATE TRIGGER trigger_nameON table_name[AFTER/INSTEAD OF] {INSERT, UPDATE, DELETE}ASBEGIN--触发器的逻辑代码END其中,trigger_name是触发器的名称,table_name是触发器所关联的表名,[AFTER/INSTEAD OF] {INSERT, UPDATE, DELETE}指定触发器关联的触发事件类型。
触发器的逻辑代码则位于BEGIN和END之间。
2.触发器的绑定创建触发器后,需要将其绑定到相应的表上。
可以使用ALTER TABLE语句来绑定触发器。
绑定触发器的语法如下:ALTER TABLE table_name{ADD/DROP} TRIGGER trigger_name其中,table_name是要绑定触发器的表名,{ADD/DROP} TRIGGER指定要添加或删除的触发器。
3.编写触发器逻辑触发器的逻辑代码可以包含SQL语句、流程控制语句以及用于操作内置函数和变量的语句。
触发器的逻辑代码应根据触发器所关联的事件类型进行编写。
下面是一些常见的触发器逻辑示例:3.1插入触发器逻辑当触发器关联插入事件时,可以使用INSERTED表来访问插入操作的数据。
SqlServer触发器常⽤语法AFTER、INSTEADOF及其详解先创建⼀个简单的触发器CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]AST-SQL语句GO触发器位置:数据库>表>我这⾥是表名table_name>触发器解释:1、[WITH ENCRYPTION]:表⽰将该触发器加密,加密后触发器执⾏⽅法将⽆法被查看[DELETE, INSERT, UPDATE]对应为当执⾏删除、插⼊、更新三种动作时被触发执⾏insert时,获取插⼊后的数据,可⽤select*from inserted读取执⾏delete时,获取删除前的数据,可⽤select*from deleted读取执⾏update时,获取更新前的数据,可⽤select*from deleted读取,获取更新后数据,可⽤select*from inserted读取2、AFTER:操作成功后(这⾥是插⼊table_a后),执⾏触发器操作例如CREATE TRIGGER T_AON table_aafter insertasbegindeclare @id int,@name varchar(20)select @id=id,@name=name from insertedinsert into table_b values(@id,@name)end3、INSTEAD OF:该触发器只是数据库的“导⽕线”,触发器是否能执⾏到想要的结果,需要由触发器中的逻辑进⾏判断,因为该触发器往往伴随着很多的判断分⽀。
例如CREATE TRIGGER T_BON table_ainstead of insertasbeginIF EXISTS(select*from table_a where name =(select name from inserted))ROLLBACK TRANSACTIONPRINT '该姓名已存在'ELSEINSERT INTO table_a VALUES(select*from inserted)PRINT '插⼊成功'end************更多触发器的基本使⽤将随时更新在本页⾯************。
SQLSERVER中各类触发器的完整语法及参数说明语法:CREATE TRIGGER [ schema_name . ]trigger_nameON { 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 [ ; ] > }[ ENCRYPTION ][EXECUTE AS Clause ]assembly_nameclass_namemethod_nameCREATE TRIGGER trigger_nameON { ALL SERVER | DATABASE }[ WITH <ddl_trigger_option> [ ...n ] ]{ FOR | AFTER } { event_type | event_group } [ ...n ]AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME < method specifier > [ ; ] }[ ENCRYPTION ][ EXECUTE AS Clause ]assembly_nameclass_namemethod_nameCREATE TRIGGER trigger_nameON ALL SERVER[ WITH <logon_trigger_option> [ ...n ] ]{ FOR| AFTER } LOGONAS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME < method specifier > [ ; ] }[ ENCRYPTION ][ EXECUTE AS Clause ]assembly_nameclass_namemethod_name参数:schema_name。
定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。
触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
我为什么要使用触发器?比如,这么两个表:Create Table Student( --学生表StudentID int primary key, --学号....)Create Table BorrowRecord( --学生借书记录表BorrowRecord int identity(1,1), --流水号StudentID int , --学号BorrowDate datetime, --借出时间ReturnDAte Datetime, --归还时间...)用到的功能有:1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。
这时候可以用到触发器。
对于1,创建一个Update触发器:Create Trigger truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。
注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:虚拟表Inserted 虚拟表Deleted在表记录新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted 表,然后删除Student记录并写入新纪录。
对于2,创建一个Delete触发器Create trigger trdStudentOn Studentfor DeleteAsDelete BorrowRecordFrom BorrowRecord br , Delted dWhere br.StudentID=d.StudentID从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
SQL触发器实例2USE MasterGOIF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’U’ AND NAME = ’卷烟库存表’)DROP TABLE 卷烟库存表GOIF EXISTS (SELECT NA ME FROM SYSOBJECTS WHERE XTYPE = ’U’ AND NAME = ’卷烟销售表’)DROP TABLE 卷烟销售表GO--业务规则:销售金额= 销售数量* 销售单价业务规则。
CREATE TABLE 卷烟销售表(卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL,购货商VARCHAR(40) NULL,销售数量INT NULL,销售单价MONEY NULL,销售金额MONEY NULL)GO--业务规则:库存金额= 库存数量* 库存单价业务规则。
CREATE TABLE 卷烟库存表(卷烟品牌VARCHAR(40) PRIMARY KEY NOT NULL,库存数量INT NULL,库存单价MONEY NULL,库存金额MONEY NULL)GO--创建触发器,示例1IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’ AND NAME = ’T_INSERT_卷烟库存表’)DROP TRIGGER T_INSERT_卷烟库存表GOCREATE TRIGGER T_INSERT_卷烟库存表ON 卷烟库存表FOR INSERTAS--提交事务处理BEGIN TRANSACTION--强制执行下列语句,保证业务规则UPDATE 卷烟库存表SET 库存金额= 库存数量* 库存单价WHERE 卷烟品牌IN (SELECT 卷烟品牌from INSERTED)COMMIT TRANSACTIONGOINSERT INTO 卷烟库存表(卷烟品牌,库存数量,库存单价,库存金额)S ELECT ’红塔山新势力’,100,12,1200 UNION ALLSELECT ’红塔山人为峰’,100,22,NULL UNION ALLSELECT ’云南映像’,100,60,500 UNION ALLSELECT ’玉溪’,0,30,0GO--查询数据SELECT * FROM 卷烟库存表GO--触发器示例2IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’ AND NAME = ’T_INSERT_卷烟销售表’)DROP TRIGGER T_INSERT_卷烟销售表GOCREATE TRIGGER T_INSERT_卷烟销售表ON 卷烟销售表FOR INSERTASBEGIN TRANSACTION--检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零IF NOT EXISTS (SELECT 库存数量FROM 卷烟库存表WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED))BEGIN--返回错误提示RAISERROR(’错误!该卷烟不存在库存,不能销售。
’,16,1)--回滚事务ROLLBACKRETURNENDIF EXISTS (SELECT 库存数量FROM 卷烟库存表WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED) AND库存数量<= 0)BEGIN--返回错误提示RAISERROR(’错误!该卷烟库存小于等于0,不能销售。
’,16,1)--回滚事务ROLLBACKRETURNEND--对合法的数据进行处理--强制执行下列语句,保证业务规则UPDATE 卷烟销售表SET 销售金额= 销售数量* 销售单价WHERE 卷烟品牌IN (SELECT 卷烟品牌FROM INSERTED)DECLARE @卷烟品牌VARCHAR(40)SET @卷烟品牌= (SELECT 卷烟品牌FROM INSERTED)DECLARE @销售数量MONEYSET @销售数量= (SELECT 销售数量FROM INSERTED)UPDATE 卷烟库存表SET 库存数量= 库存数量- @销售数量,库存金额= (库存数量- @销售数量)*库存单价WHERE 卷烟品牌= @卷烟品牌COMMIT TRANSACTIONGO--请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。
--针对[卷烟销售表],插入第一条测试数据,该数据是正常的。
INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)SELECT ’红塔山新势力’,’某购货商’,10,12,1200GO--针对[卷烟销售表],插入第二条测试数据,该数据销售金额不等于销售单价* 销售数量。
--触发器将自动更正数据,使销售金额等于销售单价* 销售数量。
INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)SELECT ’红塔山人为峰’,’某购货商’,10,22,2000GO--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中找不到对应。
--触发器将报错。
INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)SELECT ’红河V8’,’某购货商’,10,60,600GO--针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在卷烟库存表中库存为0。
--触发器将报错。
INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)SELECT ’玉溪’,’某购货商’,10,30,300GO--查询数据SELECT * FROM 卷烟库存表SELECT * FROM 卷烟销售表GO--修改触发器--实质上,是将CREATE TRIGGER ... 修改为ALTER TRIGGER ...即可。
--删除触发器DROP TRIGGER xxxGO--删除测试环境DROP TABLE 卷烟库存表GODROP TABLE 卷烟销售表GODROP TRIGGER T_INSERT_卷烟库存表GODROP TRIGGER T_INSERT_卷烟销售表GO################################################ ##################触发器的基础知识和例子: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 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一样的,只是存放的数据有差异。