본문 바로가기

ORACLE/Admin

[ORALCE] 특정 사용자만 파라미터 적용하기(LOGON TRIGGER)

728x90
반응형

오라클 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가 먹는건가 싶었는데 아래 블로그 예제를 빛처럼 발견했다. 감사합니다..

 

[오라클] Logon Trigger 예제

CREATE OR REPLACE TRIGGER USER_TRACE_TRG AFTER LOGON ON DATABASE BEGIN IF USER = '&USER_ID' THEN execute immediate 'alter session set events ''10046 trace name context forever, level 12'''; END IF; EXCEPTION WHEN OTHERS THEN NULL; END; / CREATE OR REPLACE

dev4u.tistory.com

 

728x90
반응형