Oracleデータベースでは、次の違いは何ですか。
これらは、「現在のユーザー」が何であるかに関連する可能性のある値ですか?
私は特に、変更できるもの、変更できるもの、値を変更できないもの、接続タイプに基づいて異なる値を持つもの、および常にログインに使用されるスキーマであるものに興味があります。データベース。
私のほとんどのテストでは、値は常に同じです。唯一の例外は、以下を実行して「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'、 'CURRENT_USER')へのショートカットである可能性があると思いますが、この問題に関するドキュメントは見つかりませんでした。
マニュアルから: http://docs.Oracle.com/cd/E11882_01/server.112/e26088/functions184.htm#SQLRF51825
権限が現在アクティブなデータベースユーザーの名前。これは、アクティブな定義者の権利オブジェクトの所有者を反映するために、セッションの期間中に変更される場合があります。定義者の権利オブジェクトがアクティブでない場合、CURRENT_USERはSESSION_USERと同じ値を返します。ビュー定義の本文で直接使用すると、ビューを使用しているカーソルを実行しているユーザーが返されます。カーソルで使用されているビューを定義者の権利と見なしません。
ログオン時のデータベースユーザーの名前。エンタープライズユーザーの場合、スキーマを返します。他のユーザーの場合、データベースのユーザー名を返します。この値は、セッションの間ずっと同じです。
したがって、特にストアドプロシージャまたは関数でCURRENT_USERが使用されている場合、SESSION_USERとCURRENT_USERの間にisの違いがあります。
「エンタープライズユーザー」という用語の意味がわからないことを認めざるを得ません。
ところで、3つ目があります。
ログオン時のデータベースユーザーの識別子。
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
_のようです
CURRENT_SCHEMA
は、所有者を指定せずにオブジェクトに名前を付けた場合に想定されるスキーマです。たとえば、私のCURRENT_SCHEMA
がSCOTT
の場合、SELECT * FROM EMP
はSELECT * 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
特権がない場合、またはJOE
にEMP
という名前のオブジェクトがない場合、SELECT
は失敗します。
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')
を使用してください。
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