trigger 专题

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。 触发器本身没有过错,但由于我们的滥用会造成数据库及应用程序的维护困难。

在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作,比如删除 T1 表记录时期望删除 T2 表相关的记录,此时可以建立级联删除的关系,也可以为 T1 表建立触发器使同时删除 T2 表相关记录,也可以自定义存储过程删除 T1 和 T2 表的记录,也可以在应用程序中使用两个 SQL 语句来删除……到底用哪一种好呢,应该说我们建立通过建立关系来实现级联删除是最好的,除非更有高的需求。

触发器还有一个用途可以用来保障数据的完整性,但同时规则、约束、默认值也可以保障数据完整性,到底哪一个好呢,一般说来,较为简单的完整性要求我们不应该使用触发器。两者在运行机制上也是有区别的,像规则、约束、默认值这些是在数据更改之前进行数据验证,而触发器是在数据更改之后进行验证(如果事务回滚,该表将不会产生变化)。

总之,如果我们对触发器过分的依赖,就会造成遍地是程序的情况,因为触发器本身就需要别的程序给它一个触发条件,也就是说至少在两个地方存在着程序,同时我们抛弃了约束、默认值等而选用触发器,势必影响数据库的结构。

触发器是一种特殊的存储过程,类似于事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列 T-SQL语句。

触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写 T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。

创建触发器用 CREATE TRIGGER

CREATE TRIGGER 触发器名称
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
    T-SQL 语句

注意:触发器名称是不加引号的。

如下是联机丛书上的一个示例,当在 titles 表上更改记录时,发送邮件通知 MaryM。
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE, DELETE
AS
   EXEC master..xp_sendmail 'MaryM',
      'Don''t forget to print a report for the distributors.'

用查询分析器删除

在查询分析器中使用 drop trigger 触发器名称 来删除触发器。

也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称...

注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:

if Exists(select name from sysobjects where name=触发器名称 and xtype='TR')

用企业管理器删除

在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。

 

递归触发器

递归分两种,间接递归和直接递归。我们举例解释如下,假如有表1、表2名称分别为 T1、T2,在 T1、T2 上分别有触发器 G1、G2。

  • 间接递归:对 T1 操作从而触发 G1,G1 对 T2 操作从而触发 G2,G2 对 T1 操作从而再次触发 G1...
  • 直接递归:对 T1 操作从而触发 G1,G1 对 T1 操作从而再次触发 G1...

嵌套触发器

类似于间接递归,间接递归必然要形成一个环,而嵌套触发器不一定要形成一个环,它可以 T1->T2->T3...这样一直触发下去,最多允许嵌套 32 层。

 


 

设置直接递归

默认情况下是禁止直接递归的,要设置为允许有两种方法:

  • T-SQL:exec sp_dboption 'dbName', 'recursive triggers', true
  • EM:数据库上点右键->属性->选项。

设置间接递归、嵌套

默认情况下是允许间接递归、嵌套的,要设置为禁止有两种方法:

  • T-SQL:exec sp_configure 'nested triggers', 0 --第二个参数为 1 则为允许
  • EM:注册上点右键->属性->服务器设置。

触发器到底可不可以在视图上创建 在 SQL Server™ 联机丛书中,是没有说触发器不能在视图上创建的, 并且在语法解释中表明:在 CREATE TRIGGER 的 ON 之后可以是视图。 然而,事实似乎并不是如此,很多专家也说触发器不能在视图上创建。 我也专门作了测试,的确如此,不管是普通视图还是索引视图,都无法在上面创建触发器,真的是这样吗?

在视图上创建普通触发器可能会出现“对象无效”的错误,实际上,我们不能在视图上创建 FOR 触发器,而应该创建 INSTEAD OF 触发器

INSTEAD OF
执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:
create trigger f
on tbl
instead of delete
as
    insert into Logs...

IF UPDATE(列名)
检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:
create trigger f
on tbl
for update
as
    if update(status) or update(title)
        sql_statement --更新了 status 或 title 列

inserted、deleted
这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:
create trigger tbl_delete
on tbl
for delete
as
    declare @title varchar(200)
    select @title=title from deleted
    insert into Logs(logContent) values('删除了 title 为:' + title + '的记录')
说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。

 

不能在触发器中使用的语句 触发器中可以使用大多数 T-SQL 语句,但如下一些语句是不能在触发器中使用的。

  • CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
  • ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
  • DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
  • DISK 语句,如:DISK INIT、DISK RESIZE。
  • LOAD 语句,如:LOAD DATABASE、LOAD LOG。
  • RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。
  • RECONFIGURE
  • 说明:有人说不能用 TRUNCATE TABLE 语句,其实是可以的 
PostgreSQL trigger 创建Trigger Step1:使用CREATE FUNCTION命令创建一个Trigger函数。 Step2:使用CREATE TRIGGER命令将Trigger函数固定到一个表中。 创建Trigger函数 语法 CREATE FUNCTION trigger_function() RETURNS TRIGGER LANGUAGE PLPGSQL AS $$ BEGIN -- trigger logic goes here? END; $... 阅读详情

相关推荐

Flink之Trigger与Evictor

一、概述 在Flink中,使用event-time模式时,默认提供的window有TumblingEventTimeWindows,SlidingEventTimeWindows,EventTimeSessionWindow等,其中这些是属于window operator中的一部分,称作 window assigner。window operator包含四个组件,除了 window assigne...

heroking 5485

触发器电路仿真与硬件实现

在电子、计算机科学和工程领域,触发器(Trigger)是一种特殊的电路元件或信号,它可以根据预先设定的条件或事件来产生相应的输出信号或动作。触发器是数字电路中的基本元件,用于控制信号的时序、逻辑运算和状态转换。

Cynthia040330的博客 2136

WPF 绑定之Trigger

使用control自由的property作为trigger   View Code ToggleButton Width="30" Height="30"> ToggleButton.Style> Style TargetType="ToggleButton"> Style.Triggers>

haylhf的专栏 2533

示波器中的Trigger

什么是Trigger,它在示波器中的作用是什么? 先来看看别人是怎么说的。 The trigger event establishes the time-reference point in the waveform record. All waveform record data is located in time with respect to that point. The instru...

贾亮的专栏 1万+

Quartz-Trigger详解

文章目录概述触发器接口基本...

别抢我蓝buff 4744

uvm_event之wait_trigger和wait_trigger_data的用法

相信大家对uvm event一定不陌生,对我这种半路出家的人来说,uvm event简直就是神器,好多需要进行时序控制,以及跳转触发的都可以通过uvm event实现。 uvm event 用法 1. 文件a: uvm_event event1;//定义 event1=uvm_event_pool::get_global("event1");//例化 条件: event1.trigger(); 文件b: uvm_event event1;//定义 event1=uvm_event_poo

a52228254的博客 7373

Flink触发器Trigger

通过子类继承 Trigger 重写相应的方法,即可自定义我们自己的触发器。举个例子,我们自定义一个和时间不相关的 Trigger,我们等窗口积攒到一定数量的元素再出发计算。@Override// 通过Flink state来保存窗口内积攒的元素数量@Override@Override@Override接下来验证一下我们的Trigger是否生效。

程序员小潘 1738

trigger的用法总结

最重要最基础的语法: $(selector).trigger(event,eventObj,param1,param2,...) event:必需。规定指定元素上要触发的事件。 可以是自定义事件,或者任何标准事件。 param1,param2,...可选。传递到事件处理程序的额外参数。 额外的参数对自定义事件特别有用。 与triggerHandle的区别: ● 它不会引起...

个人前端记录 2万+

ClearCase Trigger指南(4)-Trigger可以做什么

声明:本文欢迎非商业用途转载,如果象某些网站对用户收费则谢绝转载,如若转载,请标明转载,原作者与出处,不要象我以前的一些文章,有人直接当做自己写的发表去赚稿费了。Trigger可以做什么?所有的刚接触ClearCase的用户一般都认为Trigger是执行一个程序,实际并不是如此,这里我们给出一个例子,Trigger也可以执行一些ClearCase操作,如mklabel,mkattr等:

自得其乐的崔秉正 3864

non-trigger-based sounding和trigger-based sounding过程有什么区别?

主要说明了non-TB和TB

谦豫 1599

Quartz如何获取当前执行的Trigger如何注册多个Trigger到Job中,如何自定义的 Trigger

/ 在这里实现获取下一次触发时间的逻辑 return null;// 在这里实现获取上一次触发时间的逻辑 return null;// 在这里实现设置下一次触发时间的逻辑 } @Override public void setPreviousFireTime(Date date) {

咖啡程序员 779

systemc: next_trigger在SC_METHOD中的用法

之前的博客中有提到过,SC_METHOD在同一拍只能被执行一次,其实这句话成立需要加一个前提,就是在没有Next_trigger参与的情况下。有next_trigger参与的情况下,SC_METHOD是可以在同一拍被执行两次的,且只能是被静态敏感事件触发一次,被动态敏感事件触发一次。 Next_trigger 只能在SC_METHOD函数中使用,不能在SC_THREAD和SC_CTHREAD中使用...

zgcjaxj的博客 2749

epoll 的 Edge Trigger 和 Level Trigger 理解

Stackoverflow 上有个问题讨论了这个话题: http://stackoverflow.com/questions/9162712/what-is-the-purpose-of-epolls-edge-triggered-option Level Trigger 就是在描述符就绪的时候,内核会持续地通知进程,直到进程处理描述符,但是有时候我们并没办法第一时间就去处理这个描

Eric ' s Code Blocks 2506

ClearCase Trigger指南(7)-修改与删除一个Trigger

 本文欢迎任何非商业用途转载,请注明作者,出处修改与删除一个Trigger 在创建完Trigger并将Trigger关联到要操作的对象后,常常会发现Trigger并没有完全满足要求,可能根据没有起到作用,或者对开发人员起了阻碍作用,这时我们要修改或删除Trigger。当出现问题时,我们先要分析原因,而不是马上动手。首先判断是不是Trigger仅是对某些具体对象不适用;这种情

自得其乐的崔秉正 4445

手动管理触发器:HairTrigger create_trigger与drop_trigger使用指南

HairTrigger 是一款为 ActiveRecord 提供数据库触发器管理功能的工具,通过 `create_trigger` 和 `drop_trigger` 方法,开发者可以轻松实现触发器的创建与删除,无需编写复杂的原生 SQL。本文将详细介绍这两个核心方法的使用技巧,帮助新手快速掌握手动管理数据库触发器的完整流程。 ## 核心功能解析:为什么选择 HairTrigger? 在数据库

gitblog_00069的博客 1219

Quartz(2-Trigger

Quartz触发器Trigger介绍,自定义任务的执行时间

peng_gx的博客 897

java trigger_Quartz教程四:Trigger

本系列教程由quartz-2.2.x官方文档翻译、整理而来,希望给同样对quartz感兴趣的朋友一些参考和帮助,有任何不当或错误之处,欢迎指正;有兴趣研究源码的同学,可以参考我对quartz-core源码的注释(进行中)。与job一样,trigger也很容易使用,但是还有一些扩展选项需要理解,以便更好地使用quartz。trigger也有很多类型,可以根据实际需要来选择。Trigger的公共属性所...

weixin_36318548的博客 1206

CREATE TRIGGER 语句

说明  此语句用于在数据库中创建新触发器。它是一种形式的触发器,专门设计用于 SQL Remote。 语法  CREATE TRIGGER trigger-name trigger-timetrigger-event, ...[ ORDER integer ] ON table-name[ REFERENCING [ OLD AS old-name ]   [ NEW AS new-na...

iteye_3782的博客 1096

原生js实现trigger方法

事件绑定成功之后,事件的执行函数就如同待字闺中的小姑娘。除了由坐在电脑前的大叔们用键盘、鼠标等硬件行为触发外,需要在代码中直接调用又该如何实现? 首先需要将事件绑定至指定DOM节点上 // 在一个节点上绑定一个事件 let test = document.createElement('div'); test.id = 'test'; test.innerHTML = '测试事件'; docum...

永恒的避风港 3471
上一篇: SQL Server 索引基础知识(2)----聚集索引,非聚集索引
下一篇: 关于SQL Server中几个未公布的访问注册表的扩展存储过程
utpcb
博客等级 码龄20年 70粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值