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:表或视图不存在的主要内容,如果未能解决你的问题,请参考以下文章