oracle:delete触发器怎么更新当前表

major57 2011-08-12 02:27:25
一个delete触发器,怎么实现删除这条数据时变成更新这条数据的状态列,效果是这条数据没被删除 只是状态列被更新了
...全文
181 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
BenChiM888 2011-08-12
  • 打赏
  • 举报
回复

--注意操作只能操作v_test 不能直接操作test表

[TEST@myorcl] SQL>CREATE TABLE TEST(ID NUMBER PRIMARY KEY,FLAG VARCHAR2(1));

表已创建。

[TEST@myorcl] SQL>INSERT INTO TEST VALUES(1,'0');

已创建 1 行。

[TEST@myorcl] SQL>INSERT INTO TEST VALUES(2,'0');

已创建 1 行。

[TEST@myorcl] SQL>INSERT INTO TEST VALUES(3,'0');

已创建 1 行。

[TEST@myorcl] SQL>INSERT INTO TEST VALUES(4,'0');

已创建 1 行。

[TEST@myorcl] SQL>INSERT INTO TEST VALUES(5,'0');

已创建 1 行。

[TEST@myorcl] SQL>INSERT INTO TEST VALUES(6,'0');

已创建 1 行。

[TEST@myorcl] SQL>
[TEST@myorcl] SQL>CREATE OR REPLACE VIEW V_TEST AS
2 SELECT * FROM TEST;

视图已创建。

[TEST@myorcl] SQL>CREATE OR REPLACE TRIGGER V_TRIGGER
2 INSTEAD OF DELETE ON V_TEST
3 FOR EACH ROW
4 BEGIN
5 UPDATE TEST
6 SET FLAG = '1'
7 WHERE ID = :OLD.ID;
8 END;
9 /

触发器已创建

[TEST@myorcl] SQL>SELECT * FROM TEST;

ID F
---------- -
1 0
2 0
3 0
4 0
5 0
6 0

已选择6行。

[TEST@myorcl] SQL>SELECT * FROM V_TEST;

ID F
---------- -
1 0
2 0
3 0
4 0
5 0
6 0

已选择6行。

[TEST@myorcl] SQL>DELETE FROM V_TEST WHERE ID = 1;

已删除 1 行。

[TEST@myorcl] SQL>SELECT * FROM V_TEST;

ID F
---------- -
1 1
2 0
3 0
4 0
5 0
6 0

已选择6行。

[TEST@myorcl] SQL>SELECT * FROM TEST;

ID F
---------- -
1 1
2 0
3 0
4 0
5 0
6 0

已选择6行。

[TEST@myorcl] SQL>
major57 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 benchim888 的回复:]
1、普通触发器效果是改变需要替换的值,但是sql还是要执行的,因此普通触发器是不能实现你的效果的。
2、只能用替代触发器 instead of,但是替代触发器是建立在view上的
因此你需要在你的表上建立一个视图,然后在视图上建一个instead of 触发器,删除操作视图触发instead of 触发器达到你想要的目的。
[/Quote]

又是你...阁下数据库挺厉害的嘛...能给个例子么?
BenChiM888 2011-08-12
  • 打赏
  • 举报
回复
1、普通触发器效果是改变需要替换的值,但是sql还是要执行的,因此普通触发器是不能实现你的效果的。
2、只能用替代触发器 instead of,但是替代触发器是建立在view上的
因此你需要在你的表上建立一个视图,然后在视图上建一个instead of 触发器,删除操作视图触发instead of 触发器达到你想要的目的。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧