SQLDeveloper触发器错误报告 - ORA-00942:表或视图不存在

时间:2014-08-02 00:47:44

标签: oracle plsql database-trigger

我把这段代码放到SQL Developer的工作表中:

CREATE TRIGGER T_testDSNa
before INSERT
on testDSNa
referencing new as new
for each ROW
BEGIN
  SELECT S_testDSN.nextval INTO :NEW.SYSID FROM dual;
END;

我明白了:

Error report -
ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"
*Cause:    
*Action:

有人知道为什么吗?这已经适用于以前的3个表,直到我尝试运行DDL来创建第4个。或者,是否有更好的方法来设置自动增量PK?

2 个答案:

答案 0 :(得分:0)

问题是缺乏架构。 Oracle模式的定义:

  

数据库对象的集合,包括诸如的逻辑结构   表,视图,序列,存储过程,同义词,索引,   集群和数据库链接。模式具有用户的名称   控制它。

如果您想知道没有别名的可访问对象。你必须查看[USER_OBJECTS]。其中描述了当前用户的拥有的关系对象:

SELECT 
 OBJECT_NAME
 , OBJECT_TYPE
 , LAST_DDL_TIME
FROM USER_OBJECTS;

如果您想知道当前用户可访问的对象:

SELECT 
    OWNER
    , OBJECT_NAME
    , OBJECT_TYPE
    , LAST_DDL_TIME 
FROM ALL_OBJECTS;

在您的情况下,您需要在可用表列表中查看对象:

SELECT * FROM ALL_OBJECTS WHERE OWNER = 'USER';

您还可以更改会话以避免别名:

ALTER SESSION SET current_schema = User;

对于权限/角色视图,您可以查看:

SELECT * FROM USER_SYS_PRIVS;
SELECT * FROM USER_ROLE_PRIVS;

最后一种方法,但不是最安全的避免别名。是使用与架构同名的用户登录。

希望它可以提供帮助

答案 1 :(得分:0)

我遇到了同样的问题。 解决方案:我观察到我创建的表被双引号引起来,使它区分大小写。 因此,每次引用表格时,都需要用双引号将其括起来。

CREATE TRIGGER T_testDSNa
before INSERT
on "testDSNa"
referencing new as new
for each ROW
BEGIN
SELECT S_testDSN.nextval INTO :NEW.SYSID FROM dual;
END;

引用此链接:What exactly do quotation marks around the table name do?