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

Posted

技术标签:

【中文标题】SQLDeveloper 触发器错误报告 - ORA-00942:表或视图不存在【英文标题】:SQLDeveloper Trigger Error report - ORA-00942: table or view does not exist 【发布时间】:2014-08-02 00:47:44 【问题描述】:

我将此代码放入 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:

有人知道为什么吗?在我尝试运行 DDL 来创建第 4 个之前,这适用于 3 个之前的表。或者,有没有更好的方法来设置自动递增的 PK?

【问题讨论】:

您忘记创建 testDSNa 表了吗? 不,我已经创建了它,我可以从中插入和删除。但是,运行 Select * from testDSNa;也不起作用。同样的错误。 那么该表实际上并没有像您想象的那样命名。是否有可能在创建表名时用双引号括起来,将其变成区分大小写的标识符 (***.com/questions/563090/…)?如果是这样,每次引用表名时都需要用双引号括起来(这是不赞成区分大小写的标识符的原因之一)。 你能把你用的CREATE TABLE脚本贴出来吗? 嗯,所以我在这里的另一篇文章中读到了一些奇怪的东西,我尝试只输入“User”。“testDSNa”而不是只输入 testDSNa,突然一切都恢复了。为什么会这样? (用户=数据库的名称,所以我认为它可能与testDSNa的规范有关,有点像Java有java.lang.*blah*) 【参考方案1】:

问题是缺少架构。 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;

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

希望对你有帮助

【讨论】:

【参考方案2】:

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

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?

【讨论】:

以上是关于SQLDeveloper 触发器错误报告 - ORA-00942:表或视图不存在的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别