【问题标题】:Can't access Oracle SQL Table无法访问 Oracle SQL 表
【发布时间】:2013-12-02 05:49:13
【问题描述】:

我正在使用 Oracle 数据库并尝试添加表,但不幸的是我没有对数据库的完全访问权限,我创建了表创建脚本并在本地运行它没有任何问题(我可以选择、插入、删除等),通过相同的脚本在远程服务器上运行后,我得到了日志,说没有错误。但是我无法访问我的新表。

我可以使用

查看表格
SELECT *
FROM all_tables 
WHERE table_name = '[my New Table]'

但是当我运行时

SELECT * 
FROM [my New Table]

我收到一个错误:[Oracle]ORA-00942:表或视图不存在。我认为这是权限问题,但我的代码找不到任何错误

GRANT SELECT, UPDATE, DELETE, INSERT ON "[USER WHO CREATES THE TABLE]"."[my New Table]" to [MY_ROLE];

下面是SQL执行代码:

PROMPT Connecting as the application schema owner [owner] to &&dbname
ACCEPT ownerpassword char format [format] prompt "Please enter [owner] password: " hide
CONNECT [owner]/&ownerpassword@&&dbname

@@pr_dr_all.sql --(drops table if exists)
@@pr_cr_tables_tso_tcom.sql --(creates the table)
@@pr_gr_tso_tcom.sql --(sets grants)
@@pr_cr_constraints_tso_tcom.sql --(sets constraints)

PROMPT Connecting as the application user [user] to &&dbname
ACCEPT userpassword char format [format] prompt "Please enter [user] password: " hide 
CONNECT [user]/&userpassword@&&dbname

@@pr_dr_syn.sql --(drops synonyms)
@@pr_cr_syn_tso_tcom.sql --(creates synonyms)

spool off

pr_cr_tables_tso_tcom.sq:

CREATE TABLE "[owner]"."[table name]"
  (
    "[column 1]" NUMBER NOT NULL ENABLE,
    "[column 2]" NUMBER,
    "[column 3]" VARCHAR2(200 BYTE),
    "[column 4]" VARCHAR2(200 BYTE),
    "[column 5]" NUMBER,
    "[column 6]" NUMBER
  )
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING STORAGE
  (
    INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT
  )
  TABLESPACE "USERS" ;

  CREATE SEQUENCE  [owner]."[table name]_SEQ"  MINVALUE 1 MAXVALUE 99999999999999999999 INCREMENT BY 1 START WITH 81 CACHE 20 NOORDER  NOCYCLE ;

    CREATE OR REPLACE TRIGGER "[owner]"."[table name]_TRG" BEFORE
      INSERT ON [table name] FOR EACH ROW WHEN (NEW.ID IS NULL) BEGIN
      SELECT [table name]_SEQ.NEXTVAL INTO :NEW.ID FROM DUAL;
    END;
    /
    ALTER TRIGGER "[owner]"."[table name]_TRG" ENABLE;

pr_gr_tso_tcom.sql

GRANT SELECT, UPDATE, DELETE, INSERT ON "[owner]"."[table name]" to [role];
GRANT SELECT ON "[owner]"."[table name]_SEQ"  to [role];

pr_cr_syn_tso_tcom.sql

CREATE SYNONYM [table name]_SYN FOR "[owner]"."[table name]";
CREATE SYNONYM [table name]_SEQ_SYN FOR "[owner]"."[table name]_SEQ";

【问题讨论】:

  • 你到底遇到了什么错误??
  • 请您的 DBA 授予您创建表的权限。
  • @Rony - 更新后出现错误“[Oracle]ORA-00942:表或视图不存在”
  • @Rachcha - 不幸的是,这不是一个选择。
  • 当您从新表查询(并限定所有者)并确保您使用的数据库用户已被授予已被授予选择表权限的角色时,您是否确认了会话上下文?

标签: sql oracle insert


【解决方案1】:

在任何情况下,您都必须为创建表设置架构,插入 .... 如果不是,oracle 将选择默认模式。

首先确保您的表在正确的架构中创建,联系他们并询问架构。如果您没有设置架构,那么他们可能在其他架构中创建,

如果你只是给他们一个 sql 文件,然后他们用 sqlplus 或其他工具运行它,那么出错的可能性就更大了。

使用以下行开始您的 sql 文件:

alter session set current_schema=PUTSchemaNameHere;

spool /folder/NameOfLog.log
set termout off
set echo on 
set feedback on 
set timing on 
set define off

上面的代码将在指定文件夹中生成一个具有所需名称的日志,因此如果出现任何错误,您可以追溯错误。 (或确保已创建表)

如果您一一传递命令,请确保将架构放在表名、过程名......之前。

例如,以下命令将在所需架构中创建一个表

create table PutSchemaNameHere.TableName (column1 number,column2 varchar2(50));

【讨论】:

  • 感谢您的帖子。我已经用使用的代码更新了我的问题,据我所知,架构已设置并用于表创建。
【解决方案2】:

如果您尝试从与表所在的不同架构运行查询,则需要在表名前加上架构前缀,例如

SELECT * FROM [schema that table is located on].[my New Table]

否则,您可以为表名创建同义词。

【讨论】:

  • 谢谢,这行得通!我以为我已经尝试过了。通常我不需要这样做,这是否意味着我的同义词有问题?
  • 我显然看不到您的同义词的状态,但您可以使用以下命令检查它们:select * from all_synonyms
  • 谢谢,我的同义词是问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-30
  • 1970-01-01
  • 2017-09-11
  • 2012-10-16
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多