sql server触发器
sql server触发器的基本语法和使用方法
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触发器的使用及语法:.创建触发器: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中触发器执行机制一、触发器概述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触发器详解触发器(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触发器(附有实例)触发器:即当发⽣某⼀事件时,如果满⾜给定条件,则执⾏相应的动作。
它的基本架构:触发器创建语法:(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的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。
浅谈SQL Server 数据库之触发器
浅谈SQL Server 数据库之触发器触发器的特征:1、触发器是在对表进行增、删、改时,自动执行的存储过程。
触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行。
2、触发器是一个特殊的事务单元,可以引用其他表中的列执行特殊的业务规则或数据逻辑关系。
当出现错误时,可以执行rollback transaction操作将整个触发器以及触发它的T-SQL语句一并回滚(不需显示声明begin transaction)。
3、每个触发器将用到的两个临时表:deleted 临时表:用于临时存放被删除的记录行副本(包括delete和update语句所影响的数据行);注意:被删除的记录行,首先从原始表中删除,并保存到触发器表。
然后从触发器表中删除,再保存到deleted表。
inserted临时表:用于临时存放插入的记录行副本(包括insert和update语句所影响的数据行);deleted表和inserted表的特征:> 这两个表的表结构与该触发器作用的表相同;> 这两个表是逻辑表,并且由系统管理;> 这两个表是动态驻留在内存中的(不是存储在数据库中),当触发器工作完成后,它们也被删除;> 这两个表是只读的,即只能运用select语句查看(用户不能直接更改);4、所创建的触发器(insert、delete、update)是在原表数据行已经修改完成后再触发。
所以,触发器是在约束检查之后才执行。
什么时候使用触发器?a、实现主外键关系所不能保证的复杂参照完整性和数据的一致性。
不过,通过“级联引用完整性约束”可以更有效地执行这些更改。
b、防止恶意或错误的INSERT、UPDATE 以及DELETE 操作,并强制执行比CHECK 约束定义的限制更为复杂的其他限制。
> 与CHECK 约束不同(check约束只能引用自身表中的列),DML触发器可以引用其他表中的列;> 触发器可以完成所有约束的功能,但不一定是最佳方案;> 触发器能够使用自定义信息和较为复杂的错误处理;c、DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。
SqlServer基础之(触发器)
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触发器的使用及其语法。
一、触发器的基本概念触发器是与表相关联的特殊类型的存储过程。
当插入、更新或删除表中的数据时,触发器可以自动执行一系列的操作。
触发器可以用于实现数据的验证、约束和业务逻辑的处理。
它们可以在数据被更改之前或之后触发,以及在每一行被更改之前或之后触发。
二、触发器的创建和使用在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与 触发器
<
>
9.3 创建触发器
DECLARE @CreditHour TINYINT /* 学分 */ DECLARE @Grade TINYINT /* 成绩 */ SELECT @Grade=G.Grade, @CreditHour=C.CreditHour FROM Grade G INNER JOIN Inserted I ON G.StudentID = I.StudentID and G.CourseID = I.CourseID INNER JOIN Course C /* 按CourseID联接Course */ ON C.CourseID = I.CourseID IF (@Grade>=60) /* 成绩大于等于60 */ BEGIN UPDATE Student /* 在已修学分中加上插入课程的学分 */ SET CreditHour=CreditHour + @CreditHour FROM Student S, Inserted I WHERE S.StudentID = I.StudentID END GO
第 9 章
触 发 器
<
>
9.3 创建触发器
DECLARE @CreditHour TINYINT /* 学分 */ DECLARE @Grade TINYINT /* 成绩 */ DECLARE @StuID VARCHAR(10) DECLARE @CourseID VARCHAR(8) DECLARE @Gradeo TINYINT SELECT * FROM Deleted /* 查看删除的数据,调试成功后该行需 删除 */ SELECT @Grade=D.Grade, @CreditHour=C.CreditHour FROM Deleted D INNER JOIN Course C /* 按 CourseID 联 接 Course */ ON D.CourseID = C.CourseID IF (@Grade>=60) BEGIN /* 成绩大于等于60 */ UPDATE Student /* 已修学分累计 */ SET CreditHour=CreditHour - @CreditHour FROM Student S, Deleted D WHERE S.StudentID = D.StudentID END <GO >
sql server 触发器 的写法
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 触发器参数
sqlserver 触发器参数在 SQL Server 中,触发器(Trigger)是一种特殊类型的存储过程,它会在指定的数据库表上自动执行。
触发器通常用于在对表执行INSERT、UPDATE 或DELETE 操作时自动触发某些额外的逻辑。
SQL Server 中的触发器可以包含参数,这些参数用于传递信息给触发器。
在创建触发器时,你可以定义两种类型的参数:AFTER 触发器和INSTEAD OF 触发器。
AFTER 触发器参数:INSERTED 表:对于 AFTER INSERT 和 AFTER UPDATE 触发器,你可以使用 INSERTED 表,该表包含刚刚插入或更新的行的副本。
DELETED 表:对于 AFTER UPDATE 和 AFTER DELETE 触发器,你可以使用 DELETED 表,该表包含刚刚更新或删除的行的副本。
CREATE TRIGGER YourTriggerNameON YourTableNameAFTER INSERT, UPDATE, DELETEASBEGIN-- 使用 INSERTED 和 DELETED 表中的数据执行逻辑END;INSTEAD OF 触发器参数:对于 INSTEAD OF 触发器,你可以使用 INSERTED 和 DELETED 表,但这些表包含即将执行的操作的影响,而不是已经执行的操作的结果。
CREATE TRIGGER YourTriggerNameON YourTableNameINSTEAD OF INSERT, UPDATE, DELETEASBEGIN-- 使用 INSERTED 和 DELETED 表中的数据执行逻辑-- 注意:你需要自己处理实际的插入、更新或删除逻辑END;无论是 AFTER 还是 INSTEAD OF 触发器,你都可以在触发器中使用这些特殊的表来访问触发事件涉及的数据,从而执行相应的逻辑。
sqlserver触发器
eg2:
在student表上定义一个触发器 当插入或修改时 年龄如果低于18 自动改为18岁
create trigger insert_or_update_studnet
on student
for insert,update
as
update student set sage=18
date datetime
);
创建修改的触发器
create trigger update_s
on student
for update
as
if update(sno)
begin
insert into s_log
select sno,current_timestamp
from deleted
with encryption ---加密
after insert,update --之后添加或修改触发此触发器
as
begin
raiserror('不能执行查询或修改',16,10) ---自定义错误
rollback
end
go
来修改此触发器
alter trigger s_test
触发器概述
触发器是一种特殊的存储过程 与函数有所不同 它不能直接调用,也不能被
传送和接受参数 触发器主要是通过触发事件而被执行
触发器分为: DML 和DDL触发器
dml触发器即使一般的 触发事件:insert delete update
一般用于:dml触发器可通过数据库的相关表实现级联更改
for drop_table,alter_table
09-触发器(SQL Server)
维护数据一致性的触发器示例1 维护数据一致性的触发器示例
设有销售表, 设有销售表,结构如下 create table sales( pro_id char(10) not null, stor_id char(8) not null, s_date smalldatetime not null, qty int, total int default 0)
示例1 示例
定义限制t1表中 列的取值在 定义限制 表中c1列的取值在 到100范围 表中 列的取值在0到 范围 的触发器。 的触发器。 CREATE TRIGGER tri2 ON t1 INSTEAD OF update, insert as if not exists (select * from inserted where c1 not between 0 and 100) insert into t1 select * from inserted
4 前触发型触发器
触发型的触发器, 触发型的触发器,指定执行触发器而不是执行引 发触发器执行的SQL语句,从而替代引发语句的 语句, 发触发器执行的 语句 操作 当为表或视图定义了针对某一操作( 当为表或视图定义了针对某一操作(INSERT、 、 DELETE、UPDATE )的INSTEAD OF 类型触发 、 器且执行了相应的操作时, 器且执行了相应的操作时,尽管触发器被触发但 相应的操作并不被执行, 相应的操作并不被执行,而运行的仅是触发器 SQL 语句本身 在表或视图上,每个INSERT、UPDATE或 在表或视图上,每个 、 或 DELETE语句最多可以定义一个 语句最多可以定义一个INSTEAD OF触 语句最多可以定义一个 触 发器。 发器。 INSTEAD OF触发器不能在有 触发器不能在有WITH CHECK 触发器不能在有 OPTION选项的可更新视图上定义 选项的可更新视图上定义
SQLServer数据库技术-08触发器
14
设计触发器
15
例:为Products表添加触发器
CREATE TRIGGER 产品_Insert ON Products AFTER INSERT AS BEGIN print '又添加了一种产品' END GO Insert into Products(ProductName) values ('Product') Go
4
触发器的功能
完成比约束更复杂的数据约束 检查所做的SQL是否允许 修改其他数据表里的数据 调用更多的存储过程 发送SQL Mail 返回自定义的错误信息 更改原来要操作的SQL语句 防止数据表结构更改或数据表被删除
5
触发器分类
DML触发器
After触发器 Instead of触发器
21
Sp_settriggerorder 触发器名,激活次序,激活触发器的动作
例:设置触发器次序 Exec sp_settriggerorder '产品_Insert1','First','Insert' go Exec sp_settriggerorder '产品_Insert','Last','Insert' Go
8
在“产品库存”表里,如果要删除一条产品记录 ,在删除记录时,触发器可以检查该产品库存数 量是否为0,如果不为0则取消删除操作。 Step1:接收SQL语句,将要从“产品库存”表里删 除的记录取出来,放在删除表里。 Step2:从“产品库存”表里删除该产品记录。 Step3:从删除表里读出该产品的库存数量字段, 判断是不是0。如果是0,完成操作,从内存中清 除删除表;如果不为0,用Rollback Transaction语 句回滚操作。
SQLServer触发器
SQLServer触发器⼀、定义触发器: 在对数据库数据进⾏操作(增加(insert)、修改(update)、删除(delete))后,可以⾃动执⾏的操作触发器分为两类:instead of 触发器,after(for)触发器。
instead of 触发器:在数据更新到数据库之前执⾏的操作 after(for)触发器:在数据更新到数据后再执⾏的操作数据临时载体:inserted和deleted inserted:存储操作中新增的或者更新的数据 deleted:存储操作中删除的数据⼆、操作1. 新建触发器1--Insert操作INSTEAD OF 触发器2CREATE TRIGGER TRI_ORDER_BEFOREINSERT3ON MyOrder4 INSTEAD OF INSERT5AS6SELECT'BEFOREINSERT'7GO89--Insert操作AFTER 触发器10CREATE TRIGGER TRI_ORDER_AFTERINSERT11ON MyOrder12 AFTER INSERT13AS14SELECT'AFTERINSERT'15GO1617--UPDATE操作INSTEAD OF 触发器18CREATE TRIGGER TRI_ORDER_BEFOREUPDATE19ON MYORDER20 INSTEAD OF UPDATE21AS22SELECT'BEFOREUPDATE'23GO2425--UPDATE操作INSTEAD OF 触发器26CREATE TRIGGER TRI_ORDER_AFTERUPDATE27ON MYORDER28 AFTER UPDATE29AS30SELECT'AFTERUPDATE'31GO2. 新增1INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('001',1,1)结果如图: 只触发了Insert操作INSTEAD OF 触发器,⽽After触发器没有触发,并且数据新增失败3.在Insert操作INSTEAD OF 触发器添加新增操作1--Insert操作INSTEAD OF 触发器2ALTER TRIGGER TRI_ORDER_BEFOREINSERT3ON MyOrder4 INSTEAD OF INSERT5AS67SELECT'BEFOREINSERT'8DECLare@DocSex INT 910SELECT@DocSex= DocSex From inserted11IF(@DocSex=1)12BEGIN13INSERT INTO MyOrder14SELECT* FROM inserted15END16GO4.再次执⾏新增语句1INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('001',1,1)结果如图: Insert操作INSTEAD OF 触发器和After触发器都触发了,并且数据新增成功5.代码⾥⾯我们添加了DocSex=1的条件过滤,下⾯我们添加⼀条DocSex=2的记录看看1INSERT INTO MyOrder (OrderCode,OrderStatus,DocSex) VALUES('002',1,2)结果如图: 只触发了Insert操作INSTEAD OF 触发器,⽽After触发器没有触发,并且数据新增失败上述结果说明: 如果同时存在NSTEAD OF 触发器和After触发器,数据库会先执⾏NSTEAD OF 触发器,在NSTEAD OF 触发器中经过筛选再执⾏NSTEAD OF 触发器中的Insert操作才会触发After触发器。
SQLServer触发器
SQLServer触发器触发器可以做很多事情,但也会带来很多问题。
使⽤它的技巧在于在适当的时候使⽤,⽽不要在不适当的时候使⽤它们。
触发器的⼀些常见⽤途如下:弹性参照完整性:实现很多DRI不能实现的操作(例如,跨数据库或服务器的参照完整性以及很多复杂的关系类型)。
创建神级跟踪:这意味写出的记录不仅跟踪⼤多数当前的数据,还包括对每个记录进⾏实际修改的历史数据。
随着SQL Server2008中的更改数据跟踪功能的出现,创建审计跟踪不再那么流⾏,但以前使⽤的就是触发器。
执⾏与CHECK约束类似的功能,但是跨表,跨数据库甚⾄是跨服务器使⽤。
⽤⾃⼰的语句代替⽤户的操作语句。
⼀、触发器的概念 触发器是⼀种特殊类型的存储过程,对特定事件作出相应。
触发器有两种类型:数据定义语⾔(DDL)触发器和数据操纵语⾔(DML)触发器。
DDL触发器在⽤户以某些⽅式(CREATE、ALTER、DROP或相似的语句)对数据库结构进⾏修改时激活作出响应。
⼀般来说,只会在对数据库结构的改变或历史进⾏极为严格的审计时才会⽤到DDL触发器。
DML触发器是⼀些附加在特定表或视图上的代码⽚段。
与需要显式调⽤代码的存储过程不同,只要有附加触发器的时间在表中发⽣,触发器中的代码就会⾃动运⾏。
实际上也不能显式地调⽤触发器-唯⼀的做法是在指定的表中执⾏所需的操作。
除了不能够显式地调⽤触发器,还可在存储过程中发现另外两个触发器所没有的内容:参数和返回码。
可将触发器附加到什么事件呢?因为在SQL中可以使⽤3类动作查询,所以就有3种类型的触发器,另外加上混合搭配这些时间并对时间定时激活的混合触发器类型。
INSERT触发器DELETE触发器UPDATE触发器以后任意类型的混合 注意: 值得注意的是,有时即使执⾏的动作是前⾯这些类型中的⼀种,触发器也不会激活。
问题在于进⾏的操作是否在记录的活动中。
例如,DELETE语句是⼀个正常的记录活动,它会激活任何删除触发器,⽽TRUNCATE TABLE也有删除⾏的作⽤,但只是把表使⽤的空间释放⽽已-没有记录单个⾏删除操作,所以没有激活任何触发器。
SQL Server 触发器
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 表的数据是更新前的或是删除的数据。
Update数据的时候就是先删除表记录,然后增加一条记录。
这样在inserted和deleted 表就都有update后的数据记录了。
SQL Server触发器
SQL Server触发器
何为触发器:触发器是数据库服务器中发生事件时自动执行的特种存储过程,这是帮助文档上的定义,就认为是一种特殊的存储过程也行,经常用于强制执行业务规则和数据完整性。
在正式操作之前先把微软汽车行业解决方案触发器原理给说说,理解好触发器的机制是对更好的运用触发器自己好处很明显。
1、原理:
在执行触发器的过程中会产生两张临时表INSERTED 和DELETED,这两张表的作用简单说就是拿来记录数据的,主我们可以在触发器执行过程中更好的对数据进行操作
对表执行INSERT和UPDA TE操作时都会在临时表INSERTED中拷贝一份所增加的数据。
对表执行DELETE和UPDA TE操作时都会在临时表DELETED中拷贝一份所删除的数据
对表执行UPDATE操作时,首先把UPDATE前的数据DELETE到DELETED临时表中,然后再把所要更新的数据插入表中,最后把更新后的数据拷贝到INSERTED临时表中
触发器分为两种AFTER和INSTEAD OF。
SQL Server 触发器见解
SQL Server触发器见解1、触发器的定义触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由个事件来自动触发,比如当对一个表进行操作(insert/delete/update)时就会激活它执行。
2、触发器的分类第一类:DML触发器:主要为insert/delete/update开头的语句创建触发器,触发对象——当前数据表或视图1)After/for后触发器:在insert/delete/update操作完成之后,执行触发器2)Instead of前触发器:不执行insert/delete/update操作,而是执行触发器第二类:DDL触发器:主要为create/alter/drop开头的语句创建触发器,可用于管理任务。
触发对象——当前数据库或服务器触发(sql2005新特点)3、For/After/Instead of触发器的区别AFTER指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。
所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。
如果仅指定FOR关键字,则AFTER是默认设置。
不能在视图上定义AFTER触发器。
INSTEAD OF指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。
在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。
然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。
INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。
如果向指定了WITH CHECK OPTION选项的可更新视图添加INSTEAD OF触发器,SQL Server将产生一个错误。
用户必须用ALTER VIEW删除该选项后才能定义INSTEAD OF触发器。
注解:For触发器在底层数据被修改之前被触发;因此,如果需要的话,针对这部分操作可以用触发器来调用Rollback。
SQL Server数据库教程-触发器
•
1 触发器概述
1.DML 触发器 当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器 可以查询其他表,还可以包含复杂的 Transact-SQL 语句,将 触发器和触发它的语句作为可在触发器内回滚的单个事务对 待。如果检测到错误,则整个事务即自动回滚。 2.DDL 触发器 当服务器或数据库中发生数据定义语言 (DDL) 事件时将 调用 DDL 触发器。这些语句主要是以CREATE、ALTER、 DROP等关键字开头的语句。DDL触发器的主要作用是执行 管理操作,例如审核系统、控制数据库的操作等。
触发器
1 触发器概述 2 创建DML触发器 3 使用DML触发器 4 创建和使用DDL触发器 5 触发器的管理 6 综合训练
•
1 触发器概述
存储过程是一组 T-SQL 语句,它们编译后存储在数 据库中。触发器是一种特殊的存储过程,其特殊性主要 体现在对特定表(或列)进行特定类型的数据修改时激 发。SQL Server中一个表可以有多个触发器,可根据 INSERT 、UPDATE 或 DELETE语句对触发器进行设置, 也可以对一个表上特定操作设置多个触发器。触发器不 能通过名称直接调用,更不允许设置参数。
ON course AFTER INSERT,DELETE,UPDATE AS BEGIN
SET NOCOUNT ON SELECT * FROM course END GO
•
2.1 使用图形界面创建DML触发器
(4)右单击“触发器” 选项,在弹出的快捷菜单 中选择“刷新”命令,下方 出现dbo. trig_cou触发器, 至此完成触发器的创建, 如图4所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
触发器
1,了解为什么需要触发器以及什么是触发器
●触发器是一种特殊的存储过程
●触发器具备事务的功能
●触发器能在多表之间执行特殊的业务规则
●触发器是在对表进行插入、更新或删除操作时自动执行的存储过程●触发器通常用于强制业务规则
●触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束●触发器定义在特定的表上,与表相关
●自动触发执行
●不能直接调用
●是一个事务(可回滚)
2,触发器的类型
●DELETE 触发器
●INSERT 触发器
●UPDA TE 触发器
3,理解触发器的工作原理(trigger)
4,掌握如何使用inserted表和deleted表
inserted表和deleted表
●触发器触发时:
系统自动在内存中创建deleted表或inserted表
只读,不允许修改;触发器执行完成后,自动删除
●inserted 表
临时保存了插入或更新后的记录行
可以从inserted表中检查插入的数据是否满足业务需求
如果不满足,则向用户报告错误消息,并回滚插入操作
●deleted 表
临时保存了删除或更新前的记录行
可以从deleted表中检查被删除的数据是否满足业务需求
如果不满足,则向用户报告错误消息,并回滚删除操作
5,掌握如何创建insert触发器、update触发器、delete触发器创建触发器的语法:
CREATE TRIGGER 触发器名
ON 表名
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE]
AS
T-SQL语句
GO
案例:insert触发器
当向交易信息表(transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额。
案例:delete触发器
当删除交易信息表中的数据时,要求自动备份被删除的数据到表backupTable中。
案例:update触发器
跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。
案例:update触发器
交易日期一般由系统自动产生,默认为当前日期。
为了安全起见,一般禁止修改,以防舞弊。
思考:能否为多种类型(insert,update,delete)创建同一个触发器。