`
xitong
  • 浏览: 6205229 次
文章分类
社区版块
存档分类
最新评论

SQL触发器的经典知识!

 
阅读更多
触发器的基础知识
:create trigger tr_name
on 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 ,inserted
deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一
样的,只是存放 的数据有差异。


下面表格说明deleted 与inserted 数据的差异
deleted 与inserted 数据的差异
Inserted
存放进行insert和update 操作后的数据
Deleted
存放进行delete 和update操作前的数据
注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后

的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中
============================================================================
有一个表aaa,3个字段为:Id为自增

Id(自增)  No(数值型字段)    Name(姓名)
1         1        张名
2         2        李华
3         4        周青
----------------------------------------

if object_id('aaa') is not null 
drop table aaa
go
create table aaa(
Id int identity(1,1),
No int null,
Name varchar(20))
go
create trigger aaa_ins
on aaa
after insert
as
   update aaa set No=i.Id
        from inserted i 
        where aaa.Id=i.Id
go
insert into aaa(Name) values('a');
select * from aaa;
直接增加
create table aaa
( Id int identity(1,1),
  No int default(isnull(scope_identity(),0)+1),
  Name varchar(20)
)

insert into aaa(Name) values('a')

select * from aaa



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表仅仅在触发器在执行时存在,这一点是非常重要的,我们一定要明确。它们在某一特定时间和某一特定表相关。一旦某一个触发器结束执行时,相应的在两个表内的数据都会丢失。如果你想创建一个在任意一个这些表内数据的永久拷贝,你需要在触发器内把这些表内的数据拷贝到一个永久的表内。

分享到:
评论

相关推荐

    SQL触发器知识和实例

    2010年学数据库触发器知识和心得供给有需要的朋友(有实例哦。)

    SQL 教程\触发器代码示例.doc

    SQL 教程\触发器代码示例.doc,此触发器代码更让你能更快掌握这些知识

    sql server触发器工作原理

    sql server触发器工作原理 京华志&精华志出品 希望大家互相学习,互相进步 支持CSDN 支持微软 主要包括C# ASP.NET SQLDBA 源码 毕业设计 开题报告 答辩PPT等等好多知识

    面试SQL基础看这里!一天搞定50常考题

    内容涵盖了SQL基础概念、数据类型、SELECT语句、WHERE子句、ORDER BY子句、INSERT INTO语句、UPDATE语句、DELETE语句、JOIN操作、子查询、...SQL函数、分组与聚合、递归查询、约束、触发器、存储过程、视图等高级知识点...

    数据库SQL知识点总结、代码及练习题代码

    数据库mysql、SQL server压缩包包含内容: 1.数据库的创建修改批量插入等基本操作及sql文件 2.数据表的约束、查询及sql文件 3.SQL server函数及sql文件 ...7.触发器 存储过程 索引 视图 知识点及sql文件 8.事务ACID理解

    SQL Server 2005编程入门经典-触发器和存储过程 pdf版.rar

    SQL Server 2005编程入门经典第2版中的存储过程和触发器相关知识的介绍,还涉及索引的创建和使用技巧 ,平衡树等,并不是完整版的SQL2005编程入门经典,想了解存储过程及触发器的朋友可不要错过了。

    sql_server_2008_存储过程与触发器

    详细介绍了sql_server_2008_存储过程与触发器的知识,并带有示例,明了易懂

    数据库面试题触发器SQL优化

    数据库基础知识,mysql引擎,索引,事务,锁,视图,游标,存储过程,触发器,查询,数据类型,SQL优化,数据库优化 使用AbstractRoutingDataSource+aop+annotation在dao层决定数据源。 如果采用了mybatis, 可以将...

    SQlServer入门经典

    sqlServer入门常用知识点,涵盖SQlserver的安装教程,存储过程、触发器、数据库的常用优化方案

    Sql Server知识点全集

    一个全面、详细的Sql Server2000的知识点集合。里面涉及了从最基本的建数据库、表, 到较为麻烦的事务、约束、触发器等,从简单到复杂层层递进,很实用,会是你理想的帮手...

    常用sqlserver知识讲解

    sql server 技术详解,学习资料;包含基本语法、函数、数据类型、存储过程、触发器等语法规则的详细解析,新手入门必备资料

    SQL Server 触发器实例详解

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的,接下来本文通过实例详解sqlserver触发器,对sqlserver触发器相关知识感兴趣的朋友一起学习吧

    存储过程_函数和触发器_数据库.ppt

    外企需要会sql编程基础的知识,总结了一下基础的sql编程,SQL是访问和处理数据库的标志的计算机语言,SQL是结构化查询语言。本文简略总结了:T-SQL编程基础,存储过程,触发器,自定义函数

    数据库——触发器基础知识

    1 触发器的定义 2 创建和执行触发器 2.1 触发器中的 new和 old 2.2 创建触发器 2.3 执行触发器 3 删除触发器 4 查看触发器 5 触发器的优点与缺点 1 触发器的定义 触发器(trigger)是和表关联的特殊的存储过程,当...

    100个SQL必需掌握的知识点(2022年全新汇总).zip

    100个SQL必需掌握的知识点(2022年全新汇总).zip SQL 是使用最为广泛的数据库语言。不管你是应用开发者、数据库管理 员、Web 应用设计师、移动应用开发人员,还是只使用流行的报表工具 的普遍用户,掌握良好的 SQL...

    探究 SQL Server 的触发器:第二部分VC源代码

    这个月我会继续上个月的专栏——“SQL SERVER触发器的基础知识及其特点” 。我开这个专栏的目的是为了回应我收到的许多关于触发器的问题。我会从 INSTEAD OF 触发器以及它与AFTER 触发器差别开始讲起。然后我会在...

    实验六-触发器实验报告.doc

    掌握行级触发器的编写 [预备知识] 1. PL/SQL程序设计 [实验原理] 1. 建立触发器 CREATE [OR REPLACE] TRIGGER <触发器名> BEFORE"AFTER INSERT"DELETE"UPDATE OF <列名> ON <表名> [FOR EACH ROW] WHEN (<条件>) ...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一)

    通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录...

    Oracle 11g SQL和PL SQL从入门到精通〖送源代码〗

    通过学习本书,读者不仅可以掌握Oracle常用工具Oracle Universal Installer、Net Comfiguration Assistant、SQL Developer、SQL*Plus的作用及使用方法,而且可以掌握SQL语句和PL/SQL的各种基础知识和高级特征(记录...

    Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二)

    通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录...

Global site tag (gtag.js) - Google Analytics