2014-09-18 3 views
0

오라클에 대한 kill_inactive 세션 저장 프로 시저를 작성하고 싶습니다. 이전오라클 비활성 세션 저장 프로 시저

create or replace procedure kill_inactive_sessions as 
begin 
for rec in (select sid, serial# from sys.v_$session where status = 'INACTIVE') 
loop 
    execute immediate 'alter system kill session '''|| rec.sid || ',' || rec.serial# || ''' IMMEDIATE'; 
end loop; 
end kill_inactive_sessions; 

같은
뭔가 (테이블 또는 뷰가 존재하지 않습니다) 작동하지 않습니다.
그러나 선택 다음은 동일한 사용자에 대해 완벽하게 작동된다

select sid, serial# from sys.v_$session where status = 'INACTIVE'; 

나는 무엇을 누락?

+1

먼저 "작동하지 않음"을 정의하십시오. 오류가 발생합니까? 어떤 오류입니까? 당신이 기대하는 일을하지 않습니까? 둘째로, 왜 지구상에서 이것을하고 싶습니까? 대부분의 세션이 대다수의 시간 동안 비활성화되어 있다는 것을 알고 있습니까? 특정 순간에 SQL 문을 실행하지 않는 모든 세션이 종료됩니다. 방대한 수의 사용자가 오류를 일으켜 즉시 다시 로그인 할 수 있습니다. –

+0

사용자 연결 수가 제한됩니다. 나는 꽤 괜찮은 응용 프로그램을 종료 한 후에 세션의 대부분을 사용하지 않을 것이라고 확신합니다 (단위 테스트를 실행 한 후 응용 프로그램이 종료 됨). 그래서 더 이상 사용하지 않을 세션을 무료로 시도하고 있습니다. –

+0

"사용자 연결 수에 제한이 있습니까?" 일종의 데이터베이스 한도를 말하는 겁니까? 귀하의 응용 프로그램은 3 계층 응용 프로그램이라고 가정하므로 "비 정상 종료"는 응용 프로그램 서버가 손상되었음을 의미합니다. 일반적으로 데이터베이스의 연결이 끊어지는 것을 감지하여 데이터베이스가 클라이언트가 더 효율적으로 종료 된 연결을 정리할 수 있도록합니다. 그러나 특정 경우에는 모든 비활성 사용자가 아니라 특정 사용자에 대해서만 세션을 종료하고 싶을 것입니다. –

답변

3

ORA-00942 : 테이블 또는 뷰가 존재하지 않습니다. 오류는 거의 확실하게 v$session보기에 대한 액세스가 직접 부여가 아닌 역할을 통해 이루어지는 것을 나타냅니다.

정의 자 권한 저장 프로 시저를 작성하려면 프로 시저 소유자가 역할을 통하지 않고 사용자에게 직접 부여 된 필요한 권한을 가져야합니다 (그리고 DBA은 또 다른 역할 임). 대부분 세션에서 역할을 사용하지 않으면 절차 외의 SELECT 문이 작동하지 않습니다. SQL * Plus에서 예를 들어

SQL> set role none; 
SQL> select sid, serial# from sys.v_$session where status = 'INACTIVE'; 

과 같은 ORA-00942 오류가 발생할 수 있습니다. 이를 가정하면 저장 프로시 듀어 권한을 직접 소유하는 사용자에게 권한을 부여해야합니다. 예를

GRANT SELECT ANY DICTIONARY 
    TO user_that_owns_the_procedure; 

를 들어 같은 일이 또한 구축하고 실행하는 ALTER SYSTEM 명령에 적용됩니다. 스토어드 프로 시저의 소유자는 역할을 통하지 않고 직접 권한 부여를 통해 해당 명령을 실행하는 특권이 있어야합니다.

모든 비활성 세션을 종료하는 절차는 매우 문제가됩니다. 세션의 대다수는 대다수의 시간 동안 비활성화 될 것입니다. 그것이 그들이 죽어야한다는 것을 의미하지는 않습니다. 응용 프로그램 서버가 손상된 후에 정리하는 경우에도 일부 추가 조건자를 적용해야합니다 (예 : 응용 프로그램 서버가 손상되기 전에 설정된 특정 사용자로 로그인 한 특정 컴퓨터의 세션 찾기) . 장기적으로는 클라이언트 프로세스가 예기치 않게 종료 될 때 데이터베이스가 자동으로 닫는 세션을 처리 할 수 ​​있도록 enabling dead connection detection을 제안합니다.