相信写过ORACLE行级触发器的IT同仁们大多遇到过ORA-04091问题,即在某表的行级触发器中不能读取当前表的问题,如:
create table test(id raw(16), name varchar2(100), primary key (id));
create table test_count(test_count int);
insert into test_count values(0);
commit;
create or replace trigger t_test
AFTER INSERT OR DELETE ON test
FOR EACH ROW
BEGIN
UPDATE test_count
SET test_count = (SELECT count(*) from test);
END t_test;
/
当您在插入test表时,系统会抱怨(当然计数这样的简单业务是不需要使用触发器来做的,仅用于举例):
第 1 行出现错误:
RA-04091: 表 TEST.TEST 发生了变化, 触发器/函数不能读它
RA-06512: 在 "TEST.T_TEST", line 2
RA-04088: 触发器 'TEST.T_TEST' 执行过程中出错
前几天看到触发器的INSTEAD OF子句,顺便用它搞定:
drop trigger t_test;
create view v_test as select id, name from test;
create or replace trigger t_v_test
INSTEAD OF INSERT OR DELETE OR UPDATE ON v_test
FOR EACH ROW
DECLARE
BEGIN
IF inserting THEN
INSERT INTO test(id, name) values(:new.id, :new.name);
END IF;
IF deleting THEN
DELETE FROM test WHERE id = :old.id;
END IF;
IF updating THEN
UPDATE test
SET id = :new.id, name = :new.name
WHERE id = :old.id;
ELSE
UPDATE test_count
SET test_count = (SELECT count(*) from test);
END IF;
END t_v_test;
/
原来对test表的插入改为对v_test插入,一切OK,搞定。
分享到:
相关推荐
2 替代触发器:由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。 3系统触发器:ORACLE 8i 提供了第三种类型的触发器叫...
- 并发问题:死锁、幻读和不可重复读的解决策略。 5. **视图与索引** - 视图创建:通过CREATE VIEW语句创建虚拟表,简化复杂的查询操作。 - 索引类型:B树索引、位图索引、函数索引和全局唯一索引的使用场景和...
在事务处理方面,9i SQL提供了更强大的并发控制和事务管理,如行级锁定、读已提交(Read Committed)和串行化(Serializable)隔离级别,确保数据一致性并降低死锁的可能性。 安全性方面,9i SQL增加了精细的权限...
9. **ORA-01555错误处理**:此错误通常发生在回滚段空间不足时,解决方法是增加回滚段的大小或者优化SQL语句,减少不必要的数据锁定。 10. **ORACLE_HOME和ORACLE_BASE的区别**:`ORACLE_BASE`是Oracle产品的根目录...
8. **触发器**:触发器的定义、分类(行级、语句级)、何时使用,以及在事务处理中的应用。 9. **存储过程与函数**:编写存储过程和函数,理解参数的传递方式,以及如何调用和使用它们。 10. **备份与恢复**:RMAN...
通过查询相关的视图如v$transaction、V$lock和v$session,可以深入了解当前数据库中锁的状态和行为。 综上所述,Oracle的锁机制是数据库并发控制的核心,通过合理的配置和使用,可以有效避免数据冲突,保证数据的...
- 查询当前用户: ```sql select user from dual; ``` - 查看表结构: ```sql desc table_name; ``` **9. ORACLE10GRAC信息查看:** - 查看集群状态: ```sql select * from v$cluster_status; ``` - 查看...
14. **故障排查**:学习识别和解决常见的Oracle错误,如ORA-错误代码,以及如何使用日志文件和跟踪文件进行问题诊断。 通过这个全面的Oracle内部培训教程,您将不仅了解Oracle数据库的基础知识,还能深入到高级特性...
- **视图**:基于一个或多个表(或视图)的虚拟表,可以简化复杂查询。 - **同义词**:为表、视图或其他对象创建的别名,提高代码的可读性和可维护性。 - **索引**:用于提高数据检索速度的数据结构,可以是唯一索引...
手册会解释行级锁定、多版本并发控制(MVCC)以及死锁检测和解决。 8. **网络配置**:Oracle Net Services允许数据库跨越网络进行通信。配置TNS(Transparent Network Substrate)和SQL*Net是连接到远程Oracle实例...
它包括表、视图、索引、存储过程、触发器等数据库对象。 2. **安装与配置**:Oracle数据库的安装包括软件安装和实例创建,需要设置数据库标识符(SID)、全局数据库名、初始化参数文件(init.ora)以及监听配置。...
4. **数据对象**:学习如何创建和管理数据库中的表、视图、索引、触发器、存储过程和函数。理解不同类型的约束(如主键、外键、唯一性约束)对数据完整性的保障作用。 5. **数据库管理**:了解如何备份和恢复数据库...
6. DDL(Data Definition Language):这部分涵盖创建、修改和删除数据库对象,如表、视图、索引、存储过程和函数等。 7. DML(Data Manipulation Language):除了上述的INSERT、UPDATE和DELETE,还包括事务控制...
这些对象包括但不限于目录、外部表、临时表、序列、视图、同义词和索引。通过表分区技术,我们能提高大型数据库的性能和管理效率。 在多用户环境下,保证数据一致性的并发与锁机制是不可或缺的。Oracle提供了行级锁...
10. **故障诊断与问题解决**:监控工具的使用(如v$视图),以及如何通过告警日志和跟踪文件来定位和解决问题。 11. **数据库升级与迁移**:从旧版本到9i的升级过程,数据迁移的方法,以及可能遇到的问题和解决方案...
5. **安全性**:设置用户权限,理解角色和权限的概念,学习如何创建和管理用户,以及如何使用DBMS_RLS进行行级安全策略的设定。 6. **数据库架构与设计**:理解Oracle的体系结构,如PL/SQL编程,触发器,存储过程,...
在Oracle 9i中,表、视图、索引、存储过程和触发器等都是基本元素。 二、Oracle 9i安装与配置 Oracle 9i的安装涉及到操作系统兼容性、硬件需求、网络设置等多个方面。你需要熟悉安装过程,包括选择适当的安装类型...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其强大的功能和稳定性使得它在企业级应用中占据了重要地位。本“Oracle操作手册”旨在为数据库管理员(DBA)和开发人员提供一套全面的操作指南,帮助他们更...
在并发环境下,了解锁机制和并发控制,如行级锁定、读已提交(Read Committed)和串行化(Serializable)隔离级别,对于避免死锁和确保数据一致性至关重要。 总之,PLSQL Development涵盖了从基础的Oracle连接到...