SQL Server触发器总结

杰哥1123

触发器的简介:

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。

触发器可以查询其他表,而且可以包含复杂的sql语句。它们主要用于强制服从复杂的业务规则或要求。例如:您可以根据客户当前的帐户状态,控制是否允许插入新订单。

触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。

触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。

此外触发器是逻辑电路的基本单元电路,具有记忆功能,可用于二进制数据储存,记忆信息等。

------来源于百度百科

触发器的作用:

  • 可在写入数据表前,强制检验或转换数据。
  • 触发器发生错误时,异动的结果会被撤销。
  • 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
  • 可依照特定的情况,替换异动的指令 (INSTEAD OF)。

触发器的优点:

触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

慎用触发器:

触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作…… 同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。

一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。

**所以触发器可以用来实现对表实施复杂的完整性约束。

二:SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。

这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后,与该触发器相关的这两个表也被删除。

  Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。

  Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。

三:Instead of 和 After触发器

  SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的不同:

  Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。

  After触发器在一个Insert,Update或Deleted语句之后执行,进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。

  一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器,一个表的每个修改动作都可以有多个After触发器。

四:触发器的执行过程

  如果一个Insert﹑update或者delete语句违反了约束,那幺After触发器不会执行,因为对约束的检查是在After触发器被激活之前发生的。所以After触发器不能超越约束。

  Instead of 触发器可以取代激活它的操作来执行。它在Inserted表和Deleted表刚刚建立,其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理。

五:使用T-SQL语句来创建触发器

基本语句如下:

create trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert, update,delete ]

  as

  sql_statement

六:删除触发器:

基本语句如下:

drop trigger trigger_name

七:查看数据库中已有触发器:

 -- 查看数据库已有触发器

use jxcSoftware

  go

  select * from sysobjects where xtype='TR'

-- 查看单个触发器

exec sp_helptext '触发器名'

八:修改触发器:

基本语句如下:

alter trigger trigger_name

  on {table_name | view_name}

  {for | After | Instead of }

  [ insert, update,delete ]

  as

  sql_statement

九:触发器实例

创建表student表

use triggerTest;
-- 创建student表
create table Student
(ID        int
primary key identity(1, 1),
studentID int --学号
);

创建borrowRecord表

--创建borrowRecord表
create table Borrowrecord
(   --学生借书记录表
BorrowRecord int identity(1, 1), --流水号
studentID    int, --学号
BorrowDate   datetime, --借出时间
ReturnDate   datetime, --归还时间

);

添加测试数据

INSERT into Student(studentID) values(1)
INSERT into Student(studentID) values(2)
INSERT into BorrowRecord(studentID,BorrowDate,ReturnDAte) VALUES(1,getdate(),getdate()+1)
INSERT into BorrowRecord(studentID,BorrowDate,ReturnDAte) VALUES(2,getdate(),getdate()+1)

触发器的编写

--编写一个触发器 功能:如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
create trigger truStudent on Student --在Student表中创建触发器
for update --为什么事件触发
as

 --事件触发后要做的事情
 if update(studentID)
     begin
         declare @stuidnew int;  --从临时表Inserted记录新的学号ID
         declare @stuidold int;   --从临时表Delete记录更新以前旧的学号ID
         select @stuidold = studentID
         from deleted;
         select @stuidnew = studentID
         from inserted;
         update Borrowrecord
           set 
               studentID = @stuidnew
         where studentID = @stuidold;
         print @stuidnew;
         print @stuidold;
 end;

go

测试触发器

--测试触发器
update Student
set

  studentID = 111

where studentID = 1;

以上代码亲测有效!

总结:

重点是知道触发器主要的2张表:

--触发器的操作 deleted表和inserted表的数据变化 --插入操作(Insert) Inserted表有数据,Deleted表无数据 --删除操作(Delete) --Inserted表无数据,Deleted表有数据 --更新操作(Update) --Inserted表有数据(新数据),Deleted表有数据(旧数据)

文章持续更新,如果喜欢,请拿起你们可爱的小手,给我点个赞吧!

点赞是一种积极的生活态度,赞一个吧!

阅读 1.3k

java随笔_jiege
知道得越多才知道得越少!

知道得越多才知道得越少!

1 声望
1 粉丝
0 条评论
你知道吗?

知道得越多才知道得越少!

1 声望
1 粉丝
文章目录
宣传栏