使用“已更改的架构”创建的表的表权限

时间:2016-08-27 21:26:59

标签: database oracle oracle12c

我有一个12c oracle数据库。我有一个名为CIDBADMIN的管理员用户。 我使用此用户登录数据库并将对象等安装到SAMPLE_SCHEMA中。

以下代码:

WHENEVER SQLERROR EXIT SQL.SQLCODE;
SET SERVEROUTPUT on;
ALTER SESSION SET CURRENT_SCHEMA=SAMPLE_SCHEMA;

create table TESTTBL ("some_field" VARCHAR2(1024) NOT NULL);

grant all on TESTTBL to CIDBADMIN;

给出错误:

Error starting at line : 7 in command -
grant all on TESTTBL to CIDBADMIN
Error report -
SQL Error: ORA-01929: no privileges to GRANT
01929. 00000 -  "no privileges to GRANT"
*Cause:    "ALL" was specified but the user doesn't have any privileges
           with the grant option.
*Action:   Don't grant privileges on that object.
Commit

我不确定如何纠正这个问题。我已经检查了文档和谷歌,无法解决我能做些什么来纠正这个问题。 我想要一个不需要我以SAMPLE_SCHEMA用户身份登录数据库的解决方案。

编辑001: 我已经知道,如果我以as sysdba角色作为CIDBADMIN登录,我就可以执行授权。这解决了我的问题,但我想知道我必须授予CIDBADMIN哪个确切权限才能允许它执行此操作并且无需以sysdba身份登录。

2 个答案:

答案 0 :(得分:1)

您还没有具体说明您已授予的角色和权限,但如果create table正在运作,那么您可能必须至少完成:

DBA> grant create any table to CIDBADMIN;

然后你会看到你已经表现出的行为:

SQL> ALTER SESSION SET CURRENT_SCHEMA=SAMPLE_SCHEMA;

Session altered.

SQL> create table TESTTBL ("some_field" VARCHAR2(1024) NOT NULL);

Table created.

SQL> grant all on TESTTBL to CIDBADMIN;
grant all on TESTTBL to CIDBADMIN
             *
ERROR at line 1:
ORA-01929: no privileges to GRANT

如果您向管理员用户授予grant any object privileges权限:

DBA> grant grant any object privilege to CIDBADMIN;

...您也可以尝试原始的表格授予步骤,但您所显示的内容会有不同的错误:

SQL> grant all on TESTTBL to CIDBADMIN;
grant all on TESTTBL to CIDBADMIN
                        *
ERROR at line 1:
ORA-01749: you may not GRANT/REVOKE privileges to/from yourself

据我所知,除非 - 正如您所发现的那样 - 除非 - 您为用户提供DBA权限并连接as sysdba

您提到您正试图避免需要知道SAMPLE_SCHEMA帐户的密码 - 否则您可以直接作为架构所有者进行连接并创建该架构中需要的任何内容。您可以使用proxy authentication

执行此操作
DBA> alter user SAMPLE_SCHEMA grant connect through CIDBADMIN;

然后,您可以使用CIDBADMIN的密码连接到该架构,并运行命令而无需设置current_schema

SQL> connect CIDBADMIN[SAMPLE_SCHEMA]/cidbadmin_passwd;
Connected.
SQL> show user
USER is "SAMPLE_SCHEMA"
SQL> create table TESTTBL ("some_field" VARCHAR2(1024) NOT NULL);

Table created.

SQL> grant all on TESTTBL to CIDBADMIN;

Grant succeeded.

您可以使用SQL * Plus或JDBC(包括SQL Developer)的代理身份验证。

当您再次以管理员用户身份连接时,您可以看到表格:

SQL> connect CIDBADMIN/cidbadmin_passwd;
Connected.
SQL> show user
USER is "CIDBADMIN"
SQL> select owner from all_tables where table_name = 'TESTTBL';

OWNER
------------------------------
SAMPLE_SCHEMA

SQL> select * from SAMPLE_SCHEMA.TESTTBL;

no rows selected

使用此机制,您不需要为您的CIDBADMIN用户提供您当前必须用来创建对象的任何强大(因此也是危险的)权限。单个架构所有者确实需要必要的权限来创建自己的对象(例如create table)。

答案 1 :(得分:0)

可能solution来自mustaccio帮助您......