什么是触发器

触发器是一种用来保障参照完整性的特殊的存储过程,它维护不同表中数据间关系的有关规则。当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。触发器可以调用存储过程。

创建触发器的语法:

Create Trigger[owner.]触发器名

On [owner.]表名

For {insert,update,delete}

As

Begin

SQL语句(块)

End

定义一个好的触发器对简化数据的管理,保证数据库的安全都有重要的影响。触发器是针对表一级的,这就意味着,只有表的所有者有权创建表的触发器。

举例:

插入一个新行,必须保证外键与主键相匹配,触发器应该首先检查被插入行与主键表的连接。

以下的触发器对inserted表和titles表的title_id进行比较,这里假设正在给外键输入数据,没有插入空值,若连接失败,事务被回退。insert,update,delete

Create trigger forinsertrigl

On salesdetail

For insert

As

If(select count(*)

From title,inserted

Where titles.title_id=inserted.title_id)!=@@rowcount

Begin

Rollback transaction

Print “No,some title_id does not exist in titles.”

End

Else

Print “Added! All the title_id is exist in titles.”

在本例中,@@rowcount代表添加到salesdetail表的行数,这也是添加到inserted表中的行数。通过连接表titles和表inserted来检测所有添加到salesdetail的title_id是否在titles中存在。若所连接的行数(count(*))与@@rowcount不同,由有一个或多个插入不正确,整个事务被取消。

触发器的限制:

●一个表最多只能有三个触发器,insert,update,delete

●每个触发器只能用于一个表

●不能对视图、临时表创建触发器

●Truncate table能删除表,但不能触发触发器

●不能将触发器用于系统表

合理地使用触发器对性能的影响是正面的。在设计和使用触发器时,经常地用sp_depends命令了解对象所关联的触发器是有好处的,该命令能列出触发器影响的所有对象、表和视等。

在定义几类数据库对象的时候,对存储过程、索引和触发器要给予特别的注意,尤其存储过程,它设计的好坏对数据库性能的影响很大。

说明:Sybase触发器使用的两个测试表:Deleted表和Inserted表,它们都是临时表,其结构与触发器的基表结构相同,用来存放与修改相关的数据行。

时间: 2024-09-27 03:02:37

什么是触发器的相关文章

Sql 触发器

        触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束.          触发器在数据库里以独立的对象存储,与存储过程不同的是,存储过程通过其他程序来启动运行,而触发器是由一个事件来启动运行.即当某个事件发生时,触发器自动地隐式运行.并且,触发器不能接收参数.         触发器对象定义了触发器的特征和被调用时采取的行动.而这些动作是通过一个或多个SQL语句来实现的.SQL支持

PostgreSQL 自带自增字段 请勿使用触发器或其他手段生成(Like Oracle, MySQL)

在Oracle中,因为不能设置字段的default sequence.nextval,所以如果要设置自增字段,需要使用触发器.例如: create sequence seq; create table test(id int, info text); CREATE OR REPLACE TRIGGER tg1 BEFORE INSERT ON test FOR EACH ROW BEGIN SELECT seq.nextval INTO :new.ID FROM dual; end; 这种方式能

sqlserver 存储过程-关于一个数据库触发器的问题

问题描述 关于一个数据库触发器的问题 请教一个数据库相关的问题 各位大神好,小弟现正使用sqlserver数据库,现有这么一个需求, 需要监视有关 表A 的插入,修改,删除 操作,并需要将新的整条数据形成类似 <tbrecord id="某一行的ID" columnAname="该行的列名为columnAname的值" columnBname="该行的列名为columnAname的 值">tbName(表的名称) 一个xml字符串保存

Oracle中触发器详解

Oracle触发器分类: 1. 语句触发器 2. 行触发器 3. 系统条件触发器 4. 用户事件触发器 5. INSTEAD OF 触发器 1. 语句触发器 是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器.能够与INSERT.UPDATE . DELETE或者组合上进行关联.但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激 活一次 .比如,无论update多少行,也只会调用一次update语句触发器. 例子: 需要对在表上进行DML操作的用户进行安全检查,看是否具有

触发器插入问题,急急急!!!!!!!!!

问题描述 触发器插入问题,急急急!!!!!!!!! 有表test1(字段id,time),有表test2(字段id,time),如何写触发器将test1表中最新一条数据插入到表test2中 解决方案 建议下载工具,Navicat Premium,可以连接多种数据,在工具中,有专门写的触发器的地方.![图片说明](http://img.ask.csdn.net/upload/201503/11/1426060243_656360.png)

一个简单的oracle触发器

    业务需要,写一个触发器    在tab_user_detail表增加一条数据后,往tab_user表增加一条记录    create trigger tri_user_insert    after insert on tab_user_detail    for each row    begin    insert into tab_user (USER_ID,USER_NAME,USER_PWD,USER_CUSTOMERNAME,USER_PHOTOS) values (:new

sql update 触发器 可获得被update的行的信息

复制代码 代码如下: create trigger TgName on tb for update as if update(recommend) begin update tb set commenddate=(getdate()) from tb inner join inserted on tb.vlistid=Inserted.vlistid end recommend表示被更新的字段. 关键在于Inserted表 触发器语句中使用了两种特殊的表:deleted 表和 inserted

SQL Server 2005中的DDL触发器的实现

server|触发器     SQL SERVER 2005中,新增加了许多新的特性,其中的DDL触发器是个不错的选择,根据资料初步学习如下,现整理之:    在sql server 2000中,只能为针对表发出的 DML 语句(INSERT.UPDATE 和 DELETE)定义 AFTER 触发器.SQL Server 2005 可以就整个服务器或数据库的某个范围为 DDL 事件定义触发器.可以为单个 DDL 语句(例如,CREATE_TABLE)或者为一组语句(例如,DDL_DATABASE

SQL触发器在保持数据库完整性中的实际应用

触发器是SQL Server数据库应用中一个重要工具,是一种特殊类型的存储过程,应用非常广泛.一般存储过程主要通过存储过程名而被直接调用,触发器则是通过事件触发执行.触发器基于一个表来创建并和一个或多个数据修改操作(插入.更新或删除)相关联,可视作表的一部分.触发器与数据库中的表紧密相关,比如当对表执行INSERT.UPDATE或DELETE操作时,触发器就会自动执行. SQL Server 包括两大类触发器:DML 触发器和 DDL 触发器.其中DDL 触发器是 SQL Server 2005

触发器与存储过程互调

触发器|存储过程 :) --触发器如何调用存储过程create trigger test on tablefor insertasexec 存储过程名go   --存储过程如何调用触发器 create proc testasupdate table set ...insert table select ...delete table ...