有时候我们可能有这种需求,在table上建立一个触发器,然后当在table中更新A和B字段时,c字段变为A+B,这就形成了在触发器中修改基表数据的情况.引用地址:http://www.cnblogs.com/xiaobaihome/archive/2012/03/14/2396538.html
创建一个测试表:
-- Create tablecreate table TEST( A NUMBER, B NUMBER, C NUMBER, ID NUMBER not null) alter table TEST add constraint TEST_PRIMARY_ID primary key (ID)
看一看下面这个触发器的写法:
create or replace trigger test_trigger after insert or update on test for each rowdeclare -- local variables here begin update test set c = :new.a + :new.b where id = :new.id ; end test_trigger;
我们的目的是在插入或者更新的时候,让c字段的值等于字段a+字段b的值,我们执行以下sql语句:
insert into test(id, a, b) values(1, 10, 20);
我们期望会看到c的值自动变成a+b=30,但是我们却发现如下错误:
从错误提示来看,是说表已经发生了改变,触发器不能读它,因为我们出发器的触发时机设置的是after,也就是在一条记录插入完成之后再进行更新操作,但是这时候表已经发生改变,触发器不能读这个表了.那我们将触发器的触发时间设置before是不是就能达到目的呢,将触发器修改一下:
create or replace trigger test_trigger before insert or update on test for each row declare -- local variables here begin update test set c = :new.a + :new.b where id = :new.id; end test_trigger;
编译一下触发器,再次执行上面的插入sql语句,这时候我们发现记录被成功插入了,没有报错,这是不是以为着我们就成功了呢,别急,我们先查询一下test表:
可以看到,记录虽然成功插入了,但是并没有达到我们预期的目的,也就是c的值变为30.这是为什么呢?是我们的触发器没有执行吗?其实这里触发器确实执行了,但是因为触发器执行的时机是before,也就是在插入记录以前先执行了更新操作,但是这时候表里面实际上还没有id=:new.id(这时等于1)的记录,所以这个更新操作影响的行数为零,接着才执行了插入操作.
那如何才能达到目的呢?其实在触发器中,我们可以直接访问到当前这条记录,修改一下触发器:
create or replace trigger test_trigger before insert or update on test for each row declare -- local variables here begin :new.c := :new.a + :new.b; end test_trigger;
可以使用:new来访问触发器执行时,当前行的值,这时候再执行性一下插入操作:
可以看到,记录成功插入,并且c字段也变成了我们所预期的值.
这样我们就达到了在触发器中更改基表的目的,不过这个方法也有局限性:
1.触发器的执行时机只能设置before,如果设置after,编译将不能通过.
2.只能对当前被插入或者更新的记录进行操作,无法对其他的记录进行操作.
相关推荐
1、行级触发器不支持 update 、select 、delete 对自身表的操作。 2、表级触发器 不支持 :new 和 :old对象 所以想要触发器对自身表数据做修该,则用行级触发器得到 :new 和 :old对象中的相关数据,然后将这样的数据...
触发器可以基于数据库的值使用户具有操作数据库的某种权利,基于时间限制用户的操作,基于数据库中的数据限制用户的操作,审计用户操作数据库的语句,跟踪用户对数据库的操作,实现复杂的数据完整性规则,提供可变的...
Oracle 触发器的概念和类型 Oracle 触发器是一种特殊的存储过程,它在插入、删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下几种作用: 1. ...
由于直接对多表视图进行插入、更新或删除操作在Oracle中受限,替代触发器允许通过操作视图来间接更新底层基表,提供了一种灵活的数据维护机制。 3. **系统触发器**:与系统级事件关联,如数据库的启动和关闭。系统...
Oracle数据库中的触发器是数据库对象的一种,用于在特定的数据操作(如INSERT、UPDATE、DELETE)发生时自动执行预定义的PL/SQL代码。触发器能够帮助数据库管理员和开发者实现复杂的数据完整性约束,以及在数据库中...
触发器中不能对对应的基表执行查询操作;同时注意语句重启动问题,即某一数据使用了触发器,用户 1 和用户 2 同时修改该数据,用户 2 被阻塞,用户 1 提交数据后,用户 2 才能对其操作, 这时用户 2 的触发器执行了...
通过定义替代触发器,可以实现在视图层面上的操作,并且这些操作会被转化为对基表的操作。 ##### 2.3 系统触发器 系统触发器是在Oracle数据库启动、关闭或用户会话开始、结束等系统事件发生时触发的。这类触发器...
下面实验创建ON COMMIT 的FAST刷新模式,在mysql中用触发器实现insert , update , delete 刷新操作 1、基础表创建,Orders 表为基表,Order_mv为物化视图表 代码如下: mysql> create table Orders( -> order_id int...
此外,如果基表上有触发器,则这些触发器也会被触发。 #### 视图存储 与表不同的是,视图本身并不需要分配存储空间,也不包含实际的数据。视图仅定义了一个查询,该查询的结果会在视图被引用时动态生成。这意味着...
2. **SQL基础**:Oracle主要通过结构化查询语言(SQL)进行数据操作。SQL包括数据查询、数据插入、数据更新和数据删除等命令,以及创建表、视图、索引等数据库对象的语句。 3. **数据库实例与数据库**:在Oracle中...
Oracle SQL的深入学习涵盖了更多复杂概念,如视图、索引、存储过程、触发器、游标、子查询、分区等。这些概念和特性共同构建了Oracle数据库的强大功能,使用户能够高效、安全地处理大量数据。理解并掌握Oracle SQL是...
14. 触发器:触发器是一种自动执行的存储过程,当特定的数据库操作(如INSERT、UPDATE或DELETE)发生时,触发器会自动运行。 15. 统计函数:SQL中的MAX()函数用于求取一组数据的最大值。 选择题涉及的知识点: 1....
Oracle Form 6i 是一款强大的数据库前端开发工具,它可以帮助开发者快速构建基于表单的应用程序,以实现对数据库的操作,如查询、插入、更新和删除数据等功能。本教程主要针对Oracle Form 6i 的基本概念、组件结构、...
总的来说,“Oracle SQL必备参考”涵盖了从基础到高级的Oracle SQL知识,包括查询、数据操作、索引、视图、存储过程、函数、事务、触发器以及各种性能优化策略。无论你是初学者还是经验丰富的数据库专业人士,这份...
它通常用于视图,当试图在视图上执行DML操作时,INSTEAD-OF触发器可以控制实际在基表上的操作。 3. **系统触发器**:这些触发器在特定的系统事件发生时触发,如数据库启动、用户登录或表空间更改。它们不直接与DML...
在Oracle数据库中,基于多表联合的可更新视图的实现需要符合一定的规则和限制,例如视图的定义必须遵守一定的语法规则,视图中的数据必须来自于基表,视图的更新必须通过触发器来实现等。同时,基于多表联合的可更新...
- PL/SQL:Oracle的面向过程的编程语言,用于编写存储过程、函数、触发器等。 - 视图:虚拟表,基于一个或多个基表创建,提供不同视角的数据访问。 - 索引:提高查询速度,`CREATE INDEX`用于创建索引,`DROP ...
- **审计功能**:Oracle还支持详细的审计功能,可以追踪用户的活动和操作。 #### 21. 数据完整性 - **完整性约束**:Oracle支持多种完整性约束,如主键约束、外键约束等。 - **触发器**:触发器是一种特殊类型的...