`
liss
  • 浏览: 842379 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

存储过程无法代替触发器的特殊情况

阅读更多

在这里先解释一下推崇用存储过程代替触发器的原因,当然这里先要说明一下此概念受教于ITPUB论坛的newkid版主的经验。

直接进入正题,绝大多数的由触发器提供的功能都可以用存储过程都能实现,而触发器是“隐式”执行,存储过程是“显式”执行,也就是说,当你对一个表进行操作的时候,存储过程出现于你的程序代码中,出现问题可以被发觉,而触发器是自动执行,如果它的出现了问题,你无法在代码中找到它,因而会给造成不必要的麻烦。这就是推荐用存储过程代替触发器的主要原因。

但是,也有一些存储过程无法代替触发器的特例,如果2个表双向都有外键约束,比如t1表有b_id是t2表的b_id的外键,而t2表的a_id则同时也是t1表a_id的外键,那么用触发器可以实现2个表的数据更新,用存储过程就没有办法做的,以下是对此做的一个实验:

---------------------------建表脚本------------------------------

CREATE TABLE t1
(
   a_id NUMBER PRIMARY KEY,
   b_id NUMBER
);


CREATE TABLE t2
(
   b_id NUMBER PRIMARY KEY,
   a_id NUMBER
);

-----------------------------为2个表加上外键-----------------------------------------
ALTER TABLE t1
ADD CONSTRAINT fk1
FOREIGN KEY(b_id)
REFERENCES t2(b_id);

ALTER TABLE t2
ADD CONSTRAINT fk2
FOREIGN KEY(a_id)
REFERENCES t1(a_id);

-------------------------触发器--------------------------------

CREATE OR REPLACE TRIGGER tri_row_ins_t
   after INSERT ON t1
      REFERENCING NEW AS n OLD AS o
   FOR EACH ROW
BEGIN
   INSERT INTO t2(b_id,a_id)
   VALUES(:n.b_id,:n.a_id);
END;


测试:
SQL> insert into t1 values(5,6);

1 row inserted

SQL> commit;

Commit complete


结论:触发器是在语句被编译后,约束条件被执行之前执行的,存储过程则没有办法在约束条件之前执行,所以会有这种无法使用存储过程代替触发器的特例,当然以上条件的出现情况也不常见

综上,再强调开头那一段思想,在你想到使用触发器的时候,再想一想怎样用存储过程来替代之是个比较好的习惯。

分享到:
评论

相关推荐

    SQLSERVER实用教程- 存储过程和触发器.pdf

    **触发器**是一种特殊的存储过程,当特定的数据库事件(如插入、更新或删除数据)发生时自动执行。触发器可以帮助维护数据库的完整性,例如在更新数据时自动检查某些约束。 #### 四、创建与使用触发器 ##### 1. ...

    存储过程-触发器-ODBC数据库编程-实验报告.pdf

    触发器是特殊类型的存储过程,它会在满足特定事件(如INSERT、UPDATE或DELETE)发生时自动执行。文档提到了三种触发器:insert_s、dele_s1和dele_s2。触发器分为两种类型:FOR EACH ROW(每行触发)和FOR EACH ...

    数据库之—用触发器实现每个学生最多只能选择3门课程

    - 对于复杂的业务逻辑,可以考虑使用其他机制(如存储过程)来代替触发器。 通过以上知识点的详细介绍,我们不仅理解了触发器的基本概念和用途,还具体了解了如何使用触发器来限制学生选课数量的方法和步骤,以及...

    数据库学习中的触发器

    数据库触发器是数据库管理系统中一种特殊类型的存储过程,它不依赖于用户的直接调用,而是由特定的数据库操作(如INSERT、UPDATE、DELETE)自动触发执行。触发器的主要作用是增强数据库的完整性约束,实现更复杂的...

    批量创建数据库中所有表的触发器,删除所有触发器

    在SQL数据库管理中,触发器是一种特殊的存储过程,它在数据修改操作(如INSERT、UPDATE或DELETE)发生时自动执行,允许程序员实现复杂的业务规则和数据完整性约束。本主题将详细探讨如何批量创建和删除数据库中的...

    plsql 触发器

    触发器是一种特殊类型的存储过程,在数据库中作为独立对象存储。与普通存储过程不同的是,触发器不是由其他程序显式调用,而是由特定事件触发自动执行。这些事件通常包括数据表上的插入(INSERT)、更新(UPDATE)或...

    触发器---FOR INSERT与INSTEAD OF

    触发器是一种特殊的存储过程,它可以自动执行某些操作以响应特定的事件,如INSERT、UPDATE、DELETE等。触发器可以帮助我们自动执行一些必要的操作,以确保数据的一致性和完整性。今天,我们将讨论FOR INSERT与...

    用触发器实现数据库的完整性

    触发器是一种特殊的存储过程,与特定的表紧密关联。当表中的数据发生变化时(如插入、更新或删除操作),触发器会自动执行预定义的操作。通过这种方式,触发器可以帮助维护数据的一致性和完整性,实现复杂的业务逻辑...

    数据库之 触发器的操作与管理

    触发器是数据库管理系统中一种特殊类型的存储过程,它会在特定的数据库语言事件发生时自动执行。在SQL Server 2005中,主要存在两种类型的触发器:DML触发器和DDL触发器。 1. **DML触发器**(Data Manipulation ...

    sql触发器代码

    在SQL Server中,触发器是一种特殊的存储过程,它会在特定的数据库操作(如INSERT、UPDATE或DELETE)执行前后自动执行。`INSTEAD OF`触发器是一种特殊类型的触发器,当触发器被激活时,它会代替原本的操作,并执行...

    别人一看就能理解的懂触发器程序,非常实用.

    在IT领域,数据库触发器是一种特殊类型的存储过程,它被设计为当特定事件(如数据的插入、更新或删除)发生时自动执行。本文将基于提供的文件信息,深入解析触发器的概念、工作原理以及示例代码中的具体实现,旨在...

    触发器的使用

    触发器是一种特殊类型的存储过程,主要用于数据库管理系统中实现自动化的业务逻辑处理。与传统的存储过程不同,触发器不需要显式地调用,而是由特定的数据库事件(如数据插入、更新或删除等)自动触发执行。 触发器...

    数据库触发器的ppt

    2. **存储性**:创建后,触发器作为数据库对象存储在数据库中。 3. **灵活性**:相比约束(如Foreign Key约束和Check约束),触发器提供更广泛的数据验证和处理能力,可以执行更复杂的逻辑。 ### 二、创建触发器 ...

    在MSSQLServer中创建触发器.pdf

    触发器(Trigger)是一种特殊类型的存储过程,它是自动执行的程序块,用于对数据库中的数据操作(如INSERT、UPDATE、DELETE)进行响应。触发器可以用来增强数据的完整性约束,或者实现复杂的业务逻辑,确保数据的...

    SQL Server数据库中DML触发器的教学探讨.pdf

    INSTEAD OF触发器的特殊之处在于它能够代替原本的数据操作(即INSERT、UPDATE、DELETE操作),这意味着可以使用INSTEAD OF触发器来执行那些由于逻辑限制无法直接在视图上执行的数据操作。它允许触发器内部代码来修改...

    SQLite触发器详细指南

    触发器是一种特殊类型的存储过程,它们的执行不是由用户直接发起的,而是在满足特定条件时自动触发的。SQLite的触发器可以被表或视图上的数据库事件所触发。 SQLite中的触发器使用CREATE TRIGGER语句定义。一个...

Global site tag (gtag.js) - Google Analytics