2016-08-27 2 views
0

Ich habe eine 12c Oracle-Datenbank. Ich habe einen Admin-Benutzer namens CIDBADMIN. Ich benutze diesen Benutzer, um sich bei der Datenbank anzumelden und Objekte usw. in SAMPLE_SCHEMA zu installieren.Tabellenberechtigungen mit Tabelle, die mit einem 'geänderten Schema' erstellt wurde

Der folgende Code:

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; 

Gibt den Fehler:

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 

Ich bin nicht sicher, wie ich das korrigieren sollte. Ich habe die Dokumentation überprüft und google und kann nicht herausfinden, was ich tun kann, um dies zu korrigieren. Ich möchte eine Lösung, bei der ich mich nicht als SAMPLE_SCHEMA-Benutzer bei der Datenbank anmelden muss.

Edit 001: Ich habe herausgefunden, dass ich, wenn ich mich als CIDBADMIN mit als sysdba Rolle anmelde, in der Lage bin, das Grant auszuführen. Dies löst mein Problem, aber ich würde gerne wissen, welche genaue Berechtigung ich CIDBADMIN gewähren muss, um dies zu ermöglichen und die Notwendigkeit, sich als sysdba anzumelden, zu beseitigen.

+0

Welche Rollen und Privilegien hat Ihr 'admin' Benutzer bereits? –

+0

Obwohl Sie das Schema geändert haben, hat sich der Benutzer nicht geändert. Das heißt, Sie erstellen eine Tabelle im 'sample_schema'' cidbadmin' Benutzer. Und du darfst dir keine Privilegien gewähren/entziehen. Nachdem Sie das Objekt erstellt haben, müssen Sie sich als 'sample_schama' verbinden und dann dem Benutzer' cidbadmin' die Objektrechte erteilen. – JSapkota

+0

Alex, ich kann dem Admin-Benutzer jedes Privileg gewähren, das ich brauche. Ich habe es schon eine riesige Menge bewilligt. Ich muss nur wissen, was es dafür braucht. Jaapkota, ich möchte nicht, dass meine ci-Maschine Zugang zu allen Passwörtern für alle Schemas benötigt, also ist das Verbinden als sample_schema keine gute Lösung – Robert3452

Antwort

1

Sie haben nicht specificed, welche Rollen und Privilegien haben Sie bereits erteilt, aber wenn der create table funktioniert dann vermutlich müssen Sie mindestens haben getan:

DBA> grant create any table to CIDBADMIN; 

dann sehen Sie das Verhalten, das Sie gezeigt haben:

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 

Wenn Sie diegewähren 210 Privileg zu Ihrem Admin-Benutzer:

DBA> grant grant any object privilege to CIDBADMIN; 

... können Sie Ihren ursprünglichen Tabelle Zuschuss Schritt versuchen, aber was du hast bekommt gezeigt einen anderen Fehler:

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 

Soweit ich Ich bin mir bewusst, dass es keinen Ausweg gibt, es sei denn, Sie geben Ihrem Benutzer, wie Sie herausgefunden haben, DBA-Privilegien und verbinden Sie as sysdba.

Sie erwähnten, dass Sie versuchen, das Kennwort für das Konto SAMPLE_SCHEMA nicht kennen zu müssen - andernfalls könnten Sie einfach direkt als Schemaeigner eine Verbindung herstellen und das erstellen, was in diesem Schema enthalten sein muss. Sie können das tun mit proxy authentication:

DBA> alter user SAMPLE_SCHEMA grant connect through CIDBADMIN; 

Dann können Sie in diesem Schema verbinden, CIDBADMIN das Passwort verwenden, und die Befehle ausführen, ohne current_schema zu setzen zu benötigen:

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. 

Sie können Proxy-Authentifizierung von SQL * Plus oder über JDBC (einschließlich von SQL Developer).

Und wenn Sie als Admin-Benutzer eine Verbindung wieder können Sie die Tabelle sehen:

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 

Mit diesem Mechanismus Sie geben müssen Benutzer nicht Ihre CIDBADMIN jede der mächtigen (und daher gefährlich) Privilegien Sie müssen derzeit Objekte erstellen. Die einzelnen Schema-Besitzer benötigen jedoch die erforderlichen Berechtigungen, um ihre eigenen Objekte (z. B. create table) zu erstellen.

0

sein kann solution von mustaccio helfen Ihnen ...

+0

Link-only Antworten sind nicht wirklich genehmigt, sogar zu anderen Fragen auf dieser Seite. Wenn das Problem tatsächlich identisch war, könnte diese Frage als Duplikat markiert/geschlossen werden. Aber es ist nicht dasselbe; Diese Antwort bezieht sich auf die Rolle in dynamischem SQL, die in dieser Frage nicht verwendet wird. –

Verwandte Themen