问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

oracle 数据库的触发器

发布网友 发布时间:2022-05-01 14:14

我来回答

4个回答

懂视网 时间:2022-05-01 18:35

CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;

BEFORE: 在执行触发事件前执行触发器内容;

AFTER:在执行触发事件后执行触发器内容;

(貌似还存在第3中:instead of,主要用于视图。待学习....)

FOR EACH ROW: 行级触发器,对应的还有语句级触发器。

  行级触发器,只要数据行符合触发条件,就执行1次触发器;

  语句级触发器,整个语句操作作为触发事件,符合触发条件,则只执行1次触发器;(这个理解还不深刻)

NEW/OLD:只存在与FOR EACH ROW中。且update:NEW、OLD,insert:NEW,delete:OLD;

二、基础demo

说明:当更新子表CHILD的时候,把其对应父表的姓名拼接”123”。

create or replace trigger TEST_TRIGGER
before update ON "CHILD" for each row
declare
 old_age number;
 new_age number;
 v_id number;
 p_id number;
--PRAGMA AUTONOMOUS_TRANSACTION; -- 自治事务,独立于触发sql的事务
begin
 old_age := :old.child_age;
 new_age := :new.child_age;
 v_id := :new.child_id;
 p_id := :new.parent_id;
 dbms_output.put_line(‘After: old=‘||old_age||‘,new=‘||new_age);
 if 3>2 then
 -- UPDATE CHILD set child_name = child_name||‘123‘ where CHILD_ID = 5;
 UPDATE parent set parent_name = parent_name||‘123‘ where PARENT_ID = p_id;
 --:new.child_name := :old.child_name || ‘123‘;
 dbms_output.put_line(‘if scope!‘);
end if;end TEST_TRIGGER;

奇葩问题: 如果trigger中存在if语法,

  注意demo最后 end if;end TEST_TRIGGER;  如果不这么写(分成2行),此trigger在navicat中编译是通不过的。但在pl/sql中是正确的。

三、trigger的事务、自治事务

  如果trigger不用自治事务,那么触发器的事务和触发触发器事件的事务是同一个。

  我在测试的时候遇到的问题:1、目的:在更新child_age后,通过触发器更新其名字child_name。2、因为我要的确实更新后,才更新chile_name,所以我用的BEFORE。

  如果不用自治事务,那么表示触发器和触发事件是处于同一事务(即便是after,触发事件的事务也是没提交的。),oracle是不允许对同一行记录再次进行DML的。

  但是如果使用自治事务,这明显有个问题是,如果触发事件的语句被回滚,那么触发器是确定被触发、且被提交的。所以,此处不能用自治事务(我还真没想到什么场景要用到自治事务)

  如何实现?

  这时就要用到BEFORE/AFTER的区别了,通过前面知道了默认触发器和触发事件是在同一事务。那么可以通过BEFORE达到目的,直接在BEFORE中修改:new对应的字段值。如demo中的:

    :new.child_name := :old.child_name || ‘123‘; 这样,其实就会更新行所对应的字段值。

四、备注

  在网上查了下对触发器的看法,发现大部分的观念都不推荐触发器。观点总结:1、触发器性能不好;2、触发器太隐蔽,容易被忽略;3、移植性低,难以维护。

  对于性能,不清楚程度到底怎么样。

  移植性,我接触的项目都不考虑。

  隐蔽性,这很关键,如果项目管理不好。可能都不知道有这个触发器的存在。

  综上,我只能了解到反正大家都不怎么推荐…

  这说下为什么我要用的情况:有张表table_a,存在一个状态位a.status=[1,2,3,4,5,6…];当状态位为[4,5,6]时要给客户发送短信提醒。

  存在的做法:1、在所有代码中,更改status的地方判断,直接调用发送短信(或者把短信放到短信池,定时发送。这有很大却别)。  2、定时器,检测状态位,然后发送。 3、触发器。

  方式1: 我觉得很蠢,你要找到现在有的所有地方。如果后面新增一个地方修改status,别人不一定知道要发短信。(而且还不止这么简单,万一这update被回滚,你直接调短信发送不雪崩?如果是放到短信池还好,都回滚了。)

  方式2: 有一个问题是,你要知道这行数据是不是状态改变过,且是没发送过短信的(麻烦,我没细想这)

  方式3: 触发器,检测行的status,然后符合的insert一条短信到短信池,然后在定时检测短信池发送短信。

附录

 [oracle官方文档 12c]CREATE TRIGGER Statement

  ORACLE PL/SQL编程之八:   把触发器说透

【database】oracle触发器基础

标签:内容   .com   hive   触发事件   姓名   color   tput   proc   测试   

热心网友 时间:2022-05-01 15:43

create or replace trigger add_b_to_c
after insert on A
for each row
begin
if inserting then
insert into C(字段1,字段2,......) select 字段1,字段2,...... from B where <你的关联条件>
end if;
end;
/
这个就是对的呀

热心网友 时间:2022-05-01 17:01

create or replace trigger add_b_to_c
after insert on A
for each row
begin
if inserting then
insert into C(字段1,字段2,......) select 字段1,字段2,...... from B where <你的关联条件>
end if;
end;
/

热心网友 时间:2022-05-01 18:36

这样就可以了。
create or replace trigger tri_test
after insert on table_a
for each row
DECLARE
-- local variables here
BEGIN

INSERT INTO Table_c
SELECT Table_a.Col_1,
Table_b.Col_1
FROM Table_a,
Table_b
WHERE Table_a.Col_2 = Table_b.Col_2;

END Tri_Test;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
南师足贴的功效和用法是什么 五指运湿膏能减肥吗 清颜六白膏真的管用吗 一个手机号建了两个微信号第一个微信号密码忘了怎么找回 ug最好用的版本是什么 带“沙鸥”的诗句大全(87句) 归计狎沙鸥的意思是什么 指期乘禁马,无暇狎沙鸥。 “无机终日狎沙鸥”的出处是哪里 “无暇狎沙鸥”的出处是哪里 怎样才能永久解除安全手机管家? 小度可以配置小米风扇嘛 小米风扇定时每档多长时间 《大鱼海棠》好看在哪里? 十二年前的大鱼海棠可以在哪里看见 中国动画片《大鱼海棠》哪里可以下载到完整的啊?好想看,哪位大侠有啊 大鱼海棠哪里看 qq空间封面大鱼海棠在哪里 天天p图大鱼海棠怎么用的? 天天p图大鱼海棠怎么用 在代购那里买了雅诗兰黛小棕瓶精华,但是盒子上面写的旅行限定装和免税限定,而且盖子是银色是正品吗 刚从三亚免税店买了雅诗兰黛夜间保养套装,顺序先用那个啊? 海免买的雅诗兰黛小棕瓶精华没有说明书 用了雅诗兰黛小棕瓶眼霜和精华,眼睛痒和肿是咋回事,在三亚免税店买的,应该不会是假H,一停用两三天 海南免税店的小棕瓶是什么版本 电脑系统XP3怎么重新安装,具体步骤!谢谢 xp3系统怎么做 电脑装系统教程xp3u盘购买 刚买的iPhone6下载东西特别慢怎么办 WIN 7系统下安装XP3的问题 两个EXCEL表中内容经筛选后如何合并? 江西有靠谱网店代运营公司吗? 怎么解除手机管家绑定 iphone 6新机电池电压是几伏? 如何根据筛选条件将excel表格中的两列内容合并? 江西省鼎鼎电子商务有限公司怎么样? Excel如何筛选或者合并数据 苹果的声音怎么能变大 如何解除手机腾讯管家锁 江西聚优网络科技有限公司怎么样? 6S16000 15C的电池毫安的电池满电电压是多少?其充电电压不能超过多少其最低电压不能低于多少 江西捷虎网络科技有限公司怎么样? 苹果11均衡器的最佳效果 江西恩次方商业运营管理有限公司怎么样? 一块6s电池22000mAh,满电压多少V?5C充电电流多少A? 江西先导网络科技有限公司怎么样? 苹果播放器均衡器那个效果最好 苹果均衡器打游戏调哪个最好 江西果富特商业运营管理有限公司怎么样? 江西博富商业运营管理有限公司怎么样?