【问题标题】:Table permissions with table created with an 'altered schema'使用“更改的架构”创建的表的表权限
【发布时间】:2016-08-27 21:26:59
【问题描述】:

我有一个 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: 我发现如果我以 CIDBADMIN 身份并以 sysdba 角色登录,我就能够执行授权。这解决了我的问题,但我想知道我必须授予 CIDBADMIN 哪些确切权限才能允许它执行此操作并消除以 sysdba 身份登录的需要。

【问题讨论】:

  • 您的“管理员”用户已经拥有哪些角色和权限?
  • 虽然你改变了用户没有改变的模式。这意味着您正在 sample_schema cidbadmin 用户中创建表。并且您不得授予/撤销您自己的特权。因此,在创建对象后,您必须以sample_schama 身份连接,然后才能将对象权限授予cidbadmin 用户。
  • Alex,我可以授予管理员用户任何我需要的权限。我已经给了它一大笔钱。我只需要知道它需要哪个。 Jaapkota,我不希望我的 ci 机器需要访问所有模式的所有密码,因此以 sample_schema 连接不是一个好的解决方案

标签: database oracle oracle12c


【解决方案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)。

【讨论】:

    【解决方案2】:

    可能是solution 来自mustaccio 帮助你...

    【讨论】:

    • 仅链接的答案并没有得到真正的认可,即使对于本网站上的其他问题也是如此。如果问题实际上是相同的,那么这个问题可以被标记/关闭为重复。但不一样;该答案与动态 SQL 中的角色有关,该问题未在此问题中使用。
    猜你喜欢
    • 1970-01-01
    • 2012-01-10
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多