▲触发器能阻止INSERT吗?

xxiao07 2006-01-16 07:52:43
因为我的数据入库程序是通用的,每天要加入很多的数据表。

现在对某个表A,当其属性amount=0时,我想阻止其插入,希望在触发器中实现,在INSERT前是否可以阻止?(INSERT后当然可以DELETE)

希望给出代码,谢谢!
...全文
633 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanoul 2006-01-25
  • 打赏
  • 举报
回复
嘿嘿,明白了,学习ing
denniswwh 2006-01-20
  • 打赏
  • 举报
回复
晕,原来oracle的instead of触发器只能用在view上面,sqlserver的可以用在table上
denniswwh 2006-01-20
  • 打赏
  • 举报
回复
不需要用视图吧,使用instead of触发器就可以了
xxiao07 2006-01-19
  • 打赏
  • 举报
回复
为什么要通过视图操作?
sanoul 2006-01-19
  • 打赏
  • 举报
回复
通过视图检查数据,然后用instead顶替原语句,这是我的理解
xxiao07 2006-01-19
  • 打赏
  • 举报
回复
instead of我知道, view+instead什么意思?
bobfang 2006-01-19
  • 打赏
  • 举报
回复
SQL> create table TABLE_A_base(
2 id number,
3 t date,
4 amount number
5 );

Table created.

SQL>
SQL> CREATE VIEW TABLE_A AS
2 SELECT * FROM TABLE_A_base;

View created.

SQL> CREATE OR REPLACE TRIGGER TABLE_A_insert
2 INSTEAD OF INSERT ON TABLE_A
3 BEGIN
4 if :NEW.amount>0 then
5 insert into TABLE_A_base(id, t, amount)
6 values (:NEW.id, :NEW.t, :NEW.amount);
7 end if;
8 END;
9 /

Trigger created.

SQL> insert into TABLE_A values(1,sysdate,1);

1 row created.

SQL> insert into TABLE_A values(2,sysdate,0);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from table_a;

ID T AMOUNT
---------- ------------------- ----------
1 2006-01-19 15:59:46 1

SQL>
超叔csdn 2006-01-19
  • 打赏
  • 举报
回复
instead of
xxiao07 2006-01-18
  • 打赏
  • 举报
回复
请介绍view+instead触发器,谢谢!
cenlmmx 2006-01-18
  • 打赏
  • 举报
回复
都不知道lz要什么
bobfang 2006-01-18
  • 打赏
  • 举报
回复
既然不希望insert时出错,那么就不能采用在触发器中抛出异常的方法。
我想到的只有通过view+instead触发器来实现。
bobfang 2006-01-17
  • 打赏
  • 举报
回复
阻止插入,我的理解是数据库发现不合法就什么也不做,而不是抛出异常,我觉得可以通过view+instead触发器来实现。
如果是要抛出异常,对于楼主这个例子,完全可以用check来实现,不需要触发器。
xxiao07 2006-01-17
  • 打赏
  • 举报
回复
check限制后,insert会出错的,我不希望出错.
cenlmmx 2006-01-17
  • 打赏
  • 举报
回复
当然解决问题的办法有多种,lz希望在触发器中实现,那就在触发器中实现了.
lilylamb 2006-01-17
  • 打赏
  • 举报
回复
cenlmmx(学海无涯苦作舟) 已经回答了
赵大米 2006-01-17
  • 打赏
  • 举报
回复
是否抛出异常需要看阻止insert的规则,总不能所有的数据都不让Insert吧!
cenlmmx 2006-01-16
  • 打赏
  • 举报
回复
SQL> desc mike_test0115;
Name Type Nullable Default Comments
---- ------------ -------- ------- --------
ID NUMBER
NAME VARCHAR2(40) Y

create or replace trigger temp
before insert on mike_test0115
for each row
declare

begin

IF :new.ID = 0 then
DBMS_OUTPUT.PUT_LINE('Insert');
RAISE_APPLICATION_ERROR(-20055,'INVALID CODE');
END IF;
end temp;
---------------------------------------------------------------------
已连接到 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
已连接为 mike


SQL> select * from mike_test0115;

ID NAME
---------- ----------------------------------------
1 Mike
2 Jimmy

SQL> insert into mike_test0115 values(0,'test');

insert into mike_test0115 values(0,'test')

ORA-20055: INVALID CODE
ORA-06512: 在 "MIKE.TEMP", line 7
ORA-04088: 触发器 'MIKE.TEMP' 执行过程中出错

SQL> select * from mike_test0115;

ID NAME
---------- ----------------------------------------
1 Mike
2 Jimmy

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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