Table 权限 table 使用 'altered schema' 创建

Table permissions with table created with an 'altered schema'

我有一个 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

我不知道该如何更正。我已经检查了文档和 google,但无法弄清楚我可以做些什么来纠正这个问题。 我想要一个不需要我以 SAMPLE_SCHEMA 用户身份登录数据库的解决方案。

编辑 001: 我已经计算出,如果我以 CIDBADMIN 身份登录并具有 sysdba 角色,我就能够执行授权。这解决了我的问题,但我想知道我必须授予 CIDBADMIN 哪个确切权限以允许它执行此操作并消除以 sysdba 身份登录的需要。

可能会solution from mustaccio帮助你...

您没有具体说明您已经授予了哪些角色和权限,但是如果 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;

...您也可以尝试原来的 table 授权步骤,但您所显示的内容会出现不同的错误:

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)。

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

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)。