0

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

4

2 回答 2

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;

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

希望能有所帮助

于 2014-08-02T20:14:32.773 回答
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;

请参考此链接:表名周围的引号到底有什么作用?

于 2019-01-08T12:08:52.453 回答