卫通项目总结(触发器详解)

近日,总在思考每次做的项目都大同小异,而且感觉没有什么新的技术点,好多功能都是把原来的项目直接粘贴复制就行了,很难在项目中吸收到技术的养分。做完一个项目细想了一下还是有接触到的还是有一到两个难点:

1、触发器:

  之前写触发器很少,根来不知道怎么写。现在根据自己对触发器的了解进行总结:

  

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL3的触发器是一个能由系统自动执行对数据库修改的语句。
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
语法:
------插入表
 CREATE  TRIGGER [dbo].[触发器名称]
ON [dbo].[要处理的表名称] AFTER INSERT    --AFTET  INSERT 表示 在对表进行Insert 操作后触发
AS 
IF EXISTS (SELECT 1 FROM INSERTED)   --判断对表是否已经插入数据
  BEGIN
    -- 要处理的业务操作
  END
go
 
create TRIGGER [dbo].[tgr_TaskManageExecutorsay_update]
ON [dbo].[TaskManageExecutorsay] FOR UPDATE
AS
BEGIN
   IF  UPDATE(taskRRecfinprogress) or update(TaskRCost)   --判断表更新的字段
  BEGIN
    -- 要处理的业务操作
  END
END 
 
备注:
   在执行触发器的时候数据库会对应有两个表 一个是:
  Inserted表和Deleted表。此二表仅仅在触发器运行时存在。可以使用该两个表来精确地确定触发触发器的动作对数据表所做的修改。比如,通过检查Deleted表,你可以确定那些记录由某一动作删除
  如下例:
CREATE TRIGGER tr_webusers_delete ON webusers

FOR DELETE

AS

INSERT weblog (activity) SELECT user_name FROM Deleted

触发器自动地创建一个webusers表的记录。当在webusers表内删除一个用户的姓名时,触发器会自动地把该姓名插入到weblog表中。假设你一不小心执行了下面的语句:

DELETE webusers

该语句会删除在webusers表内的所有记录。一般地,这些记录会永久地丢失,然而上面的触发器会在有记录从webusers表中删除时自动的触发。该触发器会检查表Deleted来确定有那些在webusers表内的记录被删除,并且把所有删除了的记录拷贝到weblog表中。

为了恢复那些意外被删除的记录,你可以使用INSERT和SELECT语句再一次把它们从weblog表中拷贝到webusers表中。如果你不能允许意外地丢失一条记录时,你可以使用上面的方法来创建一个表内数据的备份。

Deleted表和有记录被删除的表的列结构一模一样。在前面的例子内,Deleted表具有和webusers表相同的结构。

现在假定你想跟踪所有插入某一表格的记录。比如,你想把每一条插入webusers表内的记录都在weblog表内做备份,你可以使用下面的触发器来完成该任务:

CREATE TRIGGER tr_webusers_insert ON webusers

FOR INSERT

AS

INSERT weblog(activty) SELECT user_name FROM INSERTED

该触发器和前面的触发器非常相似,除了以下两点以外:

该触发器在有记录插入表格webusers时触发;该触发器是FOR INSERT。

该触发器把记录从Inserted表拷贝到weblog表内。

Inserted表内包含了所有已经插入到表内的新记录。假如一个新用户的姓名插入到webusers表内时,触发器会自动地把新的用户姓名从webusers表拷贝到weblog表内。

当你想使用一个简单的表来记录所有发生在你数据库中一个非常重要的表的动作时,这种复制数据的方法非常有用。你可以使用该表来获得对你的数据库的活动的记录,并且可以用于记录和诊断一些可能发生的问题。
Inserted表和Deleted表仅仅在触发器在执行时存在,这一点是非常重要的,我们一定要明确。它们在某一特定时间和某一特定表相关。一旦某一个触发器结束执行时,相应的在两个表内的数据都会丢失。如果你想创建一个在任意一个这些表内数据的永久拷贝,你需要在触发器内把这些表内的数据拷贝到一个永久的表内。

  

 

posted @ 2014-03-03 14:52  LuckyZ  阅读(415)  评论(0编辑  收藏  举报