`

【转】关于触发器中是否可以使用commit的验证

 
阅读更多

转自:http://blog.chinaunix.net/uid-20449297-id-1676808.html

前天,被biti_rainy大师问了一个触发器中是否可以使用commit。其实以前写了不少触发器,但是还真从来没有考虑过这个问题,当然也就没有在触发器中用过,大师为人比较严谨,开始我说好像可以吧,被说了一顿,可以就是可以,不可以就是不可以,没有中间的“好像可以”。在回来的路上,我好好回忆了这次的谈话,确实,我做学问搞技术还存在很多不好的习惯,不知道的就是不知道,知道的就是知道,没有什么好像知道的,从这些细小的方面可以看出,大师就是大师,做技术必须严谨。技术问题没有模菱两可的说法。所以决定,要想做好技术光有态度端正不行,还需要严谨的态度和打破砂锅问到底的作风,问题不过夜的好习惯,所以回来我就自己测试了一下:知道的读者可能感觉这个问题很简单,但是个人认为收获非常大,不仅仅是简单的一个问题,而是一种处事的态度,不可忽视,现在亡羊补牢,尚未晚已。以下是简单的测试过程:

 

SQL> CREATE TABLE TEST AS SELECT * FROM DBA_OBJECTS WHERE 1=2;

 

表已创建。

 

SQL> CREATE TABLE TEST_TEST AS SELECT OBJECT_ID,OBJECT_NAME

  2  FROM TEST

  3  WHERE 1=2;

 

表已创建。

 

创建两个测试表

 

SQL> CREATE TRIGGER TEST_TRIGGER

  2  AFTER INSERT ON TEST

  3  FOR EACH ROW

  4  BEGIN

  5      INSERT INTO TEST_TEST(OBJECT_ID,OBJECT_NAME)

  6             VALUES(:NEW.OBJECT_ID,:NEW.OBJECT_NAME);

  7  END;

  8  /

 

触发器已创建

 

在一个表上创建一个触发器,当想其中一个表插入数据时,自动向另外一个表中插入一条记录。

 

SQL> SELECT OBJECT_ID,OBJECT_NAME FROM TEST;

 

未选定行

 

SQL> INSERT INTO TEST (OBJECT_ID,OBJECT_NAME) VALUES(1,'NAME1');

 

已创建 1 行。

 

SQL> SELECT OBJECT_ID,OBJECT_NAME FROM TEST_TEST;

 

 OBJECT_ID         OBJECT_NAME                                                                    

------------    --------------

1                 NAME1                                                                          

                                                                                

以上表明,触发器正常工作,当向表test1插入一条记录必定也就向test_test1表中插入相应的一条记录。

 

SQL> ROLLBACK;

 

回退已完成。

 

SQL> SELECT OBJECT_ID,OBJECT_NAME FROM TEST_TEST;

 

未选定行

 

当我回滚前面的事务时,trigger所发生的修改也自动rollback

 

下面尝试在trigger中加入commit ,看看oracle如何处理?

 

SQL> CREATE TABLE TEST1 AS SELECT * FROM TEST_TEST WHERE 1=2;

 

表已创建。

 

SQL> CREATE TABLE TEST_TEST1 AS SELECT * FROM TEST_TEST WHERE 1=2;

 

表已创建。

 

SQL> CREATE OR REPLACE TRIGGER TEST1_TRIGGER

  2  AFTER INSERT ON TEST1

  3  FOR EACH ROW

  4  BEGIN

  5       INSERT INTO TEST_TEST1(OBJECT_ID,OBJECT_NAME)

  6              VALUES(:NEW.OBJECT_ID,:NEW.OBJECT_NAME);

  7       COMMIT;

  8  END;

  9  /

 

触发器已创建

 

SQL> SELECT COUNT(*) FROM TEST1;

 

  COUNT(*)                                                                     

----------                                                                      

         0                                                                     

 

SQL> SELECT COUNT(*) FROM TEST_TEST1;

 

  COUNT(*)                                                                     

----------                                                                      

         0                                                                     

 

SQL> INSERT INTO TEST1 (OBJECT_ID,OBJECT_NAME) VALUES(2,'NAME2');

INSERT INTO TEST1 (OBJECT_ID,OBJECT_NAME) VALUES(2,'NAME2')

            *

ERROR 位于第 1 :

ORA-04092: COMMIT 不能在触发器中

ORA-06512: "TAISHAN_JAP.TEST1_TRIGGER", LINE 4

ORA-04088: 触发器 'TAISHAN_JAP.TEST1_TRIGGER' 执行过程中出错

 

 

根据报错信息可知:oracle不支持在触发器中使用commit,而触发器对相关表的修改是否生效,取决于外部的事务。当回滚该事务时,trigger发生的修改自动rollback。这样从某种程度上保证了数据的一致性。

以上仅是本人观点,如果不对之处,敬请指出,非常感谢!我的每一步都取决于大家的关注!及时纠正错误观点,努力提高个人水平。

分享到:
评论

相关推荐

    Oracle Form 触发器的执行顺序

    Oracle Form 触发器的执行顺序 Oracle Form 是 Oracle E-Business Suite R12 中的一个...Oracle Form 触发器的执行顺序是一个非常重要的知识点,了解触发器的执行顺序可以帮助开发人员更好地理解和使用 Oracle Form。

    SQL*FORM3.0触发器设计技术.pdf

    * 数据验证:使用触发器可以实现数据的自动验证。 * 数据转换:使用触发器可以实现数据的自动转换。 * 错误处理:使用触发器可以实现错误的自动处理。 * 安全控制:使用触发器可以实现安全控制。 结论 本文介绍了...

    触发器SQL文件.rar

    1. 数据验证:当用户尝试插入或更新数据时,触发器可以检查新数据是否满足特定条件,如果不符合则阻止操作。 2. 业务规则实施:触发器可以用来强制执行复杂的业务逻辑,这些逻辑可能无法通过简单的约束或检查列来...

    触发器PPT学习教案.pptx

    【触发器】是数据库系统中的一个重要概念,它是一种特殊的存储过程,当特定的数据库操作(如INSERT、UPDATE或DELETE)发生时,会自动...理解并熟练掌握触发器的使用,可以帮助开发者更有效地管理和保护数据库中的数据。

    数据库实验6触发器实验报告.pdf

    如果触发器中的操作失败,可以使用`ROLLBACK TRANSACTION`回滚事务,保持数据一致性。 总的来说,这个实验报告详细介绍了如何在SQL Server环境下创建、执行、修改和删除存储过程,以及如何管理和使用触发器。这些...

    实验八存储过程与触发器的应用实验报告.pdf

    - 触发器中的逻辑控制:在触发器中可以使用IF语句和事务控制语句(如BEGIN TRANSACTION、ROLLBACK TRANSACTION等)来进行条件判断和事务管理。 知识点3:触发器的操作逻辑 在报告中,通过具体的触发器实例,详细...

    oracle触发器的设计.pdf

    在行级触发器的代码中,我们不能直接使用COMMIT或ROLLBACK,因为这会违反事务的控制逻辑。如果需要在触发器内部回滚操作,可以使用RAISE_APPLICATION_ERROR函数抛出自定义错误,例如禁止删除特定记录。 以下是一些...

    MySQL SQL高级特性-存储过程-触发器-事务

    MySQL中可以使用START TRANSACTION或BEGIN语句开始一个事务,之后通过COMMIT提交事务或使用ROLLBACK回滚事务。如果发生错误,MySQL通常会自动回滚事务。 在本文中,我们学习了MySQL存储过程的定义和优点,触发器的...

    oracle forms 触发器执行顺序

    - **WHEN-VALIDATE-RECORD**:验证新输入的记录是否与数据库中已有的记录重复。此验证仅检查数据库中的记录,而不是当前页面中的重复记录。 - **WHEN-NEW-RECORD-INSTANCE**:创建新 RECORD 实例。 - **WHEN-NEW-...

    mysql触发器简介、创建触发器及使用限制分析

    - 不能在隐式或显式提交或回滚的语句(如`COMMIT`、`ROLLBACK`、`START TRANSACTION`等)中使用触发器。 - 不能在`PREPARE`、`EXECUTE`等预处理语句中使用触发器。 - 动态SQL语句也不能在触发器内部执行。 综上所述...

    数据库事务处理和触发器实验.doc

    - 触发器可以执行一系列操作,包括更新、插入或删除其他表中的数据,执行复杂的业务逻辑,或者验证数据的完整性。 2. **触发器的创建、修改和删除**: - 创建触发器使用CREATE TRIGGER语句,指定触发时机、触发...

    SQL语句大全(程序设计、视图、索引、游标、事务、触发器、锁、存储过程、XML、权限管理……)

    6. **触发器**:触发器是一种自动执行的数据库操作,通常用于实现业务规则和数据验证。第五章“触发器.sql”可能详细介绍了INSERT、UPDATE和DELETE触发器的创建和使用。 7. **锁**:锁是并发控制机制,防止多个用户...

    事务与触发器课件.ppt

    事务是数据库管理中至关重要的概念,它确保了数据操作...在实际操作中,需谨慎使用触发器,以避免可能导致性能下降的过度复杂逻辑。同时,合理管理和控制事务可以帮助保护数据库免受错误操作的影响,维持数据的一致性。

    受限过程 内置子程序,触发器,变量 说明

    - **`create_queried_record`**: 当使用 `on_fetch` 触发器时,在块记录缓存中创建记录。缓存存储着未显示的记录。 - **`create_record`**: 在当前块中创建一条新记录。 #### 五、总结 受限过程及其内置子程序、...

    Sql存储过程、触发器、事务1

    在数据库管理中,存储过程、触发器和事务是三个非常重要的概念,它们共同确保了数据的稳定性和一致性。下面将详细阐述这些知识点。 **存储过程** 存储过程是SQL中预编译的一组SQL语句,可以理解为数据库中的函数,...

    Oracle Form觸發器、系統變量精解2

    根据提供的文件信息,本文将对Oracle Form触发器与系统变量进行深入解析,特别是关于触发器在Oracle Forms中的应用以及如何利用系统变量来增强程序的功能性和灵活性。 ### Oracle Form 触发器 #### 1. 触发器简介 ...

Global site tag (gtag.js) - Google Analytics