急问:如何通过触发器禁止用户的操作?

llm06 2004-09-27 11:30:17
我想在触发器里面做一个检查,如果要删除id='1'的数据就立刻禁止这次删除操作,该如何做。通过raise exception是否可以?
...全文
122 9 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
drabit 2004-09-28
  • 打赏
  • 举报
回复
oracle都升到10g了,还抱着8i的东西不放?

“PRAGMA AUTONOMOUS_TRANSACTION”在9i及以上版本是可以用的
bzszp 2004-09-28
  • 打赏
  • 举报
回复
oracle版本:8.1.6

09:02:19 SQL> create or replace trigger trg_tb
09:02:23 2 before insert on tb
09:02:34 3 for each row
09:02:37 4 begin
09:02:42 5 null;
09:02:44 6 commit;
09:02:46 7 end trg_tb;
09:02:50 8 /

触发器已创建

已用时间: 00: 00: 00.50
09:02:50 SQL> insert into tb(col1) values('a');
insert into tb(col1) values('a')
*
ERROR 位于第 1 行:
ORA-04092: COMMIT 不能在触发器中
ORA-06512: 在"TEMP.TRG_TB", line 3
ORA-04088: 触发器 'TEMP.TRG_TB' 执行过程中出错


已用时间: 00: 00: 00.79
09:03:08 SQL>
llm06 2004-09-27
  • 打赏
  • 举报
回复
我就想通过触发器来实现。
触发器里面可以执行commit和rollback吗?我记不清楚了,好像有个什么东东里面不能执行commit的,是什么呀?
bzszp 2004-09-27
  • 打赏
  • 举报
回复
可以,不过你在执行insert 的时候
加上exception的相应处理(rollback)
drabit 2004-09-27
  • 打赏
  • 举报
回复
触发器里面可以执行commit/rollback!

for example:

CREATE OR REPLACE TRIGGER TR_RME_SLOT AFTER

INSERT ON RME_SLOT

FOR EACH ROW

DECLARE

PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN

IF (:NEW.POSITION >= 0 AND :NEW.POSITION <10) THEN

UPDATE RME_SLOT SET SLOT_NAME = '0'||TO_CHAR(:NEW.POSITION) WHERE SLOT_ID=:NEW.SLOT_ID;

ELSE

UPDATE RME_SLOT SET SLOT_NAME = TO_CHAR(:NEW.POSITION) WHERE SLOT_ID=:NEW.SLOT_ID;

END IF;

COMMIT;

END;
bzszp 2004-09-27
  • 打赏
  • 举报
回复
第一个回复居然漏掉了最关键的"不"字。
:)
bzszp 2004-09-27
  • 打赏
  • 举报
回复
触发器里面不可以执行commit/rollback
以及DDL操作
bzszp 2004-09-27
  • 打赏
  • 举报
回复
触发器里面可以执行commit/rollback
以及DDL操作
drabit 2004-09-27
  • 打赏
  • 举报
回复
触发器里面可以执行commit/rollback
相关推荐
发帖
Oracle 高级技术

3472

社区成员

Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
帖子事件
创建了帖子
2004-09-27 11:30
社区公告
暂无公告