sourcecode

USER()와 SYS_CONTEXT('USERNV', 'CURRENT_USER')의 차이점은 무엇입니까?

codebag 2023. 7. 2. 19:27
반응형

USER()와 SYS_CONTEXT('USERNV', 'CURRENT_USER')의 차이점은 무엇입니까?

오라클 데이터베이스에서 다음과 같은 차이점은 무엇입니까?

  • 사용자 정의
  • sys_context('USERENV', 'CURRENT_USER')
  • sys_context('USERENV', 'SESSION_USER')

이러한 값은 '현재 사용자'가 무엇이든 상관없이 가능합니까?

  • sys_context('USERENV', 'CURRENT_SCHEMA')
  • sys_context('USERNV', 'AUTHICATED_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', '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 사이에 차이가 있습니다.

하지만 "엔터프라이즈 유저"라는 용어가 무슨 뜻인지는 잘 모른다는 것을 인정해야 합니다.

Btw: 세 번째 것이 있습니다.

세션_사용자 ID

로그온 시 데이터베이스 사용자의 식별자입니다.

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 문서에 제공한 참조에 따라 편집됨)

sys_context('USERENV', 'AUTHENTICATED_IDENTITY')인증에 사용되는 ID는 "AUTHENTICATION_METHOD"에 따라 달라집니다.
설명서에서:

  • 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

사용 시 고려해야 할 중요한 참고 사항이 있습니다.USERPL/SQL의 함수입니다.가 이 블로그 게시물에 기록한 바와 같이,STANDARD.USER()다음과 같이 구현됩니다.

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

그래서, 그것은 평가하는 것을 위임합니다.user숨겨진 PL/SQL에서 SQL로의 컨텍스트 전환으로 이어지는 SQL 엔진에서 사용할 수 있습니다.트리거 내에서 이 작업을 너무 자주 수행하는 경우 생산 시스템에서 이 작업이 상당히 손상될 수 있습니다.전화를 피하는 것이 좋습니다.USER()PL/SQL에서, 사용sys_context('USERENV', 'SESSION_USER')대신.

CURRENT_SCHEMA개체의 소유자를 지정하지 않고 개체의 이름을 지정하는 경우 가정되는 스키마입니다.예를 들어, 만약 내가CURRENT_SCHEMA이라SCOTT,그리고나서SELECT * FROM EMP와 동일합니다.SELECT * FROM SCOTT.EMP기본적으로 Oracle에 처음 연결할 때CURRENT_SCHEMACURRENT_USER와 동일합니다.

그러나, 만약 내가 다음과 같습니다.SCOTT발급 가능합니다ALTER SESSION SET CURRENT_SCHEMA=JOE그리고 나서 내가 할 때SELECT * FROM EMP라고 해석됩니다.JOE.EMP보다는SCOTT.EMP물론, 만약 내가 가지고 있지 않다면.SELECT에 대한 특권.JOE.EMP또는JOE이름이 지정된 개체가 없습니다.EMP,그SELECT실패합니다.

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 도 참조하십시오.

언급URL : https://stackoverflow.com/questions/11002746/what-is-the-difference-between-user-and-sys-contextuserenv-current-user

반응형