SQL Server 触发器

合集下载

sqlserver2008触发器

sqlserver2008触发器

初学sql server 2008之触发器触发器(trigger):是一种特殊的存储过程,可以用来对表实施复杂的完整性约束,保持数据的一致性。

当触发器所保护的数据发生改变时,触发器会自动被激活,并执行触发器中所定义的相关操作,从而保证对数据的不完整性约束或不正确的修改。

在SQL SERVER 2008中,有三种类型的触发器:(1)DML触发器:是指触发器在数据库中发生数据操作语言(DML)事件时将启用。

DML事件即指在表或视图中修改数据的insert、update、delete语句也。

(2)DDL触发器:是指当服务器或数据库中发生数据定义语言(DDL)事件时将启用。

DDL事件即指在表或索引中的create、alter、drop语句也。

(3)登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。

不过根据DML触发器触发的方式不同又分为以下两种情况:(1)AFTER触发器:它是在执行INSERT、UPDATE、DELETE语句操作之后执行触发器操作。

它主要是用于记录变更后的处理或检查,一旦发生错误,可以用Rollback Transaction语句来回滚本次扣件,不过不能对视图定义AFTER触发器。

(2)INSTEAD OF触发器:它在执行INSERT、UPDATE、DELETE语句操作之前执行触发器本身所定义的操作。

而INSTEAD OF触发器是可以定义在视图上的。

在SQL SERVER 2008中,DML触发器的实现使用两个逻辑表DELETED和INSERTED。

这两个表是建立在数据库服务器的内存中,由系统管理的逻辑表,我们对于它只有只读的权限。

DELETED和INSERED表的结构和触发器所在的数据表的结构是一样的。

当触发器执行完成后,它们也就会被自动删除。

INSERED表用于存放你在操件insert、update、delete语句后,更新的记录。

比如你插入一条数据,那么就会把这条记录插入到INSERTED表。

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.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。

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. 创建表:首先创建一个包含要记录的字段的表。

09-触发器(SQL Server)

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中数据增删改 触发器写法

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中。

sql server触发器的使用及语法

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选项可以对触发器的定义进行加密,防止他人查看触发器的代码。

需要注意的是,触发器的使用应该谨慎,过多或复杂的触发器可能会影响数据库的性能。

在设计和使用触发器时,要考虑到对数据库性能的影响,并经过充分测试和优化。

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之间是触发器的逻辑代码。

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

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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数据的时候就是先删除表记录,然后增加一条记录。

这样在inserted和deleted表就都有update后的数据记录了。

注意的是:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。

如果不满足可以利用事务回滚,撤销操作。

Ø创建触发器语法create trigger tgr_nameon table_namewith encrypion –加密触发器for update...asTransact-SQL# 创建insert类型触发器--创建insert插入类型触发器if (object_id('tgr_classes_insert', 'tr') is not null)drop trigger tgr_classes_insertgocreate trigger tgr_classes_inserton classesfor insert --插入触发as--定义变量declare @id int, @name varchar(20), @temp int;--在inserted表中查询已经插入记录信息select @id = id, @name = name from inserted;set @name = @name + convert(varchar, @id);set @temp = @id / 2;insert into student values(@name, 18 + @id, @temp, @id);print'添加学生成功!';go--插入数据insert into classes values('5班', getDate());--查询数据select * from classes;select * from student order by id;insert触发器,会在inserted表中添加一条刚插入的记录。

# 创建delete类型触发器--delete删除类型触发器if (object_id('tgr_classes_delete', 'TR') is not null)drop trigger tgr_classes_deletegocreate trigger tgr_classes_deleteon classesfor delete --删除触发asprint'备份数据中……';if (object_id('classesBackup', 'U') is not null)--存在classesBackup,直接插入数据insert into classesBackup select name, createDate from deleted;else--不存在classesBackup创建再插入select * into classesBackup from deleted;print'备份数据成功!';go----不显示影响行数--set nocount on;delete classes where name = '5班';--查询数据select * from classes;select * from classesBackup;delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。

# 创建update类型触发器--update更新类型触发器if (object_id('tgr_classes_update', 'TR') is not null)drop trigger tgr_classes_updategocreate trigger tgr_classes_updateon classesfor updateasdeclare @oldName varchar(20), @newName varchar(20);--更新前的数据select @oldName = name from deleted;if(exists(select* from student where name like'%'+ @oldName + '%')) begin--更新后的数据select @newName = name from inserted;update student set name = replace(name, @oldName, @newName) where name like'%'+ @oldName + '%';print'级联修改数据成功!';endelseprint'无需修改student表!';go--查询数据select * from student order by id;select * from classes;update classes set name = '五班'where name = '5班';update触发器会在更新数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中。

# update更新列级触发器if (object_id('tgr_classes_update_column', 'TR') is not null) drop trigger tgr_classes_update_columngocreate trigger tgr_classes_update_columnon classesfor updateas--列级触发器:是否更新了班级创建时间if (update(createDate))beginraisError('系统提示:班级创建时间不能修改!', 16, 11);rollback tran;endgo--测试select * from student order by id;select * from classes;update classes set createDate = getDate() where id = 3;update classes set name = '四班'where id = 7;更新列级触发器可以用update是否判断更新列记录;# instead of类型触发器instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身的内容。

创建语法create trigger tgr_nameon table_namewith encryptioninstead of update...asT-SQL# 创建instead of触发器if (object_id('tgr_classes_inteadOf', 'TR') is not null) drop trigger tgr_classes_inteadOfgocreate trigger tgr_classes_inteadOfon classesinstead of delete/*, update, insert*/asdeclare @id int, @name varchar(20);--查询被删除的信息,病赋值select @id = id, @name = name from deleted;print'id: ' + convert(varchar, @id) + ', name: ' + @name;--先删除student的信息delete student where cid = @id;--再删除classes的信息delete classes where id = @id;print'删除[ id: ' + convert(varchar, @id) + ', name: ' + @name + ' ] 的信息成功!';go--testselect * from student order by id;select * from classes;delete classes where id = 7;# 显示自定义消息raiserrorif (object_id('tgr_message', 'TR') is not null)drop trigger tgr_messagegocreate trigger tgr_messageon studentafter insert, updateas raisError('tgr_message触发器被触发', 16, 10);go--testinsert into student values('lily', 22, 1, 7);update student set sex = 0 where name = 'lucy';select * from student order by id;# 修改触发器alter trigger tgr_messageon studentafter deleteas raisError('tgr_message触发器被触发', 16, 10);go--testdelete from student where name = 'lucy';# 启用、禁用触发器--禁用触发器disable trigger tgr_message on student;--启用触发器enable trigger tgr_message on student;# 查询创建的触发器信息--查询已存在的触发器select * from sys.triggers;select * from sys.objects where type = 'TR';--查看触发器触发事件select te.* from sys.trigger_events te join sys.triggers t on t.object_id = te.object_idwhere t.parent_class = 0 and = 'tgr_valid_data';--查看创建触发器语句exec sp_helptext 'tgr_message';# 示例,验证插入数据if ((object_id('tgr_valid_data', 'TR') is not null)) drop trigger tgr_valid_datagocreate trigger tgr_valid_dataon studentafter insertasdeclare @age int,@name varchar(20);select @name = , @age = s.age from inserted s;if (@age < 18)beginraisError('插入新数据的age有问题', 16, 1);rollback tran;endgo--testinsert into student values('forest', 2, 0, 7);insert into student values('forest', 22, 0, 7);select * from student order by id;# 示例,操作日志if (object_id('log', 'U') is not null)drop table loggocreate table log(id int identity(1, 1) primary key,action varchar(20),createDate datetime default getDate())goif (exists (select * from sys.objects where name = 'tgr_student_log')) drop trigger tgr_student_loggocreate trigger tgr_student_logon studentafter insert, update, deleteasif ((exists (select 1 from inserted)) and (exists (select 1 from deleted)))begininsert into log(action) values('updated');endelse if(exists(select1 from inserted) and not exists(select1 from deleted))begininsert into log(action) values('inserted');endelse if(not exists(select1 from inserted) and exists(select1 from deleted))begininsert into log(action) values('deleted');endgo--testinsert into student values('king', 22, 1, 7);update student set sex = 0 where name = 'king';delete student where name = 'king';select * from log;select * from student order by id;。

相关文档
最新文档