Вопрос:
Есть ли способ выполнить запрос типа
select count(*) from some_table;
как конкретный пользователь при входе в систему как “суперпользователь” базы данных, такой как sys или sysadmin?
Как это можно сделать?
ОБНОВИТЬ
у нас есть такие предложения:
where column_user_name=user
Таким образом, БД необходимо думать, что текущий пользователь, указанный user является пользователем, которого мы хотим притворяться.
Ответ №1
Вы можете, но для этого вам нужно будет использовать недокументированный пакет. Пакет dbms_sys_sql позволяет запускать SQL в качестве другого пользователя. Это то, что Application Express (APEX) использует внутренне. Но это недокументировано, поэтому вы будете использовать его на свой страх и риск.
В общем, вы не должны подключаться к базе данных как SYS во время обычных повседневных операций. Если вы являетесь администратором баз данных (используя собственную учетную запись, а не SYS), вы должны иметь возможность запрашивать информацию из любой пользовательской таблицы, потому что у вас есть привилегия SELECT ANY TABLE. Таким образом, вы должны иметь возможность запускать
SELECT * FROM some_user.some_table_name Ответ №2
Если я правильно понимаю ваш вопрос, это возможно с помощью
alter session set current_schema = <username>;
а затем запускает ваше выражение.
Обновление Ваше новое требование (where x = USER) не работает с этим подходом (как вы уже выяснили). Однако вы можете изменить user на sys_context(‘userenv’, ‘current_schema’), который будет возвращать имя измененной схемы.
Ответ №3
вы можете использовать прокси: изменить пользователя order_request grant connect через систему; connect system [order_request]/cidw_pre
Ответ №4
Вы можете использовать Proxy User Authentication:
SQL> CONNECT/@mytnsname AS SYSDBA Connected. SQL> CREATE USER user_impersonating IDENTIFIED BY password1; User created. SQL> CREATE USER user_being_impersonated IDENTIFIED BY password2; User created. SQL> GRANT CONNECT TO user_impersonating; Grant succeeded. SQL> GRANT CONNECT TO user_being_impersonated; Grant succeeded. SQL> ALTER USER user_being_impersonated GRANT CONNECT THROUGH user_impersonating; User altered. SQL> DISCONNECT; Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 — 64bit Production SQL> CONNECT user_impersonating[user_being_impersonated]/password1@mytnsname Connected. SQL> SELECT user FROM DUAL; USER —————————— USER_BEING_IMPERSONATED SQL> SHOW USER USER is «USER_BEING_IMPERSONATED» SQL>