1. SYS_CONTEXT 함수란?
SYS_CONTEXT 함수는 Oracle에서 사용자의 세션, 네트워크, 인증 등의 환경 정보를 동적으로 조회할 수 있도록 해주는 내장 함수입니다. 주로 보안 감사, 사용자 추적, 커스터마이징 된 트리거나 정책 기반 제어 로직을 구현할 때 활용됩니다.
기본 문법:
SYS_CONTEXT('namespace', 'parameter' [, length])
- namespace: 컨텍스트 영역 이름 (주로 'USERENV')
- parameter: 조회할 항목명 (예: 'SESSION_USER')
- length: 반환 문자열의 최대 길이 (생략 가능)
2. USERENV 콘텍스트의 주요 파라미터
가장 널리 사용되는 namespace는 'USERENV'입니다. 다음은 주요 파라미터 목록입니다.
파라미터 | 설명 |
---|---|
SESSION_USER | 세션을 시작한 사용자 |
OS_USER | 운영체제 사용자 |
HOST | 접속한 클라이언트 호스트 이름 |
IP_ADDRESS | 클라이언트 IP 주소 |
AUTHENTICATED_IDENTITY | 실제 인증된 사용자 |
LANGUAGE | 세션의 언어 및 국가 정보 |
TERMINAL | 사용자의 터미널 또는 클라이언트 식별자 |
3. 기본 사용 예제
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') AS session_user,
SYS_CONTEXT('USERENV', 'OS_USER') AS os_user,
SYS_CONTEXT('USERENV', 'IP_ADDRESS') AS ip
FROM DUAL;
위 쿼리는 현재 접속한 유저의 데이터베이스 사용자명, OS 계정, IP 주소를 반환합니다.
4. SYS_CONTEXT 함수 실무 활용 예시
4-1. 트리거에서 데이터 변경자 추적
CREATE OR REPLACE TRIGGER trg_audit_product
BEFORE UPDATE ON PRODUCT
FOR EACH ROW
BEGIN
INSERT INTO AUDIT_LOG(product_id, updated_by, updated_ip, updated_at)
VALUES(:OLD.PRODUCT_ID,
SYS_CONTEXT('USERENV', 'SESSION_USER'),
SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
SYSDATE);
END;
4-2. 보안 정책 제어 (예: IP 차단)
BEGIN
IF SYS_CONTEXT('USERENV', 'IP_ADDRESS') = '192.168.0.100' THEN
RAISE_APPLICATION_ERROR(-20001, '허용되지 않은 IP입니다.');
END IF;
END;
4-3. 보고서나 로그에 사용자 환경정보 삽입
SELECT ORDER_ID, AMOUNT,
SYS_CONTEXT('USERENV', 'SESSION_USER') AS 조회자,
SYSDATE AS 조회일자
FROM ORDERS;
5. SYS_CONTEXT vs CURRENT_USER vs USER 비교
항목 | 설명 |
---|---|
SYS_CONTEXT('USERENV', 'SESSION_USER') | 세션 시작 시의 사용자 |
SYS_CONTEXT('USERENV', 'CURRENT_USER') | 현재 실행 중인 컨텍스트의 사용자 (권한 계승 포함) |
USER | SQL을 실행한 사용자 (가장 간단한 표현) |
6. 주의사항 및 팁
- SYS_CONTEXT는 SELECT 절, WHERE 절, PL/SQL 블록 어디서든 사용 가능
- 길이 제한이 필요한 경우 세 번째 인자로 문자열 길이 설정 가능
- USERENV 외에도 'CLIENT_IDENTIFIER', 'AUTHENTICATION_TYPE' 등 다양하게 활용
- 실제 적용 전 테스트 환경에서 값 확인 필수 (접속 경로에 따라 다르게 나올 수 있음)
7. 결론
Oracle의 SYS_CONTEXT 함수는 세션, 사용자, 환경 정보를 조회하는 데 매우 유용하며, 보안 감사, 트리거 로깅, 사용자 맞춤 로직 구현에 필수적인 함수입니다. 특히 ‘USERENV’ 네임스페이스를 통해 다양한 시스템 레벨 정보를 실시간으로 확인하고 조건 분기를 설정할 수 있어 실무 적용성이 뛰어납니다. 개발자는 다양한 파라미터를 숙지하고, 적절한 시점에 활용하는 전략을 익혀야 합니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/
- Oracle SQL Language Reference: SYS_CONTEXT Function
- 실무 경험 기반 예제 및 테스트 환경 검증
'Database' 카테고리의 다른 글
[ORACLE] UID() 함수로 사용자 추적 로직 구현하기 (0) | 2025.06.07 |
---|---|
[ORACLE] USERENV() 함수로 접속 정보와 세션 상태 추적하기 (0) | 2025.06.07 |
[ORACLE] CASE() 함수 사용법과 DECODE, IF-ELSE와의 차이점 비교 (0) | 2025.06.07 |
[ORACLE] DECODE() 함수로 IF-ELSE 로직을 SQL에서 구현하는 방법 (0) | 2025.06.07 |
[ORACLE] COALESCE() 함수로 복잡한 CASE 문 없이 NULL 처리하기 (0) | 2025.06.07 |