oracle中,用pl/sql创建触发器报触发器无效且未通过重新验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中,用pl/sql创建触发器报触发器无效且未通过重新验证相关的知识,希望对你有一定的参考价值。

create or replace trigger trig_del_department
after delete on dept
for each row
begin
if deleting then
delete from emp where deptno=:old.deptno;
end if;
end;
/
总是报触发器无效且未通过重新验证,但是在dos下面的sqlplus中却提示创建成功,能运行,这是为什么,注:pl/sql应该是已经连接上数据库的,因为在里面运行select * from emp是可以的

一般情况就是触发器的语法不正确。

触发器的一般语法如下:

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;
参考技术A

首先检查下你登录的user和数据库是否一样。如果是一样的话,再检验该用户对dept的操作权限。最后你试着注释一些代码在运行看看,例如下面的代码:

create or replace trigger trig_del_department
after delete on dept
for each row
  begin
    if deleting then
      --delete from emp where deptno=:old.deptno;
      null;
    end if;
  end;

慢慢的排查错误。

本回答被提问者采纳

为啥在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误?

【中文标题】为啥在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误?【英文标题】:Why do I get the "bad bind variable" error when trying to create an INSTEAD OF trigger in PL/SQL Oracle?为什么在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误? 【发布时间】:2019-12-01 18:20:20 【问题描述】:

我有这 4 张桌子:

Suppliers( id_sup, name, city)

Products (id_prod, name, city)

Companies (id_co, name, city)

Deliveries (id_sup, id_prod, id_co)

我为 Deliveries 创建了一个名为“v_deliveries”的视图,并且我想创建一个代替触发器,以便如果有人尝试在视图中插入数据,它实际上会将其添加到 Deliveries 表中。这是我尝试过的:

CREATE OR REPLACE TRIGGER new_deliv_trigg
INSTEAD OF INSERT ON v_deliveries FOR EACH ROW
BEGIN
INSERT INTO Deliveries (id_sup, id_prod, id_co)
VALUES (:NEW.id_sup, :NEW.id_prod, :NEW.id_co);
End; 

【问题讨论】:

【参考方案1】:

您真正使用哪个数据库?因为,对于 Oracle,它可以正常工作:

SQL> create table deliveries (id_sup number, id_prod number, id_co number);

Table created.

SQL> create or replace view v_deliveries as select * From deliveries;

View created.

SQL>
SQL> CREATE OR REPLACE TRIGGER new_deliv_trigg
  2  INSTEAD OF INSERT ON v_deliveries FOR EACH ROW
  3  BEGIN
  4  INSERT INTO Deliveries (id_sup, id_prod, id_co)
  5  VALUES (:NEW.id_sup, :NEW.id_prod, :NEW.id_co);
  6  End;
  7  /

Trigger created.

SQL>

【讨论】:

谢谢!我发现我的错误在哪里。我的视图有不同的列名

以上是关于oracle中,用pl/sql创建触发器报触发器无效且未通过重新验证的主要内容,如果未能解决你的问题,请参考以下文章

一个存储过程,报错如下 13 PL/SQL:ORA-00922:缺少或无效选项 13 PL/SQL:SQL Statement ignored

pl/sql 连接数据库报错。initialization error oracle client not properly installed

使用pl/sql的导入表工具导入dmp文件时,导入报错:遇到ORACLE错误 12546,请问怎么解决阿

window 7 系统下 ,PL/SQL 连接Oracle11g 失败。

oracle 10g问题:tnsname.ora到底怎么 配置?是否因为它配置不对,导致PL/SQL不能用,如图:.

为啥在 PL/SQL Oracle 中尝试创建 INSTEAD OF 触发器时出现“错误的绑定变量”错误?