web-dev-qa-db-ja.com

USER()とSYS_CONTEXT( 'USERENV'、 'C​​URRENT_USER')の違いは何ですか?

Oracleデータベースでは、次の違いは何ですか。

  • ユーザー()
  • sys_context( 'USERENV'、 'C​​URRENT_USER')
  • sys_context( 'USERENV'、 'SESSION_USER')

これらは、「現在のユーザー」が何であるかに関連する可能性のある値ですか?

  • sys_context( 'USERENV'、 'C​​URRENT_SCHEMA')
  • sys_context( 'USERENV'、 'AUTHENTICATED_IDENTITY')

私は特に、変更できるもの、変更できるもの、値を変更できないもの、接続タイプに基づいて異なる値を持つもの、および常にログインに使用されるスキーマであるものに興味があります。データベース。

私のほとんどのテストでは、値は常に同じです。唯一の例外は、以下を実行して「CURRENT_SCHEMA」を変更する場合です。

alter session set current_schema=<SCHEMA>

次の操作を行うと、エラーが発生します。

alter session set current_user=<USER> --even as sys/system, which is good I suppose

したがって、これらすべてに何らかのセキュリティ/ルールがあります。ただし、SESSION_USERとCURRENT_USERを使用するには、何らかの理由が必要です。また、user()はsys_context( 'USERENV'、 'C​​URRENT_USER')へのショートカットである可能性があると思いますが、この問題に関するドキュメントは見つかりませんでした。

14
Andrew Martinez

マニュアルから: http://docs.Oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825

現在の使用者

権限が現在アクティブなデータベースユーザーの名前。これは、アクティブな定義者の権利オブジェクトの所有者を反映するために、セッションの期間中に変更される場合があります。定義者の権利オブジェクトがアクティブでない場合、CURRENT_USERはSESSION_USERと同じ値を返します。ビュー定義の本文で直接使用すると、ビューを使用しているカーソルを実行しているユーザーが返されます。カーソルで使用されているビューを定義者の権利と見なしません。

SESSION_USER

ログオン時のデータベースユーザーの名前。エンタープライズユーザーの場合、スキーマを返します。他のユーザーの場合、データベースのユーザー名を返します。この値は、セッションの間ずっと同じです。

したがって、特にストアドプロシージャまたは関数でCURRENT_USERが使用されている場合、SESSION_USERとCURRENT_USERの間にisの違いがあります。

「エンタープライズユーザー」という用語の意味がわからないことを認めざるを得ません。

ところで、3つ目があります。

SESSION_USERID

ログオン時のデータベースユーザーの識別子。

15

sys_context('USERENV', 'CURRENT_SCHEMA')-現在使用されているスキーマで、すでにわかっているように、_alter session_で変更できます。

sys_context('USERENV', 'SESSION_USER')-セッションの作成中に認証に使用され、変更できないユーザー

sys_context('USERENV', 'CURRENT_USER')「session_user」によく似ています 非推奨(少なくとも 10gドキュメント によると)
(@ a_horse_with_no_nameの回答と彼が 11g docs に与えた参照に従って編集)

sys_context('USERENV', 'AUTHENTICATED_IDENTITY')-認証に使用されるIDは、「AUTHENTICATION_METHOD」に依存します。
from documentation

  • Kerberos認証のエンタープライズユーザー:Kerberosプリンシパル名
  • Kerberosで認証された外部ユーザー:Kerberosプリンシパル名。スキーマ名と同じ
  • SSL認証されたエンタープライズユーザー:ユーザーのPKI証明書のDN
  • SSL認証された外部ユーザー:ユーザーのPKI証明書のDN
  • パスワードで認証されたエンタープライズユーザー:ニックネーム。ログイン名と同じ
  • パスワード認証されたデータベースユーザー:データベースのユーザー名。スキーマ名と同じ
  • OSで認証された外部ユーザー:外部オペレーティングシステムのユーザー名
  • RADIUS/DCE認証の外部ユーザー:スキーマ名
  • DN付きプロキシ:クライアントのOracle Internet Directory DN
  • 証明書付きプロキシ:クライアントの証明書DN
  • ユーザー名を使用したプロキシ:クライアントがローカルデータベースユーザーの場合はデータベースユーザー名。クライアントがエンタープライズユーザーの場合のニックネーム。
  • パスワードファイルを使用したSYSDBA/SYSOPER:ログイン名
  • OS認証を使用するSYSDBA/SYSOPER:オペレーティングシステムのユーザー名

_user pseudo column_-わかりません、ドキュメントによると、それは_CURRENT_SCHEMA_のようだと思いますが、明らかに_CURRENT_USER_のようです

3
A.B.Cade

CURRENT_SCHEMAは、所有者を指定せずにオブジェクトに名前を付けた場合に想定されるスキーマです。たとえば、私のCURRENT_SCHEMASCOTTの場合、SELECT * FROM EMPSELECT * FROM SCOTT.EMPと同じです。デフォルトでは、最初にOracleに接続したとき、CURRENT_SCHEMAはCURRENT_USERと同じです。

ただし、SCOTTとして接続されている場合、ALTER SESSION SET CURRENT_SCHEMA=JOEを発行できます。その後、SELECT * FROM EMPを実行すると、JOE.EMPではなくSCOTT.EMPとして解釈されます。もちろん、JOE.EMPに対するSELECT特権がない場合、またはJOEEMPという名前のオブジェクトがない場合、SELECTは失敗します。

1
John Flack

PL/SQLからUSER関数を使用する場合は、考慮すべき重要な注意事項があります。私が持っているように このブログ投稿に文書化されていますSTANDARD.USER()は次のように実装されています:

_function USER return varchar2 is
c varchar2(255);
begin
    select user into c from sys.dual;
    return c;
end;
_

そのため、SQLエンジンでuserを評価することを委任します。これにより、PL/SQLからSQLへのコンテキスト切り替えが非表示になります。あなたがあまりにも頻繁にそれをしている場合、例えばトリガー内から、それは本番システムでは非常に有害であることが判明する可能性があります。 PL/SQLからUSER()を呼び出さないようにし、代わりにsys_context('USERENV', 'SESSION_USER')を使用してください。

1
Lukas Eder

USERとsys_contextの使用にはパフォーマンスの違いもあります

declare 
  v_result varchar2(100);
begin
  for i in 1..1000000 loop
  v_result := sys_context('userenv','session_user');
  end loop;
end;
/

-- 2.5s

declare 
  v_result varchar2(100);
begin
  for i in 1..1000000 loop
  v_result := user;
  end loop;
end;
/ 

-- 47s

https://svenweller.wordpress.com/2016/02/24/sequence-and-audit-columns-with-apex-5-and-12c/ および http: //www.grassroots-Oracle.com/2019/01/Oracle-user-vs-sys-context.html

0
Scott