有没有办法执行像
这样的查询select count(*) from some_table;
作为特定用户登录为数据库“超级用户”,如sys或sysadmin?
如何实现这一目标?
更新
我们有这样的条款:
where column_user_name=user
因此,数据库需要认为user
指定的当前用户是我们想要假装的用户。
答案 0 :(得分:3)
您可以,但您需要使用未记录的包来执行此操作。 dbms_sys_sql
package lets you run SQL as another user。{{3}}。这就是Application Express(APEX)在内部使用的东西。但它没有记录,所以你自己冒风险使用它。
通常,在正常的日常操作中,您不应该像SYS
那样连接到数据库。如果您是DBA(使用自己的帐户,而不是SYS
),您应该能够从任何用户的表中进行查询,因为您拥有SELECT ANY TABLE
权限。所以你应该能够运行
SELECT *
FROM some_user.some_table_name
答案 1 :(得分:3)
如果我正确理解你的问题,可以使用
alter session set current_schema = <username>;
然后运行你的陈述。
更新您的新要求(where x = USER
)无法使用此方法(正如您已经想到的那样)。但是,您可以将user
更改为sys_context('userenv', 'current_schema')
,这将返回已更改架构的名称。
答案 2 :(得分:0)
您可以使用代理用户身份验证:
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>
答案 3 :(得分:-1)
你可以使用代理: alter user order_request grant connect through system; 连接系统 [order_request] / cidw_pre