오라클 LOGON TRIGGER를 사용하여 특정 사용자만 파라미터 적용하기
어떤 프로그램이 사용하는 계정에 literal SQL이 과도하게 발생하는 문제가 있는데 프로그램 수정이 어려워
그 계정에 대해서만 Cursor Sharing 파라미터를 적용하려고 한다.
Cursor Sharing 파라미터는 literal SQL을 자동으로 Binding 하여 성능 개선에 도움을 준다. 하지만 안정적이지 않다거나 예측 불가능한 문제 발생 가능성.. 과 같은 이유로 사용하지 않는 것을 권고하고있다.
그래서 특정 계정에만 파라미터를 적용하는 방법을 강구하게 되었다.
그 결과 LOGON TRIGGER를 사용하여 특정 계정이 LOGON 할 시 ALTER SESSION SET PARAMETER를 수행하도록 설정해보았다.
특정 세션 LOGON 시 세션 단위로 파라미터 적용하는 트리거
CREATE TRIGGER TR_CURSOR_SHARING
AFTER LOGON ON 스키마명.SCHEMA
BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET CURSOR_SHARING = FORCE';
END;
/
스키마명으로 접속한 세션에 ALTER SESSION 문을 실행하는 트리거이다.
적용 전 확인할 사항
기존 트리거와 경합 여부 확인
기존에 해당 스키마에 대한 LOGON TRIGGER가 있다면 경합이 발생하여 트리거가 제대로 동작하지 않을 수 있으르모 기존 트리거를 확인한다.
SELECT * FROM ALL_TRIGGERS
WHERE TRIGGERING_EVENT = 'LOGON '
AND TABLE_OWNER = '스키마명'
AND BASE_OBJECT_TYPE = 'SCHEMA';
적용 결과
파라미터 세션레벨 적용 확인
해당 계정으로 접속하였을 때 CURSOR_SHARING = FORCE로 적용된 것 확인
다른 계정으로 접속하였을 때는 기존과 같이 EXACT 로 설정되어있음
파라미터 동작 확인
v$sql에서 확인 결과 기존에 litaral로 처리되던 부분(1, 2 line)이 바인딩 처리 된 것 (3 line) 확인
많은 자료를 찾아보았지만 logon 이벤트에 예제가 잘 없고, 수행 부분에서 alter parameter가 먹는건가 싶었는데 아래 블로그 예제를 빛처럼 발견했다. 감사합니다..
'ORACLE > Admin' 카테고리의 다른 글
[ORACLE] 통계정보 수집과 백업 쿼리 (2) | 2024.01.23 |
---|---|
[ORACLE] OR-expansion과 USE_CONCAT, NO_EXPAND 힌트 (0) | 2023.11.30 |
[오라클] 스키마 전체 테이블에 대한 읽기 권한 부여 (0) | 2023.10.27 |
오라클 Hash Join 원리와 use_hash 힌트 사용법 (0) | 2023.10.18 |
ORACLE JOB 등록 및 관리(DBMS_JOB) (0) | 2023.10.13 |