如何在oracle中创建一个触发器,它将根据条件限制在表上插入和更新查询

Ash*_*mc4 2 sql oracle sqlplus

我有账户表 -

create table account
(
acct_id int,
cust_id int,
cust_name varchar(20)  
)

insert into account values(1,20,'Mark');
insert into account values(2,23,'Tom');
insert into account values(3,24,'Jim');
Run Code Online (Sandbox Code Playgroud)

我想创建一个触发器,它将确保不能在帐户表中插入或更新记录,其中acct_id为2,cust_id为23.

我的代码是 -

create trigger tri_account
before insert or update
on account
for each row
begin
    IF (:new.acct_id == 2 and :new.cust_id == 23) THEN 
        DBMS_OUTPUT.PUT_LINE('No insertion with id 2 and 23.');
rollback;
    END IF; 
end;
Run Code Online (Sandbox Code Playgroud)

所以这个触发器是创建的,但是有编译错误.现在,当我插入任何acct_id为2且cust_id为23的记录时,它会执行allow.但是我收到错误说 ORA-04098:触发'OPS $ 0924769.TRI_ACCOUNT'无效且重新验证失败

我不明白这一点.我也希望显示一条消息,说明不能插入.请帮忙...

Jus*_*ave 19

  1. Oracle中的等式运算符=不是==.
  2. 您无法在触发器中提交或回滚.您可以抛出一个异常,导致触发语句失败并回滚(尽管现有的事务不一定会被回滚).
  3. 创建它时,似乎没有成功编译此触发器.如果您使用的是SQL*Plus,则可以show errors在创建PL/SQL对象后键入以查看编译错误.
  4. 你永远不应该编写依赖于调用者能够看到输出的代码DBMS_OUTPUT.大多数应用程序都不会如此,如果您的触发器只是尝试写入DBMS_OUTPUT缓冲区,大多数应用程序都不会知道DML操作失败.

将这些项目放在一起,你可以写出类似的东西

create trigger tri_account
before insert or update
on account
for each row
begin
    IF (:new.acct_id = 2 and :new.cust_id = 23) THEN 
        raise_application_error( -20001, 'No insertion with id 2 and 23.');
    END IF; 
end;
Run Code Online (Sandbox Code Playgroud)