Такой пользователь уже существует; он называется SYS
, которому принадлежит база данных. Тем не менее, не очень хорошая идея использовать его для повседневной работы - вы бы предпочли (как вы хотели) создать своего собственного «суперпользователя», который способен делать такие вещи. Например:
SQL> connect sys as sysdba
Enter password:
Connected.
SQL> create user superuser identified by superman;
User created.
SQL> grant dba to superuser;
Grant succeeded.
ОК, давайте попробуем:
SQL> connect superuser/superman
Connected.
SQL> select count(*) From scott.emp;
COUNT(*)
----------
14
SQL> select table_name from dba_tables where owner = 'MIKE';
TABLE_NAME
------------------------------
EMP
DEPT
BONUS
SALGRADE
DUMMY
ABC
6 rows selected.
SQL> select * from mike.abc;
KEY ID SEQ THINGS DESCR
---------- ---------- ---------- ---------- ----------
1 1 0 Food Chicken
2 1 1 Cars BMW
3 1 2 Sport Soccer
4 2 0 Food Mutton
5 2 1 Cars Ford
6 2 2 Sport Tennis
6 rows selected.
SQL>
Теперь, DBA
правильная роль для этого пользователя, я не могу сказать. Возможно, это не так, поэтому, возможно, вы бы предпочли предоставить только необходимый набор привилегий. Какой это набор, я не могу сказать ни того, ни другого.
Может быть, этого будет достаточно, например, предоставить select
привилегии superuser
для schema1
и schema2
пользовательских таблиц. Однако вы не можете сделать это в одной команде - вам придется делать это отдельно для каждого пользователя и для каждой из его таблиц (что означает много из grant select
операторов). Давайте попробуем это:
SQL> connect sys as sysdba
Enter password:
Connected.
SQL> revoke dba from superuser;
Revoke succeeded.
SQL>
Это скучное написание заявления за оператором, поэтому я напишу код для написания кода для меня:
SQL> select 'grant select on ' || owner ||'.' ||table_name || ' to superuser;' str
2 from dba_tables
3 where owner in ('SCOTT', 'MIKE')
4 order by owner, table_name;
STR
--------------------------------------------------------------------------------
grant select on MIKE.ABC to superuser;
grant select on MIKE.BONUS to superuser;
grant select on MIKE.DEPT to superuser;
<snip>
grant select on SCOTT.TEST_B to superuser;
grant select on SCOTT.TEST_D to superuser;
26 rows selected.
SQL>
OK; Теперь скопируйте / вставьте вышеупомянутые операторы grant
и запустите их.
SQL> grant select on MIKE.ABC to superuser;
Grant succeeded.
SQL> grant select on MIKE.BONUS to superuser;
Grant succeeded.
SQL> grant select on MIKE.DEPT to superuser;
Grant succeeded.
<snip>
SQL> grant select on SCOTT.TEST_B to superuser;
Grant succeeded.
SQL> grant select on SCOTT.TEST_D to superuser;
Grant succeeded.
SQL>
Работает ли это?
SQL> connect superuser/superman
ERROR:
ORA-01045: user SUPERUSER lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
SQL>
Ага! Не только пока! Отмена DBA
отозвала большой набор привилегий, поэтому superuser
теперь существует как пользователь, но ничего не может сделать. Итак, давайте подключим его к базе данных:
SQL> connect sys as sysdba
Enter password:
Connected.
SQL> grant create session to superuser;
Grant succeeded.
SQL> connect superuser/superman
Connected.
SQL> select * From scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select * From mike.abc;
KEY ID SEQ THINGS DESCR
---------- ---------- ---------- ---------- ----------
1 1 0 Food Chicken
2 1 1 Cars BMW
3 1 2 Sport Soccer
4 2 0 Food Mutton
5 2 1 Cars Ford
6 2 2 Sport Tennis
6 rows selected.
SQL>
Right; намного лучше. Это то, что я имел в виду, говоря «предоставить только необходимый набор привилегий»; не предоставляйте больше привилегий, чем кому-то действительно нужно.