转自: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 E-Business Suite R12 中的一个...Oracle Form 触发器的执行顺序是一个非常重要的知识点,了解触发器的执行顺序可以帮助开发人员更好地理解和使用 Oracle Form。
* 数据验证:使用触发器可以实现数据的自动验证。 * 数据转换:使用触发器可以实现数据的自动转换。 * 错误处理:使用触发器可以实现错误的自动处理。 * 安全控制:使用触发器可以实现安全控制。 结论 本文介绍了...
1. 数据验证:当用户尝试插入或更新数据时,触发器可以检查新数据是否满足特定条件,如果不符合则阻止操作。 2. 业务规则实施:触发器可以用来强制执行复杂的业务逻辑,这些逻辑可能无法通过简单的约束或检查列来...
【触发器】是数据库系统中的一个重要概念,它是一种特殊的存储过程,当特定的数据库操作(如INSERT、UPDATE或DELETE)发生时,会自动...理解并熟练掌握触发器的使用,可以帮助开发者更有效地管理和保护数据库中的数据。
如果触发器中的操作失败,可以使用`ROLLBACK TRANSACTION`回滚事务,保持数据一致性。 总的来说,这个实验报告详细介绍了如何在SQL Server环境下创建、执行、修改和删除存储过程,以及如何管理和使用触发器。这些...
- 触发器中的逻辑控制:在触发器中可以使用IF语句和事务控制语句(如BEGIN TRANSACTION、ROLLBACK TRANSACTION等)来进行条件判断和事务管理。 知识点3:触发器的操作逻辑 在报告中,通过具体的触发器实例,详细...
在行级触发器的代码中,我们不能直接使用COMMIT或ROLLBACK,因为这会违反事务的控制逻辑。如果需要在触发器内部回滚操作,可以使用RAISE_APPLICATION_ERROR函数抛出自定义错误,例如禁止删除特定记录。 以下是一些...
MySQL中可以使用START TRANSACTION或BEGIN语句开始一个事务,之后通过COMMIT提交事务或使用ROLLBACK回滚事务。如果发生错误,MySQL通常会自动回滚事务。 在本文中,我们学习了MySQL存储过程的定义和优点,触发器的...
- 不能在隐式或显式提交或回滚的语句(如`COMMIT`、`ROLLBACK`、`START TRANSACTION`等)中使用触发器。 - 不能在`PREPARE`、`EXECUTE`等预处理语句中使用触发器。 - 动态SQL语句也不能在触发器内部执行。 综上所述...
- **WHEN-VALIDATE-RECORD**:验证新输入的记录是否与数据库中已有的记录重复。此验证仅检查数据库中的记录,而不是当前页面中的重复记录。 - **WHEN-NEW-RECORD-INSTANCE**:创建新 RECORD 实例。 - **WHEN-NEW-...
- 触发器可以执行一系列操作,包括更新、插入或删除其他表中的数据,执行复杂的业务逻辑,或者验证数据的完整性。 2. **触发器的创建、修改和删除**: - 创建触发器使用CREATE TRIGGER语句,指定触发时机、触发...
6. **触发器**:触发器是一种自动执行的数据库操作,通常用于实现业务规则和数据验证。第五章“触发器.sql”可能详细介绍了INSERT、UPDATE和DELETE触发器的创建和使用。 7. **锁**:锁是并发控制机制,防止多个用户...
事务是数据库管理中至关重要的概念,它确保了数据操作...在实际操作中,需谨慎使用触发器,以避免可能导致性能下降的过度复杂逻辑。同时,合理管理和控制事务可以帮助保护数据库免受错误操作的影响,维持数据的一致性。
- **`create_queried_record`**: 当使用 `on_fetch` 触发器时,在块记录缓存中创建记录。缓存存储着未显示的记录。 - **`create_record`**: 在当前块中创建一条新记录。 #### 五、总结 受限过程及其内置子程序、...
在数据库管理中,存储过程、触发器和事务是三个非常重要的概念,它们共同确保了数据的稳定性和一致性。下面将详细阐述这些知识点。 **存储过程** 存储过程是SQL中预编译的一组SQL语句,可以理解为数据库中的函数,...
根据提供的文件信息,本文将对Oracle Form触发器与系统变量进行深入解析,特别是关于触发器在Oracle Forms中的应用以及如何利用系统变量来增强程序的功能性和灵活性。 ### Oracle Form 触发器 #### 1. 触发器简介 ...