sql触发器 订阅
行业务规则Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。 展开全文
行业务规则Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。触发器可以查询其它表,并可以包含复杂的Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。
信息
作    用
存储
运用类型
SQL
中文名
SQL触发器
外文名
SQL trigger
SQL触发器优点
触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。比较触发器与约束约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但它在所给出的功能上并不总是最好的方法。实体完整性总应在最低级别上通过索引进行强制,这些索引或是 PRIMARY KEY 和 UNIQUE 约束的一部分,或是在约束之外独立创建的。假设功能可以满足应用程序的功能需求,域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制。在约束所支持的功能无法满足应用程序的功能要求时,触发器就极为有用。例如:除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能以与另一列中的值完全匹配的值来验证列值。CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。约束只能通过标准的系统错误信息传递错误信息。如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器。触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与主键不匹配时,此类触发器就可能发生作用。例如,可以在 titleauthor.title_id 上创建一个插入触发器,使它在新值与 titles.title_id 中的某个值不匹配时回滚一个插入。不过,通常使用 FOREIGN KEY 来达到这个目的。如果触发器表上存在约束,则在 INSTEAD OF触发器执行后但在 AFTER触发器执行前检查这些约束。如果约束破坏,则回滚INSTEAD OF触发器操作并且不执行 AFTER触发器。
收起全文
精华内容
下载资源
问答
  • sql触发器
    2022-01-27 04:26:06

    因为发生某个操作,而自动发生另一个操作

    触发器分类:

    (1)‘instead of’触发器:事前触发器:在执行操作前被执行

    (2)‘after’触发器:事后触发器:在执行操作之后被执行

    语法:

    创建触发器
    create trigger 触发器名 on 表 after insert as 操作 go

    删除触发器

    drop trigger 触发器名

    例:

    在people表添加执行后,进行触发器操作

    crete trigger tri_insert on people after insert

    更多相关内容
  • SQL触发器实例讲解

    2020-12-15 19:41:22
    SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete ...
  • SQL 触发器

    2022-01-24 09:37:44
    SQL 触发器

    触发器( trigger )是作为对数据库修改的连带效果由系统自动执行的一条语句。为了定义一个触发器,我们必须:

    • 指明什么时候执行触发器。这被拆分为引起触发器被检测的一个事件触发器继续执行所必须满足的一个条件
    • 指明当触发器执行时所采取的动作

    一旦我们把一个触发器输人数据库中,只要发生指定的事件并且满足相应的条件,数据库系统就负责去执行它。

    对触发器的需求

    **触发器可以被用来实现特定的完整性约束,这些约束不能使用 SQL 的约束机制来指定。**触发器还是一种有用的机制,用来当满足特定条件时对人们发出警报自动开始执行特定的任务。作为一个示例,我们可以设计一个触发器:只要一个元组被插入 takes 关系中,就在 student 关系中更新选课的学生所对应的元组,把该课的学分数值加入这名学生的总学分中。作为另一个示例,假设一个仓库希望维护每种物品的最低库存量,当一种物品的库存量低于最低水平时,可以自动下单。在更新一种物品的库存时,触发器会比较这种物品的当前库存量和它的最低库存量,并且如果库存量等于或低于最低库存量,就会创建一份新的订单。
    请注意,触发器通常不能执行数据库以外的更新,因此,在补充库存的示例中,我们不能用一个触发器去在外部世界中下订单,而是在存放订単的关系中添加一条订单记录。我们必须创建一个单独的、永久运行的系统进程来周期性地扫描该关系并下单。某些数据库系统提供了内置的支持,可以通过这种方法从 SQL 査询和触发器中发送电子邮件。


    SQL 中的触发器

    现在我们来考虑如何在 SQL 中实现触发器。我们在这里介绍的是由 SQL 标准所定义的语法,但是大多数数据库实现的是这种语法的非标准版本。尽管这里所述的语法可能不被这些系统所支持,但是我们所阐述的概念是对于不同实现都适用的。我们将在注释中讨论标准的触发器实现。在每个系统中,触发器语法都基于该系统中对函数和过程进行编码的语法
    下图展示了如何使用触发器来确保 section 关系的 time_slot_id 属性上的引用完整性。图中第一个触发器的定义指明该触发器在任何一次对 section 关系的插入之后被启动,并且它确保所插入的 time_slot_id 值是合法的。 SQL 插入语句可以向关系中插入多个元组,而触发器代码中的 for each row 子句可以随后显式地在被插入的每一行上进行迭代。 referencing new row as 子句创建了一个 nrow 变量(称为过渡变量( transition variable )),它用来存储所插入行的值。
    在这里插入图片描述
    when 语句指定了一个条件。系统仅对于满足该条件的元组才会执行触发器体中的其余部分。 begin atomic … end 子句用来将多条 SQL 语句汇集成单条复合语句。不过在我们的示例中只有一条语句,它对引起触发器执行的事务进行回滚。因此,违背引用完整性约束的任何事务都将被回滚,从而确保数据库中的数据满足该约束。
    只检查插入时的引用完整性是不够的,我们还需要考虑对 section 的更新,以及对被引用表 timeslot 的删除和更新操作。上图中定义的第二个触发器考虑的是对 time_slot 删除的情况。这个触发器检查要么被删除元组的 time_slot_id 还在 time_slot 中,要么在 section 中不存在包含这个特定 timeslot_id 值的元组,否则将违背引用完整性。
    为了保证引用完整性,我们还必须为处理 section 和 time_slot 的更新来创建触发器;我们接下来将介绍如何在更新时执行触发器,不过,我们将这些触发器的定义留给读者作为练习。对于更新来说,触发器可以指定是哪些属性的更新导致触发器的执行,而其他属性的更新却不会让它执行。例如,为了指定在更新 takes 关系的 grade 属性之后执行一个触发器,我们写作:

    after update of takes on grade 
    

    referencing old row as 子句可以用来创建一个变量,它存储一个已更新或已删除的行的旧值。 referencing new row as 子句除了用于插入之外,还可以用于更新。
    下图展示了当对 takes 关系中元组的 grade 属性进行更新时,如何使用触发器来使 student 元组的 tot_cred 属性值保持最新。只有当 grade 属性从空值或者‘ F ’值被更新为表示课程已成功修完的分数时,该触发器才会执行。除了 nrow 变量的使用之外,更新( update )语句是正规的 SQL 语法。
    在这里插入图片描述
    作为使用触发器的另一个示例,当删除一个 student 元组的操作发生时,需要检查在 takes 关系中是否存在与该学生相关的项,并且如果有则删除这些项。
    许多数据库系统支持各种其他的触发事件,比如当一个用户(应用程序)登录到数据库(即打开一个连接)的时候、系统停止的时候或者系统设置改变的时候。
    触发器可以在事件(插入、删除或更新)之前被激活,而不仅是在事件之后被激活。在事件之前执行的触发器可以作为避免非法更新、插入或删除的额外约束。为了避免执行非法操作而产生错误,触发器可以采取措施来纠正问题,使更新、插入或删除变得合法化。例如,假设我们想把一位教师插人一个系中,但该系的名称并未出现在 department 关系中,那么触发器就可以在插入操作产生外码冲突之前针对该系的名称往 department 关系中插人一个元组。作为另一个示例,假设所插入分数的值为空白,这可能表示分数缺失。我们可以定义一个触发器,将这个值用空( null )值来替换。可以使用 set 语句来执行这样的修改。
    在这里插入图片描述
    我们可以针对引起插入、删除或更新的整条 SQL 语句执行单个操作,而不是针对每个受影响的行执行一个操作。为了做到一点,我们用 for each statement 子句来替代 for each row 子句。然后可以用 referencing old table as 子句或 referencing new table as 子句来指代包含所有受影响行的临时表(称为过渡表( transition table ))。过渡表不能用于 before 触发器,但是它们可以用于 after 触发器,无论是语句触发器还是行触发器。这样,在过渡表的基础上,单条 SQL 语句就可以用来执行多个操作。
    触发器可以被禁用或启用;在缺省情况下,当触发器被创建时它们是启用的,但是可以通过使用 alter trigger trigger_name disable (某些数据库使用其他可替代的语法,比如 disable trigger trigger_name )将其禁用。已被禁用的触发器可以重新启用。通过使用命令 drop trigger trigger_name 还可以删除触发器,该命令将其永久移除。


    何时不用触发器

    触发器有许多很好的用途,例如我们刚刚所看到的那些,然而有一些用途最好用别的可替代技术来实现。比如说,我们可以通过使用触发器而不是使用级联特性来实现外码约束的级联删除( on delete cascade )特性。然而这样不仅需要完成更多的工作,而且它使得数据库中实现的约束集合对于数据库用户来说要难以理解得多
    作为另一个示例,可以用触发器来维护物化视图。例如,如果我们希望能够快速访问到每门课所注册的学生总数,可以通过创建一个关系来实现这个功能:

    section_registration(course_id,sec_id,semester,year,total_students)
    

    它由以下查询来定义:

    select course_id,sec_id,semester,year,count(ID) as total_students from takes 
    group by couseid,sec_id,semester,year;
    

    必须通过 takes 关系的插入、删除或更新上的触发器,来将每门课的total_students的值维护到最新状态。在对section_registration进行元组的插人、更新或删除时可能需要这样的维护,并且必须相应地编写触发器。
    然而,许多数据库系统现在支持的物化视图是由数据库系统来自动维护的。其结果是,没必要编写触发器代码来维护这样的物化视图
    触发器已经被用来维护数据库的备份或者副本在每个关系上可以针对插入、删除或更新来创建一组触发器,以将变化记录在称为 change 或 delta 的关系中。一个单独的进程会将这些变化拷贝到数据库的副本中。然而,现代的数据库系统提供了内置的数据库复制工具,使得在大多数情况下不必为了复制而使用触发器
    触发器的另一个问题在于,当数据从备份副本中加载,或者当一个站点处的数据库更新被复制到备份站点的时候,触发器动作的意外执行。在这样的情况下,触发器动作已经执行了,并且通常不应该再次执行。在加载数据的时候,可以显式地禁用触发器对于可能要接管主系统的备份复制系统来说,必须首先禁用触发器,然后在备份站点接管了主系统的业务后再启用触发器。作为另一种可选方案,一些数据库系统允许触发器被指定为 not for replication ,它保证不会在数据库复制期间在备份站点上执行触发器。另一些数据库系统提供了一个系统变量,它指明该数据库是一套副本,数据库动作在其上是重演的;触发器体会检查这个变量,如果它为真则退出执行。这两种解决方案都不需要显式地禁用和启用触发器。
    编写触发器时应该特别小心,因为运行时检测出的触发器错误会导致触发该触发器的动作语句失败。此外,一个触发器的动作可以触发另一个触发器在最坏的情况下,这甚至会导致无限的触发链。例如,假设一个关系上的插入触发器有一个动作,它引发同一关系上的另一个(新的)插人,该新插入动作随后又触发另外一个插入动作,并如此无穷循环下去。有些数据库系统限制了这种触发链的长度(例如最长到16或32),并把更长的触发链视为一个错误另一些系统将任何这样的触发器标记为错误:该触发器试图引用的关系的修改会导致该触发器首先执行
    触发器可以起到非常有用的作用,但是当存在其他备选方案时最好避免使用触发器许多触发器的应用程序都可以通过存储过程的恰当使用来替换

    展开全文
  • SQL触发器

    2022-02-20 22:35:02
    触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。 触发器可以分为:语句级触发器和行级触发器。 1、在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行...

    触发器简介
    触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。
    触发器可以分为:语句级触发器和行级触发器。
    1、在一个表中定义的语句级的触发器,当这个表被删除时,程序就会自动执行触发器里面定义的操作过程。
    这个就是删除表的操作就是触发器执行的条件了。
    2、在一个表中定义了行级的触发器,那当这个表中一行数据发生变化的时候,比如删除了一行记录,那触发器也会被自动执行了。

    --触发器语法:
    CREATE [OR REPLACE] TRIGGER TRIGGER_NAME
    {BEFORE | AFTER} TRIGGER_EVENT
    ON TABLE_NAME
    [FOR EACH ROW]
    [WHEN TRIGGER_CONDITION]
    TRIGGER_BODY
    
    语法解释:
    TRIGGER_NAME:   触发器名称
    BEFORE | AFTER : 指定触发器是在触发事件发生之前触发或者发生之后触发
    TRIGGER_EVENT:  触发事件,在DML触发器中主要为INSERTUPDATEDELETE等
    TABLE_NAME:     表名,表示发生触发器作用的对象
    FOR EACH ROW:   指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
    WHEN TRIGGER_CONDITION:添加的触发条件
    TRIGGER_BODY:   触发体,是标准的PL/SQL语句块
    
    insert  into dept  values(50,'数据开发','广州')
    
    create table myemp(
           num number,
           name varchar2(10),
           deptno number);
    
    insert  into myemp  values(1001,'张三',50);
    insert  into myemp  values(1002,'李四',50);
    insert  into myemp  values(1003,'张三',50);
    
    创建触发器,当删除DEPT表中50号部门的时候,同时删除myemp所有50号部门的员工信息
    create or replace trigger delete_dept                       --创建dept表触发器
           after delete or insert or update of  deptno       --删除部门号字段后 触发 触发器
           on dept                                                            --
           for each row
    begin
      if deleting then delete from myemp where myemp.deptno=:OLD.deptno;
         end if;
    end;
    
    delete from dept where deptno=50
    
    展开全文
  • sql 触发器使用例子

    2020-09-11 08:43:16
    触发器里没有updated ,只有inserted 和deleted两个临时表。
  • SQL触发器实例讲解.pdf

    2021-10-04 03:18:21
    SQL触发器实例讲解.pdf
  • sql 触发器未触发 SQL Triggers are another powerful database object we have at our disposal. In previous articles, we’ve covered user-defined functions, user-defined procedures, and SQL Views. Today...

    sql 触发器未触发

    SQL Triggers are another powerful database object we have at our disposal. In previous articles, we’ve covered user-defined functions, user-defined procedures, and SQL Views. Today we’ll talk about SQL triggers and how to use them to achieve the desired behavior.

    SQL触发器是我们可以使用的另一个强大的数据库对象。 在先前的文章中,我们介绍了用户定义的函数用户定义的过程SQL视图 。 今天,我们将讨论SQL触发器以及如何使用它们来实现所需的行为。

    该模型 (The Model)

    Before we move to the topic of this article, let’s take a quick look at the model we’re using in this article but also throughout this series.

    在转到本文主题之前,让我们快速看一下本文中以及本系列中使用的模型。

    SQL Triggers - the data model we'll use in the article

    In this article, we’ll focus on DML (data manipulation language) triggers and show how they function when we make changes in a single table.

    在本文中,我们将重点介绍DML(数据操作语言)触发器,并说明在单个表中进行更改时它们如何工作。

    什么是SQL触发器?
    (What Are SQL Triggers?
    )

    In SQL Server, triggers are database objects, actually, a special kind of stored procedure, which “reacts” to certain actions we make in the database. The main idea behind triggers is that they always perform an action in case some event happens. If we’re talking about DML triggers, these changes shall be changes in our data. Let’s examine a few interesting situations:

    在SQL Server中,触发器是数据库对象,实际上是一种特殊的存储过程,它对我们在数据库中执行的某些操作“做出React”。 触发器背后的主要思想是,万一发生某些事件,它们总是执行一个动作。 如果我们在谈论DML触发器,则这些更改将是我们数据中的更改。 让我们研究一些有趣的情况:

    • call table, you want to update that related customer has 1 more call (in that case, we should have integer attribute in the 调用表中执行插入操作,则要更新相关客户还有1个调用(在这种情况下,我们在customer table) 客户表中应具有integer属性)
    • call (update call.end_time attribute value) you want to increase the counter of calls performed by that employee during that day (again, we should have such attribute in the 通话后 (更新call.end_time属性值),您希望增加该员工当天的通话次数(同样, employee table) employee表中应具有该属性)
    • employee, you want to check if it has related calls. If so, you’ll prevent that delete and raise a custom exception 员工时 ,您要检查它是否有相关呼叫。 如果是这样,您将阻止该删除并引发自定义异常

    From examples, you can notice that DML triggers are actions related to the SQL commands defined in these triggers. Since they are similar to stored procedures, you can test values using the IF statement, etc. This provides a lot of flexibility.

    从示例中,您可以注意到DML触发器是与这些触发器中定义SQL命令相关的操作。 由于它们类似于存储过程,因此可以使用IF语句等测试值。这提供了很大的灵活性。

    The good reason to use DML SQL triggers is the case when you want to assure that a certain control shall be performed before or after the defined statement on the defined table. This could be the case when your code is all over the place, e.g. database is used by different applications, code is written directly in applications and you don’t have it well-documented.

    使用DML SQL触发器的充分理由是,当您要确保在定义的表上的定义的语句之前或之后执行某些控件时。 当您的代码无处不在时,可能是这种情况,例如,数据库被不同的应用程序使用,代码直接编写在应用程序中,而您没有充分的文档说明。

    SQL触发器的类型 (Types of SQL Triggers)

    In SQL Server, we have 3 groups of triggers:

    在SQL Server中,我们有3组触发器:

    • DML (data manipulation language) triggers – We’ve already mentioned them, and they react to DML commands. These are – INSERT, UPDATE, and DELETE

      DML(数据操作语言)触发器–我们已经提到过它们,它们对DML命令做出React。 它们是– INSERT,UPDATE和DELETE
    • DDL (data definition language) triggers – As expected, triggers of this type shall react to DDL commands like – CREATE, ALTER, and DROP

      DDL(数据定义语言)触发器–如预期的那样,此类型的触发器应对DDL命令做出响应,例如CREATE,ALTER和DROP
    • Logon triggers – The name says it all. This type reacts to LOGON events

      登录触发器–名称说明了一切。 此类型对LOGON事件作出React

    In this article, we’ll focus on DML triggers, because they are most commonly used. We’ll cover the remaining two trigger types in the upcoming articles of this series.

    在本文中,我们将重点介绍DML触发器,因为它们是最常用的。 在本系列的后续文章中,我们将介绍其余两种触发器类型。

    DML触发器–语法 (DML Triggers – Syntax)

    The simplified SQL syntax to define the trigger is as follows.

    定义触发器的简化SQL语法如下。

    CREATE TRIGGER [schema_name.]trigger_name
    ON table_name
    {FOR | AFTER | INSTEAD OF} {[INSERT] [,] [UPDATE] [,] [DELETE]}
    AS
    {sql_statements}
    

    Most of the syntax should be self-explanatory. The main idea is to define:

    大多数语法应该是不言自明的。 主要思想是定义:

    • A set of {sql_statements} that shall be performed when the trigger is fired (defined by remaining parameters)
    • 触发触发器时应执行的一组{sql_statements} (由其余参数定义)
    • We must define when the trigger is fired. That is what the part {FOR | AFTER | INSTEAD OF} does. If our trigger is defined as FOR | AFTER | INSTEAD OF trigger than SQL statements in the trigger shall run after all actions that fired this trigger is launched successfully. The INSTEAD OF trigger shall perform controls and replace the original action with the action in the trigger, while the FOR | AFTER (they mean the same) trigger shall run additional commands after the original statement has completed
    • 我们必须定义触发触发器的时间。 这就是{FOR | 之后| INSTEAD OF}可以。 如果我们的触发器定义为FOR | 之后| INSTEAD OF触发器比触发器中SQL语句应在成功触发该触发器的所有操作启动后运行。 INSTEAD OF触发器应执行控制并将原始操作替换为触发器中的操作,而FOR | 原始语句完成后, AFTER (它们的意思相同)触发器应运行其他命令
    • The part {[INSERT] [,] [UPDATE] [,] [DELETE]} denotes which command actually fires this trigger. We must specify at least one option, but we could use multiple if we need it

      {[INSERT] [,] [UPDATE] [,] [DELETE]}部分表示实际触发该触发器的命令。 我们必须至少指定一个选项,但是如果需要,可以使用多个

    With this in mind, we can easily write triggers that will:

    考虑到这一点,我们可以轻松地编写触发器,该触发器将:

    • Check (before insert) if all parameters of the INSERT statement are OK, add some if needed, and perform the insert

      (在插入之前)检查INSERT语句的所有参数是否都正确,如果需要,添加一些参数,然后执行插入
    • After insert, perform additional tasks, like updating a value in another table

      插入后,执行其他任务,例如更新另一个表中的值
    • Before delete, check if there are related records

      删除前,请检查是否有相关记录
    • Update certain values (e.g. log file) after the delete is done

      删除完成后更新某些值(例如日志文件)

    If you want to drop a trigger, you’ll use:

    如果要删除触发器,请使用:

    DROP TRIGGER [schema_name.]trigger_name;
    

    SQL INSERT触发器–示例 (SQL INSERT Trigger – Example)

    First, we’ll create a simple SQL trigger that shall perform check before the INSERT statement.

    首先,我们将创建一个简单SQL触发器,该触发器将在INSERT语句之前执行检查。

    DROP TRIGGER IF EXISTS t_country_insert;
    GO
    CREATE TRIGGER t_country_insert ON country INSTEAD OF INSERT
    AS BEGIN
        DECLARE @country_name CHAR(128);
        DECLARE @country_name_eng CHAR(128);
        DECLARE @country_code  CHAR(8);
        SELECT @country_name = country_name, @country_name_eng = country_name_eng, @country_code = country_code FROM INSERTED;
        IF @country_name IS NULL SET @country_name = @country_name_eng;
        IF @country_name_eng IS NULL SET @country_name_eng = @country_name;
        INSERT INTO country (country_name, country_name_eng, country_code) VALUES (@country_name, @country_name_eng, @country_code);
    END;
    

    We can see our trigger in the Object Explorer, when we expand the data for the related table (country).

    展开相关表( 国家/地区 )的数据时,我们可以在对象资源管理器中看到触发器。

    object explore & triggers

    I want to emphasize a few things here:

    我想在这里强调一些事情:

    • The INSERT statement fires this query and is actually replaced (INSTEAD OF INSERT) with the statement in this trigger

      INSERT语句触发该查询,并实际上被此触发器中的语句替换(INSTEAD OF INSERT)
    • We’ve defined a number of local variables to store values from the original insert record (INSERTED). This record is specific for triggers and it allows you to access this single record and its’ values

      我们定义了许多局部变量来存储原始插入记录(INSERTED)中的值。 该记录是特定于触发器的,它允许您访问该单个记录及其值
    • Note: The INSERTED record can be used in the insert and update SQL triggers.注意:可以在插入和更新SQL触发器中使用INSERTED记录。
    • With IF statements, we’ve tested values and SET values if they were not set before

      使用IF语句,我们已经测试了值和SET值(如果之前未设置)
    • At the end of the query, we performed the INSERT statement (the one replacing the original one that fired this trigger)

      在查询结束时,我们执行了INSERT语句(该语句替换了触发该触发器的原始语句)

    Let’s now run an INSERT INTO command and see what happens in the database. We’ll run the following statements:

    现在让我们运行INSERT INTO命令,看看数据库中发生了什么。 我们将运行以下语句:

    SELECT * FROM country;
    INSERT INTO country (country_name_eng, country_code) VALUES ('United Kingdom', 'UK');
    SELECT * FROM country;
    

    The result is in the picture below.

    结果如下图所示。

    the result of the insert statement

    You can easily notice that the row with id = 10, had been inserted. We haven’t specified the country_name, but the trigger did its’ job and filled that value with country_name_eng.

    您可以轻松地注意到,已插入id = 10的行。 我们没有指定country_name,但是触发器完成了工作,并用country_name_eng填充了该值。

    • Note: If the trigger is defined on a certain table, for a certain action, it shall always run when this action is performed.注意:如果触发器是在某个表上定义的,则对于某个动作,它应在执行该动作时始终运行。

    SQL DELETE触发器–示例 (SQL DELETE Trigger – Example)

    Now let’s create a trigger that shall fire upon the DELETE statement on the country table.

    现在,让我们创建一个触发器,该触发器将在country表上的DELETE语句上触发。

    DROP TRIGGER IF EXISTS t_country_delete;
    GO
    CREATE TRIGGER t_country_delete ON country INSTEAD OF DELETE
    AS BEGIN
        DECLARE @id INT;
        DECLARE @count INT;
        SELECT @id = id FROM DELETED;
        SELECT @count = COUNT(*) FROM city WHERE country_id = @id;
        IF @count = 0
            DELETE FROM country WHERE id = @id;
        ELSE
            THROW 51000, 'can not delete - country is referenced in other tables', 1;
    END;
    

    For this trigger, it’s worth to emphasize the following:

    对于此触发器,值得强调以下几点:

    • Once again, we perform the action before (instead of) actual executing (INSTEAD OF DELETE)

      再一次,我们在(而不是)实际执行(INSTEAD OF DELETE)之前执行动作
    • We’ve used record DELETED. This record can be used in the triggers related to the DELETE statement

      我们使用了记录DELETED。 该记录可用于与DELETE语句相关的触发器
    • Note: The DELETED record can be used in delete and update SQL triggers.注意: DELETED记录可用于删除和更新SQL触发器。
    • We’ve used the IF statement to determine if the row should or shouldn’t be deleted. If it should, we’ve performed the DELETE statement, and if shouldn’t, we’re thrown and exception

      我们使用IF语句来确定是否应该删除该行。 如果应该,则执行了DELETE语句,如果不应该,则抛出了异常

    Running the below statement went without an error because the country with id = 6 had no related records.

    运行下面的语句没有错误,因为id = 6的国家没有相关记录。

    DELETE FROM country WHERE id = 6;
    

    If we run this statement we’ll see a custom error message, as shown in the picture below.

    如果运行此语句,我们将看到一个自定义错误消息,如下图所示。

    DELETE FROM country WHERE id = 1;
    

    the error message thrown by the SQL trigger

    Such a message is not only descriptive, but allows us to treat this error nicely and show a more meaningful message to the end-user.

    这样的消息不仅具有描述性,还使我们能够很好地处理此错误,并向最终用户显示更有意义的消息。

    SQL UPDATE触发器 (SQL UPDATE Trigger)

    I will leave this one to you, as a practice. So try to write down the UPDATE trigger. The important thing you should know is that in the update trigger you can use both – INSERTED (after update) and DELETED (before update) records. In almost all cases, you’ll need to use both of them.

    作为练习,我将把这个留给您。 因此,请尝试写下UPDATE触发器。 您应该知道的重要一点是,在更新触发器中,可以同时使用– INSERTED(更新后)和DELETED(更新前)记录。 在几乎所有情况下,都需要同时使用它们。

    何时使用SQL触发器? (When to Use SQL Triggers?)

    Triggers share a lot in common with stored procedures. Still, compared to stored procedures they are limited in what you can do. Therefore, I prefer to have one stored procedure for insert/update/delete and make all checks and additional actions there.

    触发器与存储过程有很多共同点。 但是,与存储过程相比,它们在执行操作方面受到限制。 因此,我更喜欢使用一个存储过程来进行插入/更新/删除,并在那里进行所有检查和其他操作。

    Still, that is not always the option. If you inherited a system or you simply don’t want to put all the logic in the stored procedures, then triggers could a solution for many problems you might have.

    尽管如此,这并不总是选择。 如果您继承了一个系统,或者只是不想将所有逻辑都放在存储过程中,那么触发器可以解决您可能遇到的许多问题。

    目录 (Table of contents)

    Learn SQL: CREATE DATABASE & CREATE TABLE Operations
    Learn SQL: INSERT INTO TABLE
    Learn SQL: Primary Key
    Learn SQL: Foreign Key
    Learn SQL: SELECT statement
    Learn SQL: INNER JOIN vs LEFT JOIN
    Learn SQL: SQL Scripts
    Learn SQL: Types of relations
    Learn SQL: Join multiple tables
    Learn SQL: Aggregate Functions
    Learn SQL: How to Write a Complex SELECT Query?
    Learn SQL: The INFORMATION_SCHEMA Database
    Learn SQL: SQL Data Types
    Learn SQL: Set Theory
    Learn SQL: User-Defined Functions
    Learn SQL: User-Defined Stored Procedures
    Learn SQL: SQL Views
    Learn SQL: SQL Triggers
    Learn SQL: Practice SQL Queries
    Learn SQL: SQL Query examples
    Learn SQL: Create a report manually using SQL queries
    Learn SQL: SQL Server date and time functions
    Learn SQL: Create SQL Server reports using date and time functions
    Learn SQL: SQL Server Pivot Tables
    Learn SQL: SQL Server export to Excel
    Learn SQL: Intro to SQL Server loops
    Learn SQL: SQL Server Cursors
    Learn SQL: SQL Best Practices for Deleting and Updating data
    Learn SQL: Naming Conventions
    学习SQL:CREATE DATABASE&CREATE TABLE操作
    学习SQL:插入表
    学习SQL:主键
    学习SQL:外键
    学习SQL:SELECT语句
    学习SQL:INNER JOIN与LEFT JOIN
    学习SQL:SQL脚本
    学习SQL:关系类型
    学习SQL:联接多个表
    学习SQL:聚合函数
    学习SQL:如何编写复杂的SELECT查询?
    学习SQL:INFORMATION_SCHEMA数据库
    学习SQL:SQL数据类型
    学习SQL:集合论
    学习SQL:用户定义的函数
    学习SQL:用户定义的存储过程
    学习SQL:SQL视图
    学习SQL:SQL触发器
    学习SQL:练习SQL查询
    学习SQL:SQL查询示例
    学习SQL:使用SQL查询手动创建报告
    学习SQL:SQL Server日期和时间函数
    学习SQL:使用日期和时间函数创建SQL Server报表
    学习SQL:SQL Server数据透视表
    学习SQL:将SQL Server导出到Excel
    学习SQL:SQL Server循环简介
    学习SQL:SQL Server游标
    学习SQL:删除和更新数据SQL最佳实践
    学习SQL:命名约定

    翻译自: https://www.sqlshack.com/learn-sql-sql-triggers/

    sql 触发器未触发

    展开全文
  • sql 触发器未触发Hey, folks! In this article, we will be focusing... 在本文中,我们将重点关注SQL触发器 。 什么是SQL触发器? (What is a SQL Trigger?) SQL Trigger is a stored procedure/function that ge...
  • SQL触发器使用实例

    2012-06-22 23:20:35
    SQL触发器使用实例 --创建触发器,示例1 /* 创建触发器[T_INSERT_卷烟库存表],这个触发器较简单。 说明: 每当[卷烟库存表]发生 INSERT 动作,则引发该触发器。 触发器功能: 强制执行业务规则,保证插入的数据...
  • sql 触发器嵌套条件 Nested Triggers in SQL Server are actions that automatically execute when a certain database operation is performed, for example, INSERT, DROP, UPDATE etc. SQL Server中的嵌套...
  • SQL触发器语法参考.rar

    2019-07-09 08:10:49
    SQL触发器语法参考
  • sqlserver 触发器教程

    2020-09-11 04:02:05
    级联删除,如果要删除主类别表的记录,那么把次类别表所属记录以及这个类别所包含的所有文章内容删除
  • SQL触发器详解

    2021-04-06 10:36:13
    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。 -- 购买商品,更新库存的触发器 go create trigger...
  • SQl触发器 声明变量。

    2022-03-18 10:35:22
    begin ----代码块 declare @cwhcode varchar(50) --声明变量 SET @cwhcode = '1' --设置初始值 select @cwhcode=ISNULL(cwhname,'') from inserted a left join Warehouse ...
  • SQL数据库触发器练习题附加数据库
  • SQL触发器编写与查看

    2021-08-31 14:29:29
    2.编写触发器(以更新表一为条件) go create trigger TG_Insert --创建触发器 on DB_TABLE_20210528 --定位某张表 for UPDATE --表 DB_TABLE_20210528 更新时调用该触发器,即关键字 UPDATE决定,删除为 DELETE,...
  • SQL触发器 例题

    2022-01-18 11:05:07
    为student表创建后触发器,在插入数据后更新class表中的StudentNum列信息: create trigger tri_Student on Class after update as update Class set StudentNum=(select StudentNum from inserted) 为teacher...
  • SQL触发器应用实例(Delphi+数据库)..rar
  • 总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对数据库执行数据定义(CREATE、ALTER、DROP或相似的语句)对数据库结构进行...
  • SQL 触发器详解及代码演示

    千次阅读 多人点赞 2020-04-16 18:56:24
    触发器的作用2. 创建触发器3. 查看触发器3.1. show语句查看触发器3.2. information.schema表查看触发器4. 删除触发器5. 使用限制 1. 触发器的作用 触发器主要用于监视某个表的insert、update以及delete等更新操作,...
  • 获取SQL触发器的状态

    2010-11-23 13:39:53
    获取SQL触发器的状态,是启用还是停用,业务系统有时候停用了触发器,可以用此检测
  • SQL触发器综合习题

    千次阅读 2020-03-24 21:50:35
    SQL触发器综合习题 总结 1 每写完一段代码时,后面加一个go,方便后面的分段执行 2 在创建表的代码前备注好 select * from 表名,delete 、drop 以便调试,创建触发器前也备注好删除触发器的SQL代码,触发器创建完成...
  • SQL存储过程习题,SQL触发器习题,SQL习题,基础语法,与W3School类似,初学者学习使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 157,569
精华内容 63,027
关键字:

sql触发器

友情链接: 2.zip