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
사용 시 고려해야 할 중요한 참고 사항이 있습니다.USER
PL/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_SCHEMA
CURRENT_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
'sourcecode' 카테고리의 다른 글
프로그래밍 방식으로 발사 버튼 클릭 이벤트? (0) | 2023.07.02 |
---|---|
도커 구성: mariadb - 연결이 거부됨 (0) | 2023.07.02 |
mongodb는 뚜렷한 기록을 얻습니다. (0) | 2023.07.02 |
Gitstash 팝업 - 필요 병합, 인덱스를 새로 고칠 수 없습니다. (0) | 2023.07.02 |
차단 응용프로그램 설계에서 Spring Webflux의 WebClient를 사용하면 RestTemplate보다 리소스를 더 많이 사용합니까? (0) | 2023.07.02 |